Partager via


Réception de données dans un pilote de filtre

Les pilotes de filtre peuvent lancer des indications de réception ou filtrer les indications de réception des pilotes sous-jacents. Lorsqu’un pilote miniport appelle la fonction NdisMIndicateReceiveNetBufferLists , NDIS envoie la structure NET_BUFFER_LIST spécifiée au module de filtre le plus bas de la pile de pilotes.

Recevoir des indications initiées par un pilote de filtre

La figure suivante illustre une indication de réception initiée par un pilote de filtre.

Diagramme illustrant une indication de réception initiée par un pilote de filtre.

Les pilotes de filtre appellent la fonction NdisFIndicateReceiveNetBufferLists pour indiquer les données reçues. La fonction NdisFIndicateReceiveNetBufferLists transmet la liste indiquée des structures NET_BUFFER_LIST jusqu’à la pile aux pilotes qui se superposent. Le pilote de filtre alloue les structures des pools qu’il a créés lors de l’initialisation.

Si un pilote de filtre définit l’indicateur de NDIS_RECEIVE_FLAGS_RESOURCES dans le paramètre ReceiveFlags de NdisFIndicateReceiveNetBufferLists, cela indique que le pilote de filtre doit récupérer immédiatement la propriété des structures NET_BUFFER_LIST . Dans ce cas, NDIS n’appelle pas la fonction FilterReturnNetBufferLists du pilote de filtre pour retourner les structures NET_BUFFER_LIST . Le pilote de filtre reprend la propriété immédiatement après le retour de NdisFIndicateReceiveNetBufferLists .

Si un pilote de filtre ne définit pas l’indicateur de NDIS_RECEIVE_FLAGS_RESOURCES dans le paramètre ReceiveFlags de NdisFIndicateReceiveNetBufferLists, NDIS renvoie les structures NET_BUFFER_LIST indiquées à la fonction FilterReturnNetBufferLists du pilote de filtre. Dans ce cas, le pilote de filtre abandonne la propriété des structures indiquées jusqu’à ce que NDIS les retourne à FilterReturnNetBufferLists.

Note Un pilote de filtre doit suivre les indications de réception qu’il lance et s’assurer qu’il n’appelle pas la fonction NdisFReturnNetBufferLists une fois l’opération de réception terminée.

Filtrage des indications de réception

La figure suivante illustre une indication de réception filtrée initiée par un pilote sous-jacent.

Diagramme illustrant une indication de réception filtrée initiée par un pilote sous-jacent.

NDIS appelle la fonction FilterReceiveNetBufferLists d’un pilote de filtre pour traiter les indications de réception provenant de pilotes sous-jacents. NDIS appelle FilterReceiveNetBufferLists après qu’un pilote sous-jacent appelle une fonction d’indication de réception (par exemple, NdisMIndicateReceiveNetBufferLists) pour indiquer les données réseau ou les données de bouclage reçues.

Si l’indicateur NDIS_RECEIVE_FLAGS_RESOURCES dans le paramètre ReceiveFlags de FilterReceiveNetBufferLists n’est pas défini, le pilote de filtre conserve la propriété des structures NET_BUFFER_LIST jusqu’à ce qu’il appelle la fonction NdisFReturnNetBufferLists .

Si l’indicateur NDIS_RECEIVE_FLAGS_RESOURCES dans le paramètre ReceiveFlags est défini, le pilote de filtre ne peut pas conserver la structure NET_BUFFER_LIST et les ressources allouées par le pilote sous-jacentes associées. Cet indicateur peut indiquer que le pilote sous-jacent est faible sur les ressources de réception. La fonction FilterReceiveNetBufferLists doit retourner aussi rapidement que possible.

Note Si l’indicateur NDIS_RECEIVE_FLAGS_RESOURCES est défini, le pilote de filtre doit conserver l’ensemble d’origine des structures NET_BUFFER_LIST dans la liste liée. Par exemple, lorsque cet indicateur est défini, le pilote peut traiter les structures et les indiquer une par une dans la pile, mais avant que la fonction ne retourne, il doit restaurer la liste liée d’origine.

Les pilotes de filtre peuvent effectuer des opérations de filtre sur les données reçues avant d’indiquer que les données sont sur-lesquelles les pilotes sont trop. Pour chaque mémoire tampon soumise à sa fonction FilterReceiveNetBufferLists , un pilote de filtre peut effectuer les opérations suivantes :

  • Passez-le au pilote de dépassement suivant en appelant NdisFIndicateReceiveNetBufferLists. Le pilote peut modifier le contenu de la mémoire tampon. NDIS garantit la disponibilité de l’espace de contexte (voir NET_BUFFER_LIST_CONTEXT structure).

    Un pilote de filtre peut modifier le status que NDIS a transmis à FilterReceiveNetBufferLists ou simplement le transmettre à NdisFIndicateReceiveNetBufferLists.

    Note Un pilote de filtre peut transmettre une mémoire tampon avec NdisFIndicateReceiveNetBufferLists même si NDIS définit l’indicateur NDIS_RECEIVE_FLAGS_RESOURCES dans le paramètre ReceiveFlags de FilterReceiveNetBufferLists. Dans ce cas, le pilote de filtre ne doit pas retourner à partir de FilterReceiveNetBufferLists tant qu’il n’a pas repris la propriété de la mémoire tampon.

  • Ignorez la mémoire tampon. Si NDIS a effacé l’indicateur de NDIS_RECEIVE_FLAGS_RESOURCES dans le paramètre ReceiveFlags de FilterReceiveNetBufferLists, appelez la fonction NdisFReturnNetBufferLists pour ignorer la mémoire tampon. Si NDIS définit l’indicateur NDIS_RECEIVE_FLAGS_RESOURCES dans le paramètre ReceiveFlags de FilterReceiveNetBufferLists, n’effectuez aucune action et retournez à partir de FilterReceiveNetBufferLists pour ignorer la mémoire tampon.

  • Mettre en file d’attente la mémoire tampon dans une structure de données locale pour un traitement ultérieur. Si NDIS définit l’indicateur NDIS_RECEIVE_FLAGS_RESOURCES dans le paramètre ReceiveFlags de FilterReceiveNetBufferLists, le pilote de filtre doit créer une copie avant de retourner à partir de FilterReceiveNetBufferLists.

  • Copiez la mémoire tampon et proviennent d’une indication de réception avec la copie. L’indication de réception est similaire à une indication de réception initiée par le pilote de filtre. Dans ce cas, le pilote doit retourner la mémoire tampon d’origine au pilote sous-jacent.

La fonction NdisFIndicateReceiveNetBufferLists transmet la liste indiquée des structures NET_BUFFER_LIST jusqu’à la pile des pilotes aux pilotes qui se superposent. L’opération de réception se poursuit de la même façon qu’une opération de réception lancée par un pilote de filtre.

Si un pilote overlying conserve la propriété de la mémoire tampon, NDIS appelle la fonction FilterReturnNetBufferLists pour le module de filtre. Dans sa fonction FilterReturnNetBufferLists , le pilote de filtre annule les opérations qu’il a effectuées sur la mémoire tampon sur le chemin d’indication de réception.

Lorsque le module de filtre de couche le plus bas indique qu’il est effectué avec une mémoire tampon, NDIS retourne la mémoire tampon au pilote miniport. Si NDIS a effacé l’indicateur de NDIS_RECEIVE_FLAGS_RESOURCES dans le paramètre ReceiveFlags de FilterReceiveNetBufferLists, le pilote de filtre appelle NdisFReturnNetBufferLists pour renvoyer la mémoire tampon. Si NDIS définit l’indicateur NDIS_RECEIVE_FLAGS_RESOURCES dans le paramètre ReceiveFlags de FilterReceiveNetBufferLists, le retour de FilterReceiveNetBufferLists renvoie la mémoire tampon.