Annulation d’une opération d’envoi
La figure suivante illustre l’annulation d’une opération d’envoi.
Un pilote appelle la macro NDIS_SET_NET_BUFFER_LIST_CANCEL_ID pour chaque structure de NET_BUFFER_LIST qu’il transmet aux pilotes de niveau inférieur pour la transmission. La fonction NDIS_SET_NET_BUFFER_LIST_CANCEL_ID marque le paquet spécifié avec un identificateur d’annulation.
Avant d’attribuer des ID d’annulation à des paquets, un pilote doit appeler NdisGeneratePartialCancelId pour obtenir l’octet d’ordre élevé de chaque ID d’annulation qu’il attribue. Cela garantit que le pilote ne duplique pas les ID d’annulation attribués par d’autres pilotes dans le système. Les pilotes appellent généralement NdisGeneratePartialCancelId une fois à partir de la routine DriverEntry ; Toutefois, les pilotes peuvent obtenir plusieurs identificateurs d’annulation partielle en appelant NdisGeneratePartialCancelId plusieurs fois.
Pour annuler la transmission de données en attente dans une structure de NET_BUFFER_LIST marquée, un pilote transmet l’ID d’annulation à la fonction NdisCancelSendNetBufferLists . Les pilotes peuvent obtenir l’ID d’annulation d’une structure de NET_BUFFER_LIST en appelant la macro NDIS_GET_NET_BUFFER_LIST_CANCEL_ID .
Si un pilote marque toutes les structures NET_BUFFER_LIST avec le même identificateur d’annulation, il peut annuler toutes les transmissions en attente avec un seul appel à NdisCancelSendNetBufferLists. Si un pilote marque toutes les structures NET_BUFFER_LIST au sein d’un sous-groupe de structures NET_BUFFER_LIST avec un identificateur unique, il peut annuler toutes les transmissions en attente au sein de ce sous-groupe avec un seul appel à NdisCancelSendNetBufferLists.
NDIS appelle la fonction MiniportCancelSend du pilote de niveau inférieur approprié sur la liaison. Après avoir abandonné la transmission en attente, le pilote miniport sous-jacent appelle la fonction NdisMSendNetBufferListsComplete pour retourner les structures NET_BUFFER_LIST et un status d’achèvement de NDIS_STATUS_SEND_ABORTED. NDIS, à son tour, appelle la fonction ProtocolSendNetBufferListsComplete du pilote approprié.
Dans sa fonction ProtocolSendNetBufferListsComplete , un pilote de protocole peut appeler NDIS_SET_NET_BUFFER_LIST_CANCEL_ID avec CancelId défini sur NULL. Cela empêche le NET_BUFFER_LIST d’être réutilisé par inadvertance avec un ID d’annulation obsolète.