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.
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.
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.
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 .
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 .
-
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 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
NdisFIndicateReceiveNetBufferLists ProtocolReceiveNetBufferListsComentários
https://aka.ms/ContentUserFeedback.
Em breve: Ao longo de 2024, eliminaremos os problemas do GitHub como o mecanismo de comentários para conteúdo e o substituiremos por um novo sistema de comentários. Para obter mais informações, consulteEnviar e exibir comentários de