Partager via


Méthodes de distribution pour les demandes d’E/S

Lorsqu’un pilote appelle WdfIoQueueCreate pour créer une file d’attente d’E/S, il spécifie une méthode de distribution pour la file d’attente. L’infrastructure fournit trois méthodes de répartition : séquentielle, parallèle et manuelle. Le pilote peut spécifier l’une de ces méthodes de distribution pour n’importe quelle file d’attente d’E/S, y compris la file d’attente d’E/S par défaut d’un appareil.

Le pilote définit la méthode de distribution d’une file d’attente en spécifiant une valeur de type WDF_IO_QUEUE_DISPATCH_TYPE dans la structure WDF_IO_QUEUE_CONFIG de la file d’attente.

Pour obtenir des exemples d’utilisations de chaque méthode de distribution, consultez Exemples d’utilisations de files d’attente d’E/S.

Distribution séquentielle

Si votre pilote ou appareil ne peut traiter qu’une seule demande d’E/S à partir d’une file d’attente à la fois, vous devez configurer les files d’attente d’E/S de l’appareil pour utiliser la répartition séquentielle, également appelée distribution synchrone. Avec ce type de distribution, l’infrastructure remet les requêtes au pilote une par une. L’infrastructure ne remet pas la requête suivante tant que le pilote n’a pas terminé, annulé ou remettent en file d’attente la requête précédente.

Une fois que l’infrastructure a livré une requête à l’un des gestionnaires de requêtes du pilote, le pilote traite la demande. Si le pilote transfère la requête à une cible d’E/S générale, il appelle généralement l’une des méthodes synchrones de l’objet cible d’E/S. Pour plus d’informations sur ces méthodes, consultez Envoi de demandes d’E/S de manière synchrone. Le pilote doit terminer ou annuler chaque requête qu’il reçoit d’une file d’attente d’E/S.

Un pilote qui a configuré une file d’attente d’E/S pour la distribution séquentielle peut appeler WdfIoQueueRetrieveNextRequest ou WdfIoQueueRetrieveRequestByFileObject pour obtenir une autre requête de la file d’attente avant que la dernière requête reçue soit terminée ou annulée. Vous pouvez le faire dans un pilote de fonction, afin que le pilote puisse démarrer l’opération matérielle suivante tandis que la fonction de rappel EvtInterruptDpc du pilote traite toujours les données de l’opération matérielle précédente.

Si vous créez plusieurs files d’attente d’E/S et que vous les configurez toutes pour la distribution séquentielle, l’infrastructure distribue les demandes de chaque file d’attente de manière séquentielle, mais les files d’attente s’exécutent en parallèle. Si votre pilote ou votre appareil ne peut traiter qu’une seule requête à la fois de n’importe quel type, vous devez utiliser une file d’attente d’E/S unique avec une fonction de rappel EvtIoDefault .

Distribution parallèle

Si votre pilote et votre appareil peuvent traiter plusieurs demandes d’E/S simultanément, vous pouvez configurer les files d’attente d’E/S de l’appareil pour utiliser la distribution parallèle afin que le pilote puisse traiter les demandes de manière asynchrone. Cette méthode de répartition est également appelée répartition asynchrone.

Si un pilote configure une file d’attente d’E/S pour utiliser la distribution parallèle, l’infrastructure remet les demandes d’E/S au pilote dès qu’elles sont disponibles dans la file d’attente. Le résultat est que le pilote peut être amené à traiter plusieurs demandes à la fois.

Chaque fois que l’un des gestionnaires de requêtes du pilote reçoit une demande, le pilote doit traiter la demande , puis la terminer . Si le pilote transfère la requête à une cible d’E/S générale, il appelle généralement l’une des méthodes asynchrones de l’objet cible d’E/S. Pour plus d’informations sur ces méthodes, consultez Envoi asynchrone de demandes d’E/S. Le pilote doit terminer ou annuler chaque requête qu’il reçoit d’une file d’attente d’E/S.

Un pilote qui utilise la répartition parallèle peut appeler WdfIoQueueStop ou WdfIoQueueStopSynchronously pour arrêter temporairement une file d’attente, puis appeler WdfIoQueueStart pour redémarrer la file d’attente.

Distribution manuelle

Si vous souhaitez que votre pilote ait un contrôle total sur la remise des demandes d’E/S, vous pouvez configurer la file d’attente d’E/S d’un appareil pour utiliser la distribution manuelle, ce qui signifie que l’infrastructure ne remet pas de demandes au pilote, sauf si le pilote en demande explicitement une.

Pour obtenir une requête à partir d’une file d’attente manuelle, le pilote peut appeler WdfIoQueueRetrieveNextRequest ou WdfIoQueueRetrieveRequestByFileObject dans une boucle qui interroge la file d’attente. Le pilote peut également appeler WdfIoQueueReadyNotify pour inscrire une fonction de rappel que l’infrastructure appellera lorsqu’une ou plusieurs demandes sont disponibles dans la file d’attente. Une fois que le framework a appelé la fonction de rappel, le pilote peut appeler WdfIoQueueRetrieveNextRequest ou WdfIoQueueRetrieveRequestByFileObject dans une boucle pour récupérer les demandes.

Une fois que le pilote a obtenu une requête de la file d’attente, il doit traiter la demande. Le pilote doit terminer ou annuler chaque requête.