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.
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.