FILTER_RECEIVE_NET_BUFFER_LISTS função de retorno de chamada (ndis.h)

O NDIS chama a função FilterReceiveNetBufferLists para solicitar um driver de filtro para processar uma indicação de recebimento.

Nota Você deve declarar a função usando o tipo FILTER_RECEIVE_NET_BUFFER_LISTS . Para obter mais informações, consulte a seção Exemplos a seguir.
 

Sintaxe

FILTER_RECEIVE_NET_BUFFER_LISTS FilterReceiveNetBufferLists;

void FilterReceiveNetBufferLists(
  [in] NDIS_HANDLE FilterModuleContext,
  [in] PNET_BUFFER_LIST NetBufferLists,
  [in] NDIS_PORT_NUMBER PortNumber,
  [in] ULONG NumberOfNetBufferLists,
  [in] ULONG ReceiveFlags
)
{...}

Parâmetros

[in] FilterModuleContext

Um identificador para a área de contexto do módulo de filtro. O driver de filtro criou e inicializou essa área de contexto na função FilterAttach .

[in] NetBufferLists

Uma lista vinculada de estruturas de NET_BUFFER_LIST que foram alocadas por drivers subjacentes. Cada estrutura NET_BUFFER_LIST contém uma estrutura NET_BUFFER .

[in] PortNumber

Um número de porta que identifica uma porta de adaptador de miniporta. Os números da porta do adaptador miniport são atribuídos chamando a função NdisMAllocatePort . Um valor zero identifica a porta padrão de um adaptador de miniporta.

[in] NumberOfNetBufferLists

O número de estruturas NET_BUFFER_LIST que estão na lista vinculada de estruturas em NetBufferLists .

[in] ReceiveFlags

Sinalizadores que definem atributos para a indicação de recebimento. Os sinalizadores podem ser combinados com uma operação OR. Para limpar todos os sinalizadores, defina esse membro como zero. Essa função dá suporte aos seguintes sinalizadores:

NDIS_RECEIVE_FLAGS_DISPATCH_LEVEL

Especifica que o IRQL atual está DISPATCH_LEVEL. Para obter mais informações sobre esse sinalizador, consulte Dispatch IRQL Tracking.

NDIS_RECEIVE_FLAGS_RESOURCES

Especifica que o NDIS recupera a propriedade das estruturas NET_BUFFER_LIST e quaisquer estruturas NET_BUFFER anexadas imediatamente após o retorno da chamada para FilterReceiveNetBufferLists .

NDIS_RECEIVE_FLAGS_SINGLE_ETHER_TYPE

Especifica que todas as estruturas de NET_BUFFER_LIST na lista em NetBufferLists têm o mesmo tipo de protocolo (EtherType).

NDIS_RECEIVE_FLAGS_SINGLE_VLAN

Especifica que todas as estruturas NET_BUFFER_LIST na lista em NetBufferLists pertencem à mesma VLAN.

NDIS_RECEIVE_FLAGS_PERFECT_FILTERED

Especifica que todas as estruturas de NET_BUFFER_LIST na lista em NetBufferLists incluem apenas dados que correspondam ao filtro de pacote e à lista de endereços multicast atribuídos ao adaptador de miniporto.

NDIS_RECEIVE_FLAGS_SINGLE_QUEUE

Especifica que todas as estruturas de NET_BUFFER_LIST na lista em NetBufferLists pertencem à mesma fila de VMs. Um driver de miniporta deve definir esse sinalizador para todas as indicações de recebimento em uma fila se o sinalizador NDIS_RECEIVE_QUEUE_PARAMETERS_PER_QUEUE_RECEIVE_INDICATION foi definido no membro Flags do NDIS_RECEIVE_QUEUE_PARAMETERS estrutura quando essa fila foi alocada.

NDIS_RECEIVE_FLAGS_SHARED_MEMORY_INFO_VALID

Especifica que todas as estruturas de NET_BUFFER_LIST na lista em NetBufferLists contêm informações de memória compartilhada que são válidas. Quando esse sinalizador é definido em uma NET_BUFFER_LIST recebida, o NDIS trata as informações de memória compartilhada como válidas. Quando esse sinalizador não está definido, o NDIS e os drivers ignoram as informações de memória compartilhada. Por exemplo, drivers intermediários que modificam dados de pacote podem usar esse sinalizador para determinar se os dados devem ser copiados. Os drivers de miniport podem usar o sinalizador para determinar como liberar a memória associada a uma fila de VM quando uma fila é excluída.

NDIS_RECEIVE_FLAGS_MORE_NBLS

Reservado.

NDIS_RECEIVE_FLAGS_SWITCH_SINGLE_SOURCE

Se esse sinalizador for definido, todos os pacotes em uma lista vinculada de estruturas de NET_BUFFER_LIST originaram-se da mesma porta de origem do comutador extensível do Hyper-V.

Para obter mais informações, consulte Sinalizadores de envio e recebimento de comutador extensível do Hyper-V.

Nota Se cada pacote na lista vinculada de estruturas NET_BUFFER_LIST usar a mesma porta de origem, a extensão deverá definir o sinalizador NDIS_RETURN_FLAGS_SWITCH_SINGLE_SOURCE no parâmetro ReturnFlags de FilterReturnNetBufferLists quando a solicitação de recebimento for concluída. A extensão deverá definir esse sinalizador no parâmetro ReturnFlags se chamar NdisFReturnNetBufferLists para retornar pacotes que ele não originou ou cloneu.
 

NDIS_RECEIVE_FLAGS_SWITCH_DESTINATION_GROUP

Se esse sinalizador for definido, todos os pacotes em uma lista vinculada de estruturas de NET_BUFFER_LIST deverão ser encaminhados para a mesma porta de destino do comutador extensível.

Para obter mais informações, consulte Sinalizadores de envio e recebimento de comutador extensível do Hyper-V.

Nota Se cada pacote na lista vinculada de estruturas NET_BUFFER_LIST usar as mesmas portas de destino, a extensão deverá definir o sinalizador NDIS_RECEIVE_FLAGS_SWITCH_DESTINATION_GROUP no parâmetro ReturnFlags de FilterReturnNetBufferLists quando a solicitação de recebimento for concluída. A extensão deverá definir esse sinalizador no parâmetro ReturnFlags se chamar NdisFReturnNetBufferLists para retornar pacotes que ele não originou ou cloneu.
 

Retornar valor

Nenhum

Comentários

FilterReceiveNetBufferLists é uma função opcional. Se um driver de filtro não filtrar as indicações de recebimento, ele poderá definir o ponto de entrada dessa função como NULL quando chamar o Função NdisFRegisterFilterDriver .

Nota Um driver de filtro que fornece uma função FilterReceiveNetBufferLists deve fornecer uma função FilterStatus .
 
O driver de filtro pode chamar a função NdisSetOptionalHandlers , da função FilterSetModuleOptions , para especificar uma função FilterReceiveNetBufferLists para um módulo de filtro.

O NDIS chama FilterReceiveNetBufferLists para processar indicações de recebimento iniciadas por drivers subjacentes. O NDIS também pode chamar essa função como resultado do loopback.

Se o driver de filtro não especificou uma função FilterReceiveNetBufferLists , o NDIS chamará o próximo driver de filtro superior na pilha que especificou uma função FilterReceiveNetBufferLists . Se não houver esse driver de filtro, o NDIS chamará um driver de sobreposição Função ProtocolReceiveNetBufferLists .

Se o sinalizador NDIS_RECEIVE_FLAGS_RESOURCES no parâmetro ReceiveFlags não estiver definido, o driver de filtro manterá a propriedade das estruturas de NET_BUFFER_LIST até chamar o 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 associados alocados pelo driver subjacente. 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. Antes de retornar, a função FilterReceiveNetBufferLists pode copiar os dados recebidos no armazenamento alocado pelo driver de filtro ou passar o buffer chamando o Função NdisFIndicateReceiveNetBufferLists .

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 um de cada vez, mas antes que a função retorne, ele deve restaurar a lista vinculada original.
 
Os drivers de filtro podem filtrar os dados recebidos antes de indicar os dados para drivers excessivamente. Para cada buffer enviado à função FilterReceiveNetBufferLists , um driver de filtro pode fazer o seguinte:
  • Passe o buffer para o próximo driver de sobreposição chamando o Função NdisFIndicateReceiveNetBufferLists .

    O driver pode modificar o conteúdo do buffer antes de chamar NdisFIndicateReceiveNetBufferLists.

    O driver pode alterar a configuração do sinalizador NDIS_RECEIVE_FLAGS_RESOURCES que o NDIS passou para FilterReceiveNetBufferLists ou simplesmente passá-lo para NdisFIndicateReceiveNetBufferLists.

  • Descarte o buffer. Se o NDIS limpou o sinalizador NDIS_RECEIVE_FLAGS_RESOURCES , chame a função NdisFReturnNetBufferLists para descartar o buffer. Se o NDIS definir o sinalizador NDIS_RECEIVE_FLAGS_RESOURCES , 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 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.
Se o driver de filtro chamado NdisFIndicateReceiveNetBufferLists e não tiver definido o sinalizador NDIS_RECEIVE_FLAGS_RESOURCES , o NDIS chamará o 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.

Se um módulo de filtro estiver no estado Pausado , o driver de filtro não deverá originar nenhuma indicação de recebimento para esse módulo de filtro. O driver de filtro não deve passar buffers criados para NdisFIndicateReceiveNetBufferLists. No entanto, o driver pode passar uma indicação de recebimento de um driver subjacente.

O NDIS chama FilterReceiveNetBufferLists em IRQL <= DISPATCH_LEVEL.

Exemplos

Para definir uma função FilterReceiveNetBufferLists , primeiro você deve fornecer uma declaração de função que identifique o tipo de função que você está definindo. O Windows fornece um conjunto de tipos de função para drivers. Declarar uma função usando os tipos de função ajuda a Análise de Código para Drivers, SDV ( Verificador de Driver Estático ) e outras ferramentas de verificação a encontrar erros e é um requisito para gravar drivers para o sistema operacional Windows.

Por exemplo, para definir uma função FilterReceiveNetBufferLists chamada "MyReceiveNetBufferLists", use o tipo FILTER_RECEIVE_NET_BUFFER_LISTS conforme mostrado neste exemplo de código:

FILTER_RECEIVE_NET_BUFFER_LISTS MyReceiveNetBufferLists;

Em seguida, implemente sua função da seguinte maneira:

_Use_decl_annotations_
VOID
 MyReceiveNetBufferLists(
    NDIS_HANDLE  FilterModuleContext,
    PNET_BUFFER_LIST  NetBufferLists,
    NDIS_PORT_NUMBER  PortNumber,
    ULONG  NumberOfNetBufferLists,
    ULONG  ReceiveFlags
    )
  {...}

O tipo de função FILTER_RECEIVE_NET_BUFFER_LISTS é definido no arquivo de cabeçalho Ndis.h. Para identificar erros com mais precisão ao executar as ferramentas de análise de código, adicione a anotação Use_decl_annotations à sua definição de função. A anotação Use_decl_annotations garante que as anotações aplicadas ao tipo de função FILTER_RECEIVE_NET_BUFFER_LISTS no arquivo de cabeçalho sejam usadas. Para obter mais informações sobre os requisitos para declarações de função, consulte Declarando funções usando tipos de função de função para drivers NDIS.

Para obter informações sobre Use_decl_annotations, consulte Anotando o comportamento da função.

Requisitos

Requisito Valor
Cliente mínimo com suporte Com suporte no NDIS 6.0 e posterior.
Plataforma de Destino Windows
Cabeçalho ndis.h (inclua Ndis.h)
IRQL <= DISPATCH_LEVEL

Confira também

FilterAttach

FilterReturnNetBufferLists

FilterSetModuleOptions

NDIS_RECEIVE_QUEUE_PARAMETERS

NET_BUFFER

NET_BUFFER_LIST

NdisFIndicateReceiveNetBufferLists

NdisFRegisterFilterDriver

NdisFReturnNetBufferLists

NdisMAllocatePort

NdisSetOptionalHandlers

ProtocolReceiveNetBufferLists