Filtrage des requêtes OID dans un pilote de filtre NDIS
Les pilotes de filtre peuvent traiter les requêtes OID qui proviennent de pilotes trop. NDIS appelle la fonction FilterOidRequest pour traiter chaque requête OID. Les pilotes de filtre peuvent transférer les requêtes OID aux pilotes sous-jacents en appelant la fonction NdisFOidRequest .
NDIS peut appeler la fonction FilterCancelOidRequest d’un pilote de filtre pour annuler une requête OID. Lorsque NDIS appelle FilterCancelOidRequest, le pilote de filtre doit essayer d’appeler la fonction NdisFOidRequest dès que possible.
La figure suivante illustre une requête OID filtrée.
Le pilote de filtre peut terminer la requête OID de manière synchrone ou asynchrone en retournant NDIS_STATUS_SUCCESS ou NDIS_STATUS_PENDING, respectivement, à partir de FilterOidRequest. FilterOidRequest peut également se terminer de manière synchrone avec une erreur status.
Un pilote de filtre qui gère correctement une demande de jeu d’OID doit définir le membre SupportedRevision dans la structure NDIS_OID_REQUEST lors du retour de la demande de jeu d’OID. Le membre SupportedRevision avertit l’initiateur de la requête OID concernant la révision prise en charge par le pilote. Pour plus d’informations sur les informations de version dans les structures NDIS, consultez Spécification des informations de version NDIS.
Si FilterOidRequest retourne NDIS_STATUS_PENDING, il doit appeler la fonction NdisFOidRequestComplete après avoir terminé la requête OID. Dans ce cas, le pilote transmet les résultats de la requête au paramètre OidRequest de NdisFOidRequestComplete. Le pilote passe la dernière status de la demande au paramètre Status de NdisFOidRequestComplete.
Si FilterOidRequest retourne NDIS_STATUS_SUCCESS, il retourne les résultats d’une requête dans la structure NDIS_OID_REQUEST au niveau du paramètre OidRequest . Dans ce cas, le pilote n’appelle pas la fonction NdisFOidRequestComplete .
Pour transférer une requête OID aux pilotes sous-jacents, un pilote de filtre appelle la fonction NdisFOidRequest . Si une demande ne doit pas être transférée aux pilotes sous-jacents, un pilote de filtre peut terminer la demande immédiatement. Pour terminer la requête sans transfert, le pilote peut retourner NDIS_STATUS_SUCCESS (ou une erreur status) à partir de FilterOidRequest, ou il peut appeler NdisFOidRequestComplete après avoir retourné NDIS_STATUS_PENDING.
Note Avant que le pilote appelle NdisFOidRequest, le pilote doit allouer une structure NDIS_OID_REQUEST et transférer les informations de demande à la nouvelle structure en appelant NdisAllocateCloneOidRequest.
La requête transférée se poursuit de la même façon qu’une requête initiée par un pilote de filtre. Pour plus d’informations, consultez Génération de requêtes OID à partir d’un pilote de filtre NDIS.
Une fois que les pilotes sous-jacents ont terminé une requête transférée, le pilote de filtre peut modifier la réponse, si nécessaire, et la transmettre aux pilotes qui se superposent.
Un pilote de filtre peut recevoir des requêtes OID de pilotes sur-ment lorsqu’il se trouve dans l’état Redémarrage, Exécution, Suspension ou Pause .
Note Comme les pilotes miniport, les pilotes de filtre ne peuvent recevoir qu’une seule requête OID à la fois. Étant donné que NDIS sérialise les requêtes envoyées à un module de filtre, un pilote de filtre ne peut pas être appelé sur FilterOidRequest avant de terminer la requête précédente.
Voici un exemple de pilote de filtre qui modifie une requête OID :
- Un pilote de filtre ajoute un en-tête. Dans ce cas, une fois que le pilote a reçu une réponse à une requête pour OID_GEN_MAXIMUM_FRAME_SIZE des pilotes sous-jacents, le filtre soustrait la taille de son en-tête de la réponse. Le pilote soustrait sa taille d’en-tête, car le pilote insère un en-tête devant chaque paquet envoyé et supprime l’en-tête dans chaque paquet reçu.