Compartilhar via


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

Os processos de função ProtocolReceiveNetBufferLists recebem indicações de drivers subjacentes.

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

Sintaxe

PROTOCOL_RECEIVE_NET_BUFFER_LISTS ProtocolReceiveNetBufferLists;

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

Parâmetros

[in] ProtocolBindingContext

Um identificador para uma área de contexto alocada pelo driver de protocolo para manter informações de estado para uma associação. Esse identificador foi passado para o NDIS em uma chamada anterior para a função NdisOpenAdapterEx .

[in] NetBufferLists

Uma lista vinculada de estruturas NET_BUFFER_LIST que o driver subjacente alocou. Cada estrutura NET_BUFFER_LIST geralmente é associada a uma estrutura NET_BUFFER .

[in] PortNumber

Um número de porta que identifica uma porta de adaptador de miniporta. O número de porta padrão de um adaptador de miniporta é zero. Os drivers de protocolo que não usam portas de adaptador de miniporta devem ignorar esse parâmetro.

[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 operação de envio. 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 de NET_BUFFER_LIST e quaisquer estruturas de NET_BUFFER anexadas imediatamente após o retorno da chamada para ProtocolReceiveNetBufferLists .

NDIS_RECEIVE_FLAGS_SINGLE_ETHER_TYPE

Especifica que todas as estruturas 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 de 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 correspondem ao filtro de pacotes e à lista 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.

Retornar valor

Nenhum

Comentários

ProtocolReceiveNetBufferLists é uma função necessária para drivers de protocolo. O NDIS chama ProtocolReceiveNetBufferLists depois que um driver de miniporto associado chama o Função NdisMIndicateReceiveNetBufferLists . Uma chamada para ProtocolReceiveNetBufferLists também pode ocorrer como resultado de um loopback.

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

Se o NDIS definir o sinalizador NDIS_RECEIVE_FLAGS_RESOURCES , o driver de protocolo não poderá reter a estrutura NET_BUFFER_LIST e os recursos associados. O sinalizador de NDIS_RECEIVE_FLAGS_RESOURCES definido indica que um driver subjacente está com poucos recursos de recebimento. Nesse caso, a função ProtocolReceiveNetBufferLists deve copiar os dados recebidos no armazenamento alocado por protocolo e retornar o mais rápido possível.

Nota Se o sinalizador NDIS_RECEIVE_FLAGS_RESOURCES estiver definido, o driver de protocolo 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.
 
Em um sistema multiprocessador, essa função pode ser executada simultaneamente em mais de um processador. Aplique proteção (por exemplo, use bloqueios de rotação) a estruturas de dados críticas acessadas por ProtocolReceiveNetBufferLists.

O NDIS chama ProtocolReceiveNetBufferLists em IRQL<= DISPATCH_LEVEL.

Exemplos

Para definir uma função ProtocolReceiveNetBufferLists , 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 escrever drivers para o sistema operacional Windows.

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

PROTOCOL_RECEIVE_NET_BUFFER_LISTS MyReceiveNetBufferLists;

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

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

O tipo de função PROTOCOL_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 PROTOCOL_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

MiniportReturnNetBufferLists

NDIS_RECEIVE_QUEUE_PARAMETERS

NET_BUFFER

NET_BUFFER_LIST

NdisMIndicateReceiveNetBufferLists

NdisOpenAdapterEx

NdisReturnNetBufferLists