Partilhar via


Recebendo dados num driver de filtro

Os drivers de filtro podem iniciar o recebimento de indicações ou filtrar as indicações recebidas de drivers subjacentes. Quando um driver de miniporta chama a função NdisMIndicateReceiveNetBufferLists, o NDIS submete a estrutura NET_BUFFER_LIST especificada ao módulo de filtro subjacente mais baixo na pilha de drivers.

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 que ilustra 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 subindo pela pilha para os controladores sobrejacentes. O driver de filtro aloca as estruturas das pools que criou durante a inicialização.

Se um driver de filtro definir o sinalizador NDIS_RECEIVE_FLAGS_RESOURCES no parâmetro ReceiveFlags de NdisFIndicateReceiveNetBufferLists, isso indica 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 FilterReturnNetBufferListsdo driver de filtropara devolver as estruturas NET_BUFFER_LIST. O driver de filtro recupera imediatamente a propriedade após o retorno de NdisFIndicateReceiveNetBufferLists.

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

Observação Um driver de filtro deve acompanhar as indicações de recebimento que inicia e certificar-se de que não chama a função NdisFReturnNetBufferLists quando a operação de recebimento for concluída.

Filtração de Indicações de Receção

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

Diagrama que ilustra uma indicação de receção filtrada iniciada por um controlador 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 da função FilterReceiveNetBufferLists não estiver definido, o driver de filtro manterá a propriedade das estruturas 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 pode reter a estrutura NET_BUFFER_LIST e os recursos associados alocados pelo driver subjacente. Este indicador pode indicar que o driver subjacente está com escassos recursos de recepção. A função FilterReceiveNetBufferLists deve retornar o mais rapidamente possível.

Nota Se o sinalizador NDIS_RECEIVE_FLAGS_RESOURCES estiver ativado, o driver de filtro deverá manter o conjunto original de estruturas de NET_BUFFER_LIST na lista vinculada. Por exemplo, quando esse sinalizador é definido, o driver pode processar as estruturas e indicá-las até a 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 nos dados recebidos antes de indicar os dados aos drivers superiores. Para cada buffer enviado para a sua função FilterReceiveNetBufferLists, um driver de filtro pode fazer o seguinte:

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

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

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

  • Elimine a memória intermédia. Se o NDIS tiver limpo o sinalizador NDIS_RECEIVE_FLAGS_RESOURCES no parâmetro ReceiveFlags da funçãoFilterReceiveNetBufferLists, chame a funçãoNdisFReturnNetBufferLists 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.

  • Enfileire 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 por um driver de filtro. Nesse caso, o controlador deve retornar o buffer original para o controlador subjacente.

A funçãoNdisFIndicateReceiveNetBufferLists passa a lista indicada de estruturas de NET_BUFFER_LIST ao longo da pilha de drivers para os drivers sobrepostos. A operação de recebimento prossegue de forma semelhante a uma operação de recebimento iniciada pelo driver de filtro.

Se um driver sobreposto manteve a propriedade do buffer, o NDIS chamará a função FilterReturnNetBufferLists para o módulo de filtro. Na sua função FilterReturnNetBufferLists, o driver de filtro desfará as operações que executou no buffer na trajetória de indicação de recebimento.

Quando o módulo de filtro da camada mais baixa indica que concluiu com um buffer, o NDIS retorna o buffer ao controlador de miniporta. Se o NDIS limpou o sinalizador NDIS_RECEIVE_FLAGS_RESOURCES no parâmetro ReceiveFlags de FilterReceiveNetBufferLists, o driver de filtro chama NdisFReturnNetBufferLists para retornar o buffer. Se o NDIS definir o sinalizador NDIS_RECEIVE_FLAGS_RESOURCES no parâmetro ReceiveFlags de FilterReceiveNetBufferLists, ao retornar de FilterReceiveNetBufferLists, o buffer será retornado.