Partager via


Envoi de données à partir d’un pilote de protocole

La figure suivante illustre une opération d’envoi de pilote de protocole, qui implique un pilote de protocole, NDIS et des pilotes sous-jacents dans une pile de pilotes.

Diagramme montrant une opération d’envoi de pilote de protocole avec un pilote de protocole, NDIS et les pilotes sous-jacents dans une pile de pilotes.

Les pilotes de protocole appellent la fonction NdisSendNetBufferLists pour envoyer les données réseau définies dans une liste de structures NET_BUFFER_LIST .

Un pilote de protocole doit définir le membre SourceHandle de chaque structure NET_BUFFER_LIST sur la même valeur qu’il passe au paramètre NdisBindingHandle . Le handle de liaison fournit les informations dont NDIS a besoin pour retourner la structure NET_BUFFER_LIST au pilote de protocole après que le pilote miniport sous-jacent a appelé NdisMSendNetBufferListsComplete.

Avant d’appeler NdisSendNetBufferLists, un pilote de protocole peut définir les informations qui accompagnent la demande d’envoi avec la macro NET_BUFFER_LIST_INFO . Les pilotes sous-jacents peuvent récupérer ces informations avec la macro NET_BUFFER_LIST_INFO.

Dès qu’un pilote de protocole appelle NdisSendNetBufferLists, il abandonne la propriété des structures NET_BUFFER_LIST et de toutes les ressources associées. NDIS appelle la fonction ProtocolSendNetBufferListsComplete pour retourner les structures et les données au pilote de protocole. NDIS peut collecter les structures et les données de plusieurs demandes d’envoi dans une seule liste liée de structures NET_BUFFER_LIST avant de transmettre la liste à ProtocolSendNetBufferListsComplete.

Jusqu’à ce que NDIS appelle ProtocolSendNetBufferListsComplete, la status actuelle d’un envoi initié par le pilote de protocole est inconnue. Un pilote de protocole libère temporairement la propriété de toutes les ressources allouées pour une demande d’envoi lorsqu’il appelle NdisSendNetBufferLists. Un pilote de protocole ne doit jamais tenter d’examiner les structures NET_BUFFER_LIST ou les données associées avant que NDIS retourne les structures à ProtocolSendNetBufferListsComplete.

ProtocolSendNetBufferListsComplete effectue le post-traitement nécessaire pour terminer une opération d’envoi. Par exemple, le pilote de protocole peut informer les clients, qui ont demandé au pilote de protocole d’envoyer les données réseau, que l’opération d’envoi est terminée.

Lorsque NDIS appelle ProtocolSendNetBufferListsComplete, le pilote de protocole reprend la propriété de toutes les ressources associées aux structures NET_BUFFER_LIST spécifiées par le paramètre NetBufferLists . ProtocolSendNetBufferListsComplete peut libérer ces ressources (par exemple, en appelant NdisFreeNetBuffer et NdisFreeNetBufferList) ou les préparer à la réutilisation dans un appel ultérieur à NdisSendNetBufferLists.

Bien que NDIS envoie toujours les données réseau fournies par protocole au pilote miniport sous-jacent dans l’ordre déterminé par le protocole, tel qu’il est passé à NdisSendNetBufferLists, le pilote sous-jacent peut effectuer les demandes d’envoi dans un ordre aléatoire. Autrement dit, chaque pilote de protocole lié peut s’appuyer sur NDIS pour envoyer les données réseau que le pilote de protocole transmet à NdisSendNetBufferLists dans l’ordre FIFO au pilote sous-jacent. Toutefois, aucun pilote de protocole ne peut s’appuyer sur le pilote sous-jacent pour appeler NdisMSendNetBufferListsComplete dans le même ordre.