Partager via


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

Les pilotes de filtre peuvent lancer l’envoi de demandes ou filtrer les demandes d’envoi que les pilotes qui sur-mentent lancent. Lorsqu’un pilote de protocole appelle la fonction NdisSendNetBufferLists , NDIS envoie la structure NET_BUFFER_LIST spécifiée au module de filtre le plus haut de la pile de pilotes.

Envoyer des requêtes initiées par un pilote de filtre

La figure suivante illustre une opération d’envoi lancée par un pilote de filtre.

Diagramme montrant une opération d’envoi lancée par un pilote de filtre avec la fonction NdisFSendNetBufferLists.

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

Un pilote de filtre doit définir le membre SourceHandle de chaque structure NET_BUFFER_LIST qu’il crée sur la même valeur qu’il passe au paramètre NdisFilterHandle de NdisFSendNetBufferLists. Les pilotes NDIS ne doivent pas modifier le membre SourceHandle pour NET_BUFFER_LIST structures dont le pilote n’est pas issu.

Avant d’appeler NdisFSendNetBufferLists, un pilote de filtre peut définir des 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 filtre appelle NdisFSendNetBufferLists, il abandonne la propriété des structures NET_BUFFER_LIST et de toutes les ressources associées. NDIS peut gérer la demande d’envoi ou la transmettre aux pilotes sous-jacents.

NDIS appelle la fonction FilterSendNetBufferListsComplete pour retourner les structures et les données au pilote de filtre. 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 à FilterSendNetBufferListsComplete

Jusqu’à ce que NDIS appelle FilterSendNetBufferListsComplete, la status actuelle d’une demande d’envoi est inconnue. Un pilote de filtre ne doit jamais essayer d’examiner les structures NET_BUFFER_LIST ou les données associées avant que NDIS retourne les structures à FilterSendNetBufferListsComplete.

FilterSendNetBufferListsComplete effectue le post-traitement nécessaire pour terminer une opération d’envoi.

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

NDIS envoie toujours les données réseau fournies par filtre aux pilotes sous-jacents dans l’ordre déterminé par le filtre, tels qu’ils sont passés à NdisFSendNetBufferLists. Toutefois, après avoir envoyé les données dans l’ordre spécifié, les pilotes sous-jacents peuvent retourner les mémoires tampons dans n’importe quel ordre.

Un pilote de filtre peut demander un bouclage pour les demandes d’envoi dont il provient. Pour demander un bouclage, le pilote définit l’indicateur NDIS_SEND_FLAGS_CHECK_FOR_LOOPBACK dans le paramètre SendFlags de NdisFSendNetBufferLists. NDIS indique un paquet reçu qui contient les données d’envoi.

Note Un pilote de filtre doit effectuer le suivi des demandes d’envoi qui proviennent et s’assurer qu’il n’appelle pas la fonction NdisFSendNetBufferListsComplete lorsque ces demandes sont terminées.

Filtrage des demandes d’envoi

La figure suivante illustre le filtrage d’une demande d’envoi initiée par un pilote de sur-ment.

Diagramme illustrant le processus de filtrage d’une demande d’envoi lancée par un pilote de sur-insertion à l’aide de la fonction FilterSendNetBufferLists.

NDIS appelle la fonction FilterSendNetBufferLists d’un pilote de filtre pour filtrer la demande d’envoi d’un pilote qui se superpose.

Le pilote de filtre ne doit pas modifier le membre SourceHandle dans les structures NET_BUFFER_LIST qu’il reçoit d’autres pilotes.

Le pilote de filtre peut filtrer les données et envoyer les données filtrées aux pilotes sous-jacents. Pour chaque structure NET_BUFFER envoyée à FilterSendNetBufferLists, un pilote de filtre peut effectuer les opérations suivantes :

  • Passez la mémoire tampon au pilote sous-jacent suivant en appelant la fonction NdisFSendNetBufferLists . NDIS garantit la disponibilité de l’espace de contexte (voir structure NET_BUFFER_LIST_CONTEXT) pour les pilotes de filtre. Le pilote de filtre peut modifier le contenu de la mémoire tampon avant d’appeler NdisFSendNetBufferLists. Le traitement des données filtrées se poursuit comme avec une opération d’envoi lancée par un pilote de filtre.

  • Supprimez la mémoire tampon en appelant la fonction NdisFSendNetBufferListsComplete .

  • Mettre en file d’attente la mémoire tampon dans une structure de données locale pour un traitement ultérieur. La conception du pilote de filtre détermine ce qui amène le pilote à traiter une mémoire tampon mise en file d’attente. Certains exemples incluent le traitement après un délai d’attente ou le traitement après la réception d’une mémoire tampon spécifique.

    Note Si les files d’attente du pilote envoient des demandes pour un traitement ultérieur, il doit prendre en charge les demandes d’annulation d’envoi. Pour plus d’informations sur l’envoi de demandes d’annulation, consultez Annulation des demandes d’envoi dans un pilote de filtre.

  • Copiez la mémoire tampon et proviennent d’une demande d’envoi avec la copie. L’opération d’envoi est similaire à une demande d’envoi lancée par le pilote de filtre. Dans ce cas, le pilote doit retourner la mémoire tampon d’origine au pilote de sur-insertion en appelant la fonction NdisFSendNetBufferListsComplete .

L’achèvement des demandes d’envoi se poursuit jusqu’à la pile des pilotes. Lorsque le pilote miniport appelle la fonction NdisMSendNetBufferListsComplete , NDIS appelle la fonction FilterSendNetBufferListsComplete pour le module de filtre le plus bas.

Une fois l’opération d’envoi terminée, le pilote de filtre inverse les modifications apportées aux descripteurs de mémoire tampon du pilote qui sur-mentent que le pilote de filtre a effectués dans FilterSendNetBufferLists. Le pilote appelle la fonction NdisFSendNetBufferListsComplete pour renvoyer la liste liée des structures de NET_BUFFER_LIST aux pilotes qui se superposent et pour retourner la dernière status de la demande d’envoi.

Lorsque le module de filtre le plus haut appelle NdisFSendNetBufferListsComplete, NDIS appelle la fonction ProtocolSendNetBufferListsComplete du pilote de protocole d’origine.

Un pilote de filtre qui ne fournit pas de fonction FilterSendNetBufferLists peut toujours lancer une demande d’envoi. Si un tel pilote lance une demande d’envoi, il doit fournir une fonction FilterSendNetBufferListsComplete et il ne doit pas passer l’événement complet jusqu’à la pile de pilotes.

Un pilote de filtre peut transmettre ou filtrer la demande de bouclage d’un pilote qui se superpose. Pour transmettre une demande de bouclage, si NDIS défini NDIS_SEND_FLAGS_CHECK_FOR_LOOPBACK dans le paramètre SendFlags de FilterSendNetBufferLists, le pilote de filtre définit NDIS_SEND_FLAGS_CHECK_FOR_LOOPBACK dans le paramètre SendFlags lorsqu’il appelle NdisFSendNetBufferLists. NDIS indique un paquet reçu qui contient les données d’envoi.

En général, si un pilote de filtre modifie un comportement de telle sorte que NDIS ne peut pas fournir de service standard (par exemple, bouclage), le pilote de filtre doit fournir ce service pour NDIS. Par exemple, un pilote de filtre qui modifie une demande d’adresse matérielle (voir OID_802_3_CURRENT_ADDRESS) doit gérer le bouclage des mémoires tampons dirigées vers la nouvelle adresse matérielle. Dans ce cas, NDIS ne peut pas fournir le service de bouclage qu’il fournit généralement, car le filtre a modifié l’adresse. En outre, si le pilote de filtre définit le mode promiscuous (voir OID_GEN_CURRENT_PACKET_FILTER), il ne doit pas transmettre les données supplémentaires qu’il reçoit aux pilotes qui se superposent.