Configuration du mode de distribution pour une file d’attente d’E/S

Avertissement

UMDF 2 est la dernière version d’UMDF et remplace UMDF 1. Tous les nouveaux pilotes UMDF doivent être écrits à l’aide d’UMDF 2. Aucune nouvelle fonctionnalité n’est ajoutée à UMDF 1 et la prise en charge d’UMDF 1 est limitée sur les versions plus récentes de Windows 10. Les pilotes Windows universels doivent utiliser UMDF 2.

Les exemples UMDF 1 archivés sont disponibles dans la mise à jour des exemples de pilotes Windows 11, version 22H2 - Mai 2022.

Pour plus d’informations, consultez Prise en main avec UMDF.

Lorsque les demandes d’E/S provenant d’applications arrivent, l’infrastructure place chaque requête dans la file d’attente d’E/S appropriée. La façon dont et le moment où les requêtes sont remises au pilote dépendent de la façon dont le pilote configure la distribution pour la file d’attente d’E/S et de la façon dont le pilote spécifie la synchronisation des fonctions de rappel. La file d’attente d’E/S interagit également avec le PnP et le sous-système de gestion de l’alimentation d’UMDF pour contenir les demandes d’E/S dans la file d’attente jusqu’à ce que l’appareil atteigne l’état approprié.

Note Le mode de répartition de la file d’attente d’E/S n’est pas lié au mode de synchronisation. La configuration de répartition de la file d’attente d’E/S contrôle le nombre de demandes que le pilote peut accepter pour traitement à tout moment, tandis que la synchronisation contrôle l’exécution simultanée des fonctions de rappel d’événements qui présentent ou annulent des demandes. Toutefois, plusieurs modes de fonctionnement sont créés en combinant les modes de distribution et de synchronisation.

Le pilote configure la distribution d’une file d’attente d’E/S lorsque le pilote appelle la méthode IWDFDevice::CreateIoQueue pour configurer la file d’attente par défaut ou créer une file d’attente secondaire. Le pilote peut spécifier l’une des valeurs du type d’énumération WDF_IO_QUEUE_DISPATCH_TYPE dans le paramètre DispatchType de IWDFDevice::CreateIoQueue pour identifier le mode de répartition. Un objet file d’attente d’E/S peut prendre en charge les modes de distribution suivants :

  • Séquentiel

    Le mode de répartition séquentiel est spécifié à l’aide de la valeur WdfIoQueueDispatchSequential . Dans ce mode de répartition, une file d’attente à l’état de traitement déclenche des événements afin qu’un pilote ne traite qu’une seule requête à la fois. La file d’attente reporte toutes les demandes supplémentaires jusqu’à ce que le pilote termine le traitement de sa requête actuelle ou appelle la méthode IWDFIoRequest::ForwardToIoQueue pour remettre la demande en file d’attente. Une fois la requête actuelle terminée ou transférée, la file d’attente déclenche un événement pour fournir la requête suivante.

  • Parallèle

    Le mode de répartition parallèle est spécifié à l’aide de la valeur WdfIoQueueDispatchParallel . Dans ce mode de répartition, une file d’attente à l’état de traitement déclenche des événements dès que les demandes d’E/S sont prêtes pour le pilote. Lorsque le pilote reçoit une demande d’E/S, il peut traiter la demande d’E/S de l’une des manières suivantes :

    • Le pilote appelle la méthode IWDFIoRequest::Complete ou IWDFIoRequest::CompleteWithInformation pour terminer immédiatement la demande d’E/S. Un pilote termine immédiatement la demande d’E/S si la demande d’E/S n’est pas valide, ne peut jamais être servie ou peut être effectuée en copiant des données à partir d’une mémoire tampon ou d’un cache contenant les données.
    • Le pilote appelle la méthode IWDFIoRequest::ForwardToIoQueue pour renvoyer la demande d’E/S.
    • Le pilote appelle la méthode IWDFIoRequest::Send pour passer la demande d’E/S à un pilote de niveau inférieur.
  • Manuel

    Le mode de répartition manuelle est spécifié à l’aide de la valeur WdfIoQueueDispatchManual . Dans ce mode de répartition, la file d’attente d’E/S n’avertit pas automatiquement le pilote lorsque les demandes arrivent dans la file d’attente. Le pilote doit appeler la méthode IWDFIoQueue::RetrieveNextRequest pour récupérer manuellement les requêtes de la file d’attente. Il s’agit d’un modèle d’interrogation.

    Dans les versions UMDF 1.9 et ultérieures, si votre pilote utilise le mode de répartition manuelle, il peut appeler IWDFIoRequest2::Requeue pour renvoyer 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é IWDFIoRequest2::Requeue, le prochain appel du pilote à IWDFIoQueue::RetrieveNextRequest récupère la requête reléguée.

Pour tous les modes de distribution, l’objet file d’attente d’E/S reçoit et suit la demande jusqu’à ce que le pilote gère la demande ou que la demande soit annulée.

Si le pilote configure la file d’attente pour la distribution en série ou en parallèle, l’infrastructure informe le pilote d’une requête par le biais des fonctions de rappel qui sont inscrites par le pilote lorsque le pilote crée la file d’attente ou configure la file d’attente par défaut. Pour plus d’informations, consultez Fonctions de rappel d’événements de file d’attente d’E/S.