Remise en file d’attente des demandes d’E/S

Les pilotes peuvent mettre en file d’attente les demandes d’E/S qu’ils obtiennent à partir d’une file d’attente d’E/S. Un pilote peut renvoyer une demande d’E/S dans une autre file d’attente d’E/S que le pilote a créée pour le même appareil. En outre, un pilote de bus peut mettre une demande d’E/S de la file d’attente d’E/S d’un appareil enfant vers la file d’attente d’E/S d’un appareil parent.

Mise en file d’attente d’une demande d’E/S dans une autre file d’attente d’E/S pour un appareil

Une fois que les gestionnaires de requêtes d’un pilote reçoivent une demande d’E/S de la file d’attente d’E/S d’un pilote, le pilote peut appeler WdfRequestForwardToIoQueue pour remettre la demande en file d’attente à une autre file d’attente.

Par exemple, si vous souhaitez que votre pilote alloue des ressources à une demande avant de traiter la demande, la fonction de rappel EvtIoDefault du pilote peut recevoir toutes les requêtes, stocker les informations de ressource dans la mémoire contextuelle de chaque requête, puis appeler WdfRequestForwardToIoQueue pour mettre chaque requête en file d’attente supplémentaire.

Si votre pilote appelle WdfRequestForwardToIoQueue pour mettre en file d’attente une demande d’E/S obtenue par le pilote à partir d’une file d’attente d’E/S qui utilise la méthode de distribution séquentielle, l’infrastructure remet la requête d’E/S suivante de la file d’attente séquentielle au pilote sans attendre la fin de la demande reléguée.

Si votre pilote utilise la méthode de répartition manuelle, il peut appeler la méthode WdfRequestRequeue pour retourner une demande d’E/S au début de la file d’attente d’E/S à partir de laquelle le pilote l’a obtenue. Après avoir appelé WdfRequestRequeue, le prochain appel du pilote à WdfIoQueueRetuerieveNextRequest récupère la requête reléguée.

Mise en file d’attente d’une demande d’E/S dans la file d’attente d’E/S d’un appareil parent

Un pilote de fonction pour un appareil parent peut agir comme un pilote de bus qui énumère les appareils enfants de l’appareil parent et crée des objets de périphérique physique (PPO) pour les appareils enfants. Ces pilotes peuvent parfois recevoir des demandes d’E/S pour un appareil enfant que l’appareil parent doit gérer.

Par exemple, un bus de protocole (comme USB) contrôle généralement les ressources matérielles affectées à chaque appareil connecté. Par conséquent, le pilote de fonction pour le bus parent gère généralement les opérations d’E/S pour chaque appareil enfant. Lorsque le gestionnaire d’E/S envoie une demande d’E/S à la pile de périphériques de l’un des appareils enfants, le pilote de fonction pour le bus reçoit la demande d’E/S dans l’une des files d’attente d’E/S de l’appareil enfant, car ce pilote a créé l’AOP de l’appareil enfant. Avant que le pilote puisse traiter la demande d’E/S dans le contexte de l’appareil de bus parent, il doit renvoyer la demande d’E/S de la file d’attente d’E/S de l’appareil enfant vers une file d’attente d’E/S qui appartient à l’appareil parent.

Toutefois, les pilotes ne peuvent pas appeler WdfRequestForwardToIoQueue pour déplacer les requêtes de la file d’attente d’un enfant vers la file d’attente d’un parent. Étant donné que le gestionnaire d’E/S crée des piles d’appareils distinctes pour les appareils parents et enfants, l’objet d’appareil WDM sous-jacent doit d’abord être remplacé par un objet représentant l’appareil enfant par un objet qui représente le parent.

Avant la version 1.9 de KMDF, les pilotes pouvaient envoyer des demandes d’E/S à partir d’un appareil enfant à son parent uniquement en créant des cibles d’E/S distantes, en augmentant la taille de la pile de périphériques de l’appareil enfant et en spécifiant l’objet de périphérique WDM approprié.

À compter de la version 1.9 de KMDF, un pilote peut appeler WdfPdoInitAllowForwardingRequestToParent avant de créer un appareil enfant, puis appeler WdfRequestForwardToParentDeviceIoQueue pour remettre une demande de la file d’attente d’E/S de l’enfant à une file d’attente parente. Si un pilote utiliseWdfPdoInitAllowForwardingRequestToParent et WdfRequestForwardToParentDeviceIoQueue, le framework augmente la taille de la pile de périphériques de l’enfant et affecte l’objet de périphérique WDM approprié à la demande d’E/S.