Création d’objets de demande d’infrastructure

Les objets de requête d’infrastructure représentent les demandes d’E/S que le gestionnaire d’E/S a envoyées à un pilote. Les pilotes basés sur l’infrastructure traitent chaque demande d’E/S en appelant des méthodes d’objet de demande d’infrastructure.

Chaque requête d’E/S contient un paquet de demande d’E/S WDM (structure IRP ), mais les pilotes basés sur l’infrastructure n’ont généralement pas besoin d’accéder à la structure IRP.

La plupart des objets de demande d’infrastructure sont créés par l’infrastructure, mais votre pilote peut également créer des objets de requête.

Objets de requête créés par l’infrastructure

Lorsqu’un pilote basé sur l’infrastructure reçoit un paquet de demande d’E/S (IRP) du gestionnaire d’E/S, l’infrastructure intercepte l’IRP et crée un objet de requête d’infrastructure. L’infrastructure place l’objet de requête dans une file d’attente d’E/S et, si le pilote a des gestionnaires de requêtes inscrits pour la file d’attente, appelle le gestionnaire approprié.

Le diagramme suivant illustre les étapes qui se produisent lorsque l’infrastructure crée un objet de requête pour une opération de lecture.

Diagramme illustrant les étapes de création d’un objet de requête pour une opération de lecture dans un pilote basé sur l’infrastructure.

Les étapes suivantes correspondent aux nombres du diagramme précédent :

  1. Une application en mode utilisateur lit un fichier en appelant la fonction ReadFile Microsoft Win32.

  2. La fonction ReadFile appelle le gestionnaire d’E/S, qui s’exécute en mode noyau.

  3. Le gestionnaire d’E/S alloue une structure IRP et stocke un code de fonction IRP_MJ_READ dans la structure.

  4. Le gestionnaire d’E/S appelle la routine de pilote standard DispatchRead pour le pilote x, en passant un pointeur vers la structure IRP. Étant donné que le pilote x est un pilote basé sur l’infrastructure, l’infrastructure fournit la routine DispatchRead du pilote.

  5. L’infrastructure crée un objet de requête qui représente la structure IRP. L’infrastructure ajoute l’objet de requête à l’un des objets de file d’attente du pilote.

  6. L’infrastructure appelle le gestionnaire de requêtes EvtIoRead du pilote, en passant un handle d’objet file d’attente et un handle d’objet de requête.

Objets de requête créés par un pilote

Les pilotes basés sur l’infrastructure peuvent également créer des objets de requête. Par exemple, un pilote peut créer des objets de requête s’il reçoit une demande de lecture ou d’écriture pour une quantité de données supérieure à ce que les cibles d’E/S du pilote peuvent gérer à la fois. Dans une telle situation, le pilote peut diviser les données en plusieurs demandes plus petites et utiliser des objets de requête supplémentaires pour envoyer ces demandes plus petites à une ou plusieurs cibles d’E/S.

Pour créer un objet de requête, votre pilote doit appeler WdfRequestCreate suivi des méthodes d’objet framework qui initialisent la requête, telles que WdfUsbTargetPipeFormatRequestForRead.

Si un pilote reçoit des IRP WDM dans une routine de distribution WDM et les effectue ou les transfère à l’aide de l’infrastructure, le pilote peut appeler WdfRequestCreateFromIrp.