Partager via


Envoi de demandes d’E/S à une cible d’E/S générale dans UMDF

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 se trouvent dans la Windows 11, version 22H2 - Mise à jour des exemples de pilotes de mai 2022.

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

Un pilote UMDF peut envoyer des demandes d’E/S à des cibles d’E/S générales de manière synchrone ou asynchrone.

Si un pilote envoie des demandes d’E/S de manière synchrone, un thread de pilote envoie les requêtes une par une. Le thread attend que chaque requête se termine avant d’envoyer la suivante. Ce processus est plus simple que l’envoi des demandes d’E/S de manière asynchrone. Le pilote peut envoyer des demandes d’E/S de manière synchrone s’il n’envoie pas beaucoup de requêtes et si les performances du système ou de l’appareil ne sont pas réduites pendant que le pilote attend chaque demande d’E/S.

Si un pilote envoie des demandes d’E/S de manière asynchrone, un thread de pilote envoie chaque requête dès que la demande est prête à être envoyée, sans attendre que les demandes précédemment envoyées se terminent. Si le pilote doit gérer de nombreuses demandes d’E/S dans un court laps de temps, il ne peut probablement pas attendre que chaque requête se termine avant d’envoyer la requête suivante. Sinon, le pilote risque de perdre des données ou les performances de ses appareils et, éventuellement, de l’ensemble du système peut être réduit.

Avant qu’un pilote UMDF puisse envoyer une demande d’E/S à une cible d’E/S, le pilote doit mettre en forme la demande. Le tableau suivant répertorie les méthodes que le pilote peut appeler pour mettre en forme les demandes d’E/S. Le pilote peut utiliser ces méthodes pour mettre en forme une requête que le pilote a reçue dans l’une de ses files d’E/S ou que le pilote a créée.

Méthode Objectif

IWDFIoRequest::FormatUsingCurrentType

Met en forme une requête que le pilote a reçue de l’infrastructure afin que le pilote puisse envoyer la demande, sans modification, à la cible

IWDFIoTarget::FormatRequestForIoctl

Met en forme une demande de contrôle d’appareil

IWDFIoTarget::FormatRequestForRead

Met en forme une demande de lecture

IWDFIoTarget::FormatRequestForWrite

Met en forme une demande d’écriture

IWDFIoTarget2::FormatRequestForFlush

Met en forme une demande pour vider les mémoires tampons.

IWDFIoTarget2::FormatRequestForQueryInformation

Met en forme une demande d’obtention d’informations de fichier.

IWDFIoTarget2::FormatRequestForSetInformation

Met en forme une demande de définition des informations de fichier.

Pour envoyer la demande d’E/S à la cible d’E/S, le pilote appelle la méthode IWDFIoRequest::Send . Pour envoyer la demande d’E/S de manière synchrone, le pilote transmet l’indicateur WDF_REQUEST_SEND_OPTION_SYNCHRONOUS au paramètre Flags . Sinon, le pilote envoie la demande d’E/S de manière asynchrone. Si le pilote envoie la demande d’E/S de manière asynchrone, il nécessite généralement une notification lorsqu’un autre pilote termine la demande. Le pilote doit définir une fonction de rappel IRequestCallbackRequestCompletion::OnCompletion et l’inscrire en appelant la méthode IWDFIoRequest::SetCompletionCallback . Pour plus d’informations, consultez Terminer les demandes d’E/S.

Un pilote qui appelle IWDFIoRequest::Send pour envoyer une demande d’E/S peut tenter d’annuler la demande ultérieurement en appelant la méthode IWDFIoRequest::CancelSentRequest . Si le pilote annule une demande d’E/S reçue par le pilote de l’infrastructure, il doit toujours effectuer la demande en appelant la méthode IWDFIoRequest::Complete ou IWDFIoRequest::CompleteWithInformation avec le paramètre CompletionStatus défini sur STATUS_CANCELLED. Si le pilote a créé l’objet de requête, le pilote appelle IWDFObject::D eleteWdfObject au lieu de terminer la demande.