Invio di dati da un driver di protocollo

La figura seguente illustra un'operazione di invio del driver di protocollo, che prevede un driver di protocollo, un NDIS e i driver sottostanti in uno stack di driver.

Diagramma che mostra un'operazione di invio del driver di protocollo con un driver di protocollo, NDIS e driver sottostanti in uno stack di driver.

I driver di protocollo chiamano la funzione NdisSendNetBufferLists per inviare i dati di rete definiti in un elenco di strutture NET_BUFFER_LIST .

Un driver di protocollo deve impostare il membro SourceHandle di ogni struttura NET_BUFFER_LIST sullo stesso valore che passa al parametro NdisBindingHandle . L'handle di associazione fornisce le informazioni richieste da NDIS per restituire la struttura NET_BUFFER_LIST al driver di protocollo dopo che il driver miniport sottostante chiama NdisMSendNetBufferListsComplete.

Prima di chiamare NdisSendNetBufferLists, un driver di protocollo può impostare informazioni che accompagnano la richiesta di invio con la macro NET_BUFFER_LIST_INFO . I driver sottostanti possono recuperare queste informazioni con la macro NET_BUFFER_LIST_INFO.

Non appena un driver di protocollo chiama NdisSendNetBufferLists, rinuncia alla proprietà delle strutture NET_BUFFER_LIST e di tutte le risorse associate. NDIS chiama la funzione ProtocolSendNetBufferListsComplete per restituire le strutture e i dati al driver del protocollo. NDIS può raccogliere le strutture e i dati da più richieste di invio in un unico elenco collegato di strutture NET_BUFFER_LIST prima di passare l'elenco a ProtocolSendNetBufferListsComplete.

Finché NDIS chiama ProtocolSendNetBufferListsComplete, lo stato corrente di un invio avviato dal driver di protocollo è sconosciuto. Un driver di protocollo rilascia temporaneamente la proprietà di tutte le risorse allocate per una richiesta di invio quando chiama NdisSendNetBufferLists. Un driver di protocollo non deve mai tentare di esaminare le strutture NET_BUFFER_LIST o i dati associati prima che NDIS restituisca le strutture a ProtocolSendNetBufferListsComplete.

ProtocolSendNetBufferListsComplete esegue qualsiasi post-elaborazione necessaria per completare un'operazione di invio. Ad esempio, il driver di protocollo può notificare ai client, che ha richiesto al driver di protocollo di inviare i dati di rete, che l'operazione di invio è stata completata.

Quando NDIS chiama ProtocolSendNetBufferListsComplete, il driver di protocollo recupera la proprietà di tutte le risorse associate alle strutture NET_BUFFER_LIST specificate dal parametro NetBufferLists . ProtocolSendNetBufferListsComplete può liberare queste risorse ,ad esempio chiamando NdisFreeNetBuffer e NdisFreeNetBufferList, oppure preparandole per il riutilizzo in una chiamata successiva a NdisSendNetBufferLists.

Anche se NDIS invia sempre i dati di rete forniti dal protocollo al driver miniport sottostante nell'ordine determinato dal protocollo passato a NdisSendNetBufferLists, il driver sottostante può completare le richieste di invio in ordine casuale. In altre parole, ogni driver di protocollo associato può basarsi su NDIS per inviare i dati di rete passati dal driver di protocollo a NdisSendNetBufferLists nell'ordine FIFO al driver sottostante. Tuttavia, nessun driver di protocollo può basarsi sul driver sottostante per chiamare NdisMSendNetBufferListsComplete nello stesso ordine.