Recebendo dados em um driver de filtro

Os drivers de filtro podem iniciar indicações de recebimento ou filtrar indicações de recebimento de drivers subjacentes. Quando um driver de miniporto chama a função NdisMIndicateReceiveNetBufferLists , o NDIS envia a estrutura de NET_BUFFER_LIST especificada para o módulo de filtro excedente mais baixo na pilha de driver.

Receber indicações iniciadas por um driver de filtro

A figura a seguir ilustra uma indicação de recebimento iniciada por um driver de filtro.

Diagrama ilustrando uma indicação de recebimento iniciada por um driver de filtro.

Os drivers de filtro chamam a função NdisFIndicateReceiveNetBufferLists para indicar os dados recebidos. A função NdisFIndicateReceiveNetBufferLists passa a lista indicada de estruturas de NET_BUFFER_LIST até a pilha para drivers overlying. O driver de filtro aloca as estruturas de pools que ele criou durante a inicialização.

Se um driver de filtro definir o sinalizador NDIS_RECEIVE_FLAGS_RESOURCES no parâmetro ReceiveFlags de NdisFIndicateReceiveNetBufferLists, isso indicará que o driver de filtro deve recuperar a propriedade das estruturas NET_BUFFER_LIST imediatamente. Nesse caso, o NDIS não chama a função FilterReturnNetBufferLists do driver de filtro para retornar as estruturas NET_BUFFER_LIST . O driver de filtro recupera a propriedade imediatamente após o retorno de NdisFIndicateReceiveNetBufferLists .

Se um driver de filtro não definir o sinalizador NDIS_RECEIVE_FLAGS_RESOURCES no parâmetro ReceiveFlags de NdisFIndicateReceiveNetBufferLists, o NDIS retornará as estruturas de NET_BUFFER_LIST indicadas para a função FilterReturnNetBufferLists do driver de filtro. Nesse caso, o driver de filtro abre mão da propriedade das estruturas indicadas até que o NDIS as retorne para FilterReturnNetBufferLists.

Nota Um driver de filtro deve acompanhar as indicações de recebimento iniciadas e garantir que ele não chame a função NdisFReturnNetBufferLists quando a operação de recebimento for concluída.

Filtrando indicações de recebimento

A figura a seguir ilustra uma indicação de recebimento filtrada iniciada por um driver subjacente.

Diagrama ilustrando uma indicação de recebimento filtrada iniciada por um driver subjacente.

O NDIS chama a função FilterReceiveNetBufferLists de um driver de filtro para processar as indicações de recebimento provenientes de drivers subjacentes. O NDIS chama FilterReceiveNetBufferLists depois que um driver subjacente chama uma função de indicação de recebimento (por exemplo, NdisMIndicateReceiveNetBufferLists) para indicar dados de rede recebidos ou dados de loopback.

Se o sinalizador NDIS_RECEIVE_FLAGS_RESOURCES no parâmetro ReceiveFlags de FilterReceiveNetBufferLists não estiver definido, o driver de filtro manterá a propriedade das estruturas de NET_BUFFER_LIST até chamar a função NdisFReturnNetBufferLists .

Se o sinalizador NDIS_RECEIVE_FLAGS_RESOURCES no parâmetro ReceiveFlags estiver definido, o driver de filtro não poderá manter a estrutura NET_BUFFER_LIST e os recursos alocados pelo driver subjacente associados. Esse sinalizador pode indicar que o driver subjacente está com poucos recursos de recebimento. A função FilterReceiveNetBufferLists deve retornar o mais rápido possível.

Nota Se o sinalizador NDIS_RECEIVE_FLAGS_RESOURCES estiver definido, o driver de filtro deverá manter o conjunto original de estruturas NET_BUFFER_LIST na lista vinculada. Por exemplo, quando esse sinalizador é definido, o driver pode processar as estruturas e indique-as na pilha uma de cada vez, mas antes que a função retorne, ele deve restaurar a lista vinculada original.

Os drivers de filtro podem executar operações de filtro em dados recebidos antes de indicar os dados para drivers overlying. Para cada buffer enviado à função FilterReceiveNetBufferLists , um driver de filtro pode fazer o seguinte:

  • Passe-o para o próximo driver overlying chamando NdisFIndicateReceiveNetBufferLists. O driver pode modificar o conteúdo do buffer. O NDIS garante a disponibilidade do espaço de contexto (consulte NET_BUFFER_LIST_CONTEXT estrutura).

    Um driver de filtro pode alterar o status que o NDIS passou para FilterReceiveNetBufferLists ou simplesmente passá-lo para NdisFIndicateReceiveNetBufferLists.

    Nota Um driver de filtro pode passar um buffer com NdisFIndicateReceiveNetBufferLists mesmo que o NDIS defina o sinalizador NDIS_RECEIVE_FLAGS_RESOURCES no parâmetro ReceiveFlags de FilterReceiveNetBufferLists. Nesse caso, o driver de filtro não deve retornar de FilterReceiveNetBufferLists até recuperar a propriedade do buffer.

  • Descarte o buffer. Se o NDIS limpou o sinalizador NDIS_RECEIVE_FLAGS_RESOURCES no parâmetro ReceiveFlags de FilterReceiveNetBufferLists, chame a função NdisFReturnNetBufferLists para descartar o buffer. Se o NDIS definir o sinalizador NDIS_RECEIVE_FLAGS_RESOURCES no parâmetro ReceiveFlags de FilterReceiveNetBufferLists, não execute nenhuma ação e retorne de FilterReceiveNetBufferLists para descartar o buffer.

  • Enfileirar o buffer em uma estrutura de dados local para processamento posterior. Se o NDIS definir o sinalizador NDIS_RECEIVE_FLAGS_RESOURCES no parâmetro ReceiveFlags de FilterReceiveNetBufferLists, o driver de filtro deverá criar uma cópia antes de retornar de FilterReceiveNetBufferLists.

  • Copie o buffer e origine uma indicação de recebimento com a cópia. A indicação de recebimento é semelhante a uma indicação de recebimento iniciada pelo driver de filtro. Nesse caso, o driver deve retornar o buffer original para o driver subjacente.

A função NdisFIndicateReceiveNetBufferLists passa a lista indicada de estruturas de NET_BUFFER_LIST até a pilha do driver para drivers overlying. A operação de recebimento prossegue de forma semelhante a uma operação de recebimento iniciada pelo driver de filtro.

Se um driver de sobreposição manteve a propriedade do buffer, o NDIS chamará a função FilterReturnNetBufferLists para o módulo de filtro. Em sua função FilterReturnNetBufferLists , o driver de filtro desfazerá as operações executadas no buffer no caminho de indicação de recebimento.

Quando o módulo de filtro de camada mais baixo indica que ele é feito com um buffer, o NDIS retorna o buffer para o driver de miniport. Se o NDIS limpou o sinalizador NDIS_RECEIVE_FLAGS_RESOURCES no parâmetro ReceiveFlags de FilterReceiveNetBufferLists, o driver de filtro chamará NdisFReturnNetBufferLists para retornar o buffer. Se o NDIS definir o sinalizador NDIS_RECEIVE_FLAGS_RESOURCES no parâmetro ReceiveFlags de FilterReceiveNetBufferLists, retornar de FilterReceiveNetBufferLists retornará o buffer.