Enviando dados de um driver de protocolo

A figura a seguir ilustra uma operação de envio de driver de protocolo, que envolve um driver de protocolo, NDIS e drivers subjacentes em uma pilha de driver.

Diagrama mostrando uma operação de envio de driver de protocolo com um driver de protocolo, NDIS e drivers subjacentes em uma pilha de driver.

Os drivers de protocolo chamam a função NdisSendNetBufferLists para enviar os dados de rede definidos em uma lista de estruturas de NET_BUFFER_LIST .

Um driver de protocolo deve definir o membro SourceHandle de cada estrutura NET_BUFFER_LIST com o mesmo valor que ele passa para o parâmetro NdisBindingHandle . O identificador de associação fornece as informações que o NDIS requer para retornar a estrutura NET_BUFFER_LIST para o driver de protocolo depois que o driver de miniporto subjacente chama NdisMSendNetBufferListsComplete.

Antes de chamar NdisSendNetBufferLists, um driver de protocolo pode definir informações que acompanham a solicitação de envio com a macro NET_BUFFER_LIST_INFO . Os drivers subjacentes podem recuperar essas informações com a macro NET_BUFFER_LIST_INFO.

Assim que um driver de protocolo chama NdisSendNetBufferLists, ele renuncia à propriedade das estruturas de NET_BUFFER_LIST e de todos os recursos associados. O NDIS chama a função ProtocolSendNetBufferListsComplete para retornar as estruturas e os dados para o driver de protocolo. O NDIS pode coletar as estruturas e os dados de várias solicitações de envio em uma única lista vinculada de estruturas de NET_BUFFER_LIST antes de passar a lista para ProtocolSendNetBufferListsComplete.

Até que o NDIS chame ProtocolSendNetBufferListsComplete, o status atual de um envio iniciado pelo driver de protocolo é desconhecido. Um driver de protocolo libera temporariamente a propriedade de todos os recursos alocados para uma solicitação de envio quando chama NdisSendNetBufferLists. Um driver de protocolo nunca deve tentar examinar as estruturas de NET_BUFFER_LIST ou quaisquer dados associados antes que o NDIS retorne as estruturas para ProtocolSendNetBufferListsComplete.

ProtocolSendNetBufferListsComplete executa qualquer pós-processamento necessário para concluir uma operação de envio. Por exemplo, o driver de protocolo pode notificar os clientes, que solicitaram ao driver de protocolo para enviar os dados de rede, que a operação de envio foi concluída.

Quando o NDIS chama ProtocolSendNetBufferListsComplete, o driver de protocolo recupera a propriedade de todos os recursos associados às estruturas NET_BUFFER_LIST especificadas pelo parâmetro NetBufferLists . ProtocolSendNetBufferListsComplete pode liberar esses recursos (por exemplo, chamando NdisFreeNetBuffer e NdisFreeNetBufferList) ou prepará-los para reutilização em uma chamada subsequente para NdisSendNetBufferLists.

Embora o NDIS sempre envie dados de rede fornecidos pelo protocolo para o driver de miniporto subjacente na ordem determinada pelo protocolo, conforme passado para NdisSendNetBufferLists, o driver subjacente pode concluir as solicitações de envio em ordem aleatória. Ou seja, cada driver de protocolo associado pode contar com o NDIS para enviar os dados de rede que o driver de protocolo passa para NdisSendNetBufferLists na ordem FIFO para o driver subjacente. No entanto, nenhum driver de protocolo pode contar com o driver subjacente para chamar NdisMSendNetBufferListsComplete na mesma ordem.