Transfert de demandes d’E/S

Lorsqu’un pilote reçoit une demande d’E/S qu’il ne peut pas traiter, il effectue généralement l’une des opérations suivantes :

  • Il transfère la demande reçue à un autre pilote.

  • Il crée des requêtes supplémentaires et les envoie à un autre pilote.

Les pilotes basés sur l’infrastructure transfèrent les requêtes à l’aide de cibles d’E/S, qui représentent d’autres pilotes sur le système. Les pilotes peuvent utiliser l’une des techniques suivantes pour transférer une demande à une cible d’E/S :

  • Un pilote peut transférer des demandes d’E/S vers le pilote inférieur suivant en appelant WdfDeviceGetIoTarget, suivi de WdfRequestFormatRequestUsingCurrentType et enfin de WdfRequestSend.

    Cette technique n’est utile que si le pilote reçoit une demande qu’il n’a pas besoin de modifier avant le transfert.

  • Un pilote peut appeler WdfFdoInitSetFilter pour s’inscrire en tant que pilote de filtre.

    Si un pilote de filtre ne fournit pas de file d’attente d’E/S pour un type particulier de demande d’E/S, l’infrastructure transfère automatiquement les requêtes de ce type au pilote suivant.

  • En règle générale, un pilote de fonction examine le contenu de chaque demande d’E/S. Si un pilote de fonction ne peut pas traiter une requête, il peut la modifier et la transférer à une cible d’E/S. Il peut également créer une ou plusieurs nouvelles requêtes et les envoyer à une cible d’E/S.

    L’objet cible d’E/S de l’infrastructure définit plusieurs méthodes pour envoyer des demandes d’E/S à d’autres pilotes. Par exemple, un pilote peut appeler WdfIoTargetFormatRequestForRead, suivi de WdfRequestSend, pour envoyer une demande de lecture à une cible d’E/S. Pour plus d’informations sur les cibles d’E/S, consultez Utilisation des cibles d’E/S.

    Rarement, un enregistreur de pilotes peut vouloir spécifier le contenu de l’emplacement de la pile d’E/ S WDM sous-jacente d’une requête avant d’envoyer une requête à une cible d’E/S. Dans ce cas, le pilote peut appeler WdfRequestWdmFormatUsingStackLocation avant d’appeler WdfRequestSend.

Parfois, un pilote doit envoyer la même demande à plusieurs cibles d’E/S, généralement parce que le pilote doit envoyer une seule commande à tous ses appareils. Avant d’envoyer une requête à une cible d’E/S, le pilote peut appeler WdfRequestChangeTarget pour vérifier que la cible d’E/S est accessible.

Le pilote doit terminer chaque requête qu’il transfère à une cible d’E/S, sauf s’il définit l’indicateur WDF_REQUEST_SEND_OPTION_SEND_AND_FORGET lors de l’appel de WdfRequestSend.

Notez que lorsqu’un pilote transfère une requête, l’infrastructure ne transfère pas littéralement l’objet de demande d’infrastructure du pilote d’envoi vers le pilote de réception. Au lieu de cela, l’infrastructure crée un objet de requête dans le pilote qui reçoit la demande. Seul le paquet de demandes d’E/S sous-jacent (IRP) de la demande est transféré d’un pilote à un autre.