Annulation d’une demande d’envoi dans un pilote de filtre
Les pilotes de filtre peuvent annuler les requêtes d’envoi qui ont été générées par le pilote de filtre ou qui ont été générées par des pilotes qui se superposent.
Annulation de l’envoi de requêtes par le pilote de filtre
La figure suivante illustre l’annulation d’une demande d’envoi qui a été générée par un pilote de filtre.
Un pilote de filtre appelle la macro NDIS_SET_NET_BUFFER_LIST_CANCEL_ID pour chaque structure NET_BUFFER_LIST qu’il crée pour les opérations d’envoi. La fonction NDIS_SET_NET_BUFFER_LIST_CANCEL_ID marque les données spécifiées avec un identificateur d’annulation.
Avant d’affecter des ID d’annulation aux données réseau, un pilote de filtre doit appeler NdisGeneratePartialCancelId pour obtenir l’octet d’ordre élevé de chaque ID d’annulation qu’il affecte. Cela garantit que le pilote ne dupliquez 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 en attente de données dans une structure de NET_BUFFER_LIST marquée, un pilote de filtre transmet l’ID d’annulation à la fonction NdisFCancelSendNetBufferLists . 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 de filtre 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 à NdisFCancelSendNetBufferLists. Si un pilote de filtre 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 à NdisFCancelSendNetBufferLists.
NDIS appelle la fonction d’envoi d’annulation des pilotes sous-jacents. Après l’abandon de la transmission en attente, les pilotes sous-jacents appellent une fonction d’envoi complète (par exemple, NdisMSendNetBufferListsComplete) pour renvoyer les structures NET_BUFFER_LIST avec une status d’achèvement de NDIS_STATUS_SEND_ABORTED. NDIS, à son tour, appelle la fonction FilterSendNetBufferListsComplete du pilote de filtre.
Dans FilterSendNetBufferListsComplete, un pilote de filtre 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é accidentellement avec un ID d’annulation obsolète.
Annulation des demandes d’envoi provenant de pilotes en sur-menting
La figure suivante illustre l’annulation d’une demande d’envoi qui a été générée par un pilote qui se superpose.
Les pilotes overlying appellent une fonction d’envoi cancel ( NdisFCancelSendNetBufferLists ou NdisCancelSendNetBufferLists) pour annuler les demandes d’envoi en suspens. Ces pilotes qui se superposent doivent marquer les données d’envoi avec un ID d’annulation avant d’effectuer une demande d’envoi.
NDIS appelle la fonction FilterCancelSendNetBufferLists d’un pilote de filtre pour annuler la transmission de toutes les structures NET_BUFFER_LIST marquées avec un identificateur d’annulation spécifié.
FilterCancelSendNetBufferLists effectue les opérations suivantes :
Traverse la liste des structures de NET_BUFFER_LIST en file d’attente du pilote de filtre pour le module de filtre spécifié et appelle la macro NDIS_GET_NET_BUFFER_LIST_CANCEL_ID pour obtenir l’identificateur d’annulation pour chaque structure. Le pilote de filtre compare l’ID d’annulation que NDIS_GET_NET_BUFFER_LIST_CANCEL_ID retourne à l’ID d’annulation que NDIS a transmis à FilterCancelSendNetBufferLists.
Supprime de la file d’attente d’envoi (dissociation) toutes les structures NET_BUFFER_LIST dont les identificateurs d’annulation correspondent à l’identificateur d’annulation spécifié.
Appelle la fonction NdisFSendNetBufferListsComplete pour toutes les structures NET_BUFFER_LIST non liées afin de retourner les structures. Le pilote de filtre définit le champ status des structures NET_BUFFER_LIST sur NDIS_STATUS_SEND_ABORTED.
Appelle la fonction NdisFCancelSendNetBufferLists pour transmettre la demande d’envoi d’annulation aux pilotes sous-jacents. Le pilote de filtre transmet l’identificateur d’annulation qu’il a reçu du pilote en sur-position. L’opération d’annulation se poursuit comme avec une opération d’envoi d’annulation d’origine de filtre.