Compartilhar via


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.