Partager via


Accès aux mémoires tampons de données dans les pilotes UMDF 1.x

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.

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

Pour plus d’informations sur l’accès aux mémoires tampons de données pour UMDF 2, consultez Accès aux mémoires tampons de données dans les pilotes WDF.

Lorsqu’un pilote reçoit une demande de contrôle d’E/S de lecture, d’écriture ou de périphérique, l’objet de requête contient soit une mémoire tampon d’entrée, soit une mémoire tampon de sortie, soit les deux. (Quelques demandes de contrôle d’E/S d’appareil fournissent deux entrées, deux sorties ou deux mémoires tampons d’entrée/sortie.)

Les mémoires tampons d’entrée contiennent des informations dont le pilote a besoin. Pour les demandes d’écriture, ces informations sont généralement des données qu’un pilote de fonction doit envoyer à un appareil. Pour les demandes de contrôle d’E/S d’appareil, une mémoire tampon d’entrée peut contenir des informations indiquant le type d’opération que le pilote doit effectuer.

Les mémoires tampons de sortie reçoivent des informations du pilote. Pour les demandes de lecture, ces informations sont généralement des données qu’un pilote de fonction reçoit d’un appareil. Pour les demandes de contrôle d’E/S d’appareil, une mémoire tampon de sortie peut recevoir status ou d’autres informations que le code de contrôle d’E/S de la demande spécifié.

La technique utilisée par votre pilote pour accéder aux mémoires tampons de données d’une requête peut dépendre de la méthode du pilote pour accéder aux mémoires tampons de données d’un appareil. UMDF prend en charge les méthodes d’accès à la mémoire tampon suivantes :

Une troisième méthode d’accès, qui n’est appelée ni E/S en mémoire tampon ni directe, n’est pas disponible pour les pilotes basés sur UMDF, mais UMDF peut convertir certaines demandes d’E/S de la méthode « aucun » en une méthode prise en charge par la version UMDF.

Dans la plupart des cas, les pilotes basés sur UMDF appellent les mêmes méthodes d’objet UMDF pour accéder aux mémoires tampons de données, que l’UMDF et le pilote utilisent des E/S mises en mémoire tampon ou des E/S directes. Les E/S directes offrent souvent de meilleures performances que les E/S de mémoire tampon.

Les sections suivantes de cette rubrique expliquent :

Spécification d’une méthode d’accès à la mémoire tampon par défaut

UMDF versions 1.9 et ultérieures prennent en charge à la fois les méthodes d’accès d’E/S directes et mises en mémoire tampon. Les pilotes peuvent spécifier la méthode d’accès que vous préférez utiliser pour toutes les demandes de contrôle d’E/S d’un appareil en appelant IWDFDeviceInitialize2::SetIoTypePreference avant d’appeler IWDFDriver::CreateDevice pour créer un objet d’appareil. Par exemple, si un pilote spécifie une préférence pour la méthode d’E/S mise en mémoire tampon uniquement pour les demandes de lecture et d’écriture pour l’un de ses appareils, le processus hôte du pilote UMDF utilise la méthode d’E/S mise en mémoire tampon lorsqu’il transmet des demandes de lecture et d’écriture au pilote pour cet appareil. Si un pilote spécifie une préférence pour les E/S directes, UMDF peut (mais peut ne pas) utiliser les E/S directes. Pour plus d’informations sur le moment où UMDF utilise les E/S directes, consultez Comment UMDF choisit une méthode d’accès à la mémoire tampon pour une demande d’E/S.

Pour chaque appareil pris en charge par un pilote, le pilote peut spécifier une préférence pour les E/S mises en mémoire tampon, pour les E/S directes, ou pour les E/S en mémoire tampon ou directes pour l’appareil. Le pilote peut spécifier un type de méthode d’accès pour les demandes de lecture et d’écriture et un autre type de méthode d’accès pour les demandes de contrôle d’E/S d’appareil. Si le pilote ne spécifie pas de préférence de méthode d’accès, UMDF utilise la méthode mise en mémoire tampon.

Pour les demandes de contrôle d’E/S d’appareil, le code de contrôle d’E/S (IOCTL) spécifie la méthode d’accès à la mémoire tampon. (Pour plus d’informations sur la façon dont les IOCTL spécifient une méthode d’accès, consultez Définition des codes de contrôle d’E/S.) Toutefois, la méthode d’accès utilisée par UMDF peut ne pas correspondre à la méthode d’accès spécifiée par IOCTL.

Spécification d’un mode de récupération de mémoire tampon

Dans les versions UMDF antérieures à la version 1.9, UMDF met toujours les mémoires tampons d’une requête d’E/S à la disposition du pilote (en copiant les mémoires tampons dans le processus hôte du pilote UMDF) dès qu’UMDF reçoit la demande d’E/S. Ce mode de récupération de mémoire tampon est appelé récupération immédiate. En cas d’échec, UMDF termine la demande d’E/S avec une valeur d’échec status et ne remet pas la demande d’E/S au pilote.

UMDF versions 1.9 et ultérieures prennent en charge les modes de récupération immédiate et différée . Le mode de récupération différée reporte la copie de la mémoire tampon d’une demande d’E/S dans le processus hôte du pilote jusqu’à ce que le pilote tente d’accéder à la mémoire tampon. En cas de défaillance, les fonctions d’accès à la mémoire tampon retournent une valeur d’erreur status au pilote.

Votre pilote peut spécifier un mode de récupération de mémoire tampon lorsqu’il appelle IWDFDeviceInitialize2::SetIoTypePreference pour chaque appareil. Utilisez les règles suivantes :

  • Si votre pilote spécifie la méthode d’accès direct aux E/S, il doit également spécifier le mode de récupération différé. Les E/S directes fonctionnent uniquement avec une récupération différée.

  • Tous les pilotes qui sont écrits pour s’exécuter avec UMDF versions 1.9 et ultérieures doivent spécifier le mode de récupération différé pour toutes les demandes d’E/S, que le pilote choisit la méthode d’accès d’E/S en mémoire tampon ou directe. La récupération différée offre de meilleures performances, car elle n’accède pas aux mémoires tampons que le pilote n’utilise pas.

Si votre pilote ne spécifie pas de mode de récupération de mémoire tampon, UMDF utilise la récupération immédiate.

Tous les pilotes UMDF d’une pile de pilotes doivent utiliser le même mode de récupération. Si certains pilotes spécifient une récupération immédiate et d’autres une récupération différée, UMDF utilise la récupération immédiate.

Comment UMDF choisit une méthode d’accès à la mémoire tampon pour une demande d’E/S

La méthode d’accès spécifiée par un pilote lorsqu’il appelle IWDFDeviceInitialize2::SetIoTypePreference n’est peut-être pas celle utilisée par UMDF. UMDF utilise les règles suivantes pour déterminer la méthode d’accès à utiliser :

  • Tous les pilotes UMDF d’une pile de pilotes doivent utiliser la même méthode pour accéder aux mémoires tampons d’un appareil. Si UMDF détermine que certains pilotes préfèrent les E/S mises en mémoire tampon ou les E/S directes pour un appareil, tandis que d’autres pilotes préfèrent uniquement les E/S mises en mémoire tampon pour l’appareil, UMDF utilise les E/S mises en mémoire tampon pour tous les pilotes. Si un ou plusieurs pilotes d’une pile préfèrent uniquement les E/S mises en mémoire tampon tandis que d’autres préfèrent uniquement les E/S directes, UMDF consigne un événement dans le journal des événements système et ne démarre pas la pile de pilotes.

    Votre pilote peut appeler IWDFDevice2::GetDeviceStackIoTypePreference pour déterminer les méthodes d’accès à la mémoire tampon qu’UMDF a attribuées aux demandes de lecture/écriture et aux demandes de contrôle d’E/S d’un appareil.

  • Dans certains cas, un pilote spécifie une préférence pour les E/S directes lorsqu’il appelle IWDFDeviceInitialize2::SetIoTypePreference, mais pour des performances optimales, UMDF utilise des E/S mises en mémoire tampon pour une ou plusieurs demandes de l’appareil. Par exemple, UMDF utilise les E/S mises en mémoire tampon pour les petites mémoires tampons s’il peut copier les données dans la mémoire tampon du pilote plus rapidement qu’il ne peut mapper les mémoires tampons pour un accès direct.

    Si vous le souhaitez, vous pouvez définir une valeur de Registre DirectTransferThreshold de type REG_DWORD que l’infrastructure utilise pour déterminer la plus petite taille de mémoire tampon pour laquelle l’infrastructure utilisera les E/S directes. En règle générale, vous n’avez pas besoin de fournir cette valeur de Registre, car l’infrastructure utilise une valeur qui fournit les meilleures performances. La valeur DirectTransferThreshold se trouve sous la sous-clé Paramètres de l’appareil \WUDF , qui se trouve sous la clé matérielle de l’appareil.

    L’infrastructure utilise les règles suivantes pour déterminer le seuil en fonction de la valeur que vous fournissez dans DirectTransferThreshold. Les nombres fournis supposent une PAGE_SIZE de 4 096, ce qui est valide sauf sur les systèmes Itanium.

    • Si vous définissez DirectTransferThreshold sur une valeur inférieure ou égale à 8192 (ou 2 * PAGE_SIZE), l’infrastructure définit le seuil sur 8192. L’infrastructure utilise les E/S mises en mémoire tampon pour les mémoires tampons inférieures à 8192 octets et les E/S directes pour les mémoires tampons supérieures ou égales à 8192 octets.

    • Si vous définissez DirectTransferThreshold sur une valeur supérieure à 8192, l’infrastructure arrondit au multiple exact suivant de PAGE_SIZE. Là encore, l’infrastructure utilise les E/S mises en mémoire tampon pour les mémoires tampons inférieures au seuil et les E/S directes pour les mémoires tampons égales ou supérieures au seuil.

  • UMDF utilise les E/S directes uniquement pour l’espace tampon qui commence et se termine sur une limite de page mémoire. Si le début ou la fin d’une mémoire tampon ne se trouve pas sur une limite de page, UMDF utilise des E/S mises en mémoire tampon pour cette partie de la mémoire tampon. En d’autres termes, UMDF peut utiliser à la fois les E/S mises en mémoire tampon et les E/S directes pour un transfert de données volumineux qui se compose de plusieurs demandes d’E/S.

  • Pour les demandes de contrôle d’E/S d’appareil, UMDF utilise les E/S directes uniquement si le code de contrôle d’E/S (IOCTL) spécifie les E/S directes et uniquement si tous les pilotes basés sur UMDF de l’appareil ont appelé IWDFDeviceInitialize2::SetIoTypePreference pour spécifier la méthode d’accès direct.

Les pilotes utilisent le même ensemble de méthodes d’objet de requête pour accéder aux mémoires tampons de données, quelle que soit la méthode d’accès à la mémoire tampon. Par conséquent, la plupart des pilotes n’ont généralement pas besoin de savoir si UMDF utilise des E/S mises en mémoire tampon ou des E/S directes pour une demande d’E/S.

Comment un pilote peut obtenir la méthode d’accès pour une demande d’E/S

Dans certains cas, vous pouvez améliorer les performances du périphérique et du pilote si la méthode d’accès est connue. Dans ce cas, votre pilote peut appeler IWDFIoRequest2::GetEffectiveIoType pour obtenir la méthode d’accès à la mémoire tampon d’une demande d’E/S.

Par exemple, considérez un appareil à haut débit qui utilise généralement des E/S directes. Étant donné qu’il utilise des E/S directes, le pilote doit copier les paramètres spécifiés par l’application dans la mémoire du pilote local avant de valider les paramètres, afin de s’assurer que l’application ne modifie pas les paramètres après validation.

Étant donné que le pilote peut recevoir à l’occasion une mémoire tampon qui utilise des E/S mises en mémoire tampon et que des mémoires tampons d’E/S mises en mémoire tampon ont déjà été copiées, l’application ne peut pas modifier les données et le pilote n’a pas besoin de copier les paramètres avant de les valider. Par conséquent, le pilote doit case activée la méthode d’accès à la mémoire tampon de chaque requête pour déterminer s’il doit copier les paramètres avant de les valider.

Utilisation des E/S mises en mémoire tampon dans les pilotes UMDF

Si votre pilote utilise des E/S mises en mémoire tampon, le comportement UMDF diffère selon le type de requête. Pour les demandes de lecture et d’écriture, le processus hôte du pilote crée une mémoire tampon intermédiaire unique à laquelle le pilote peut accéder.

Pour les demandes d’écriture, le processus hôte du pilote transfère les informations d’entrée à partir de la mémoire tampon d’entrée de l’application appelante avant d’appeler la pile des pilotes. Les pilotes lisent généralement les informations d’entrée de la mémoire tampon intermédiaire et les écrivent sur l’appareil.

Pour les demandes de lecture, les pilotes lisent généralement les informations d’un appareil et les stockent dans la mémoire tampon intermédiaire. Le processus hôte du pilote copie les données de sortie de la mémoire tampon intermédiaire vers la mémoire tampon de sortie de l’application.

Toutefois, pour les demandes de contrôle d’E/S d’appareil, le processus hôte du pilote crée deux mémoires tampons distinctes auxquelles le pilote peut accéder. Notez que cela diffère du comportement des pilotes WDM et KMDF, pour lesquels les demandes de contrôle d’E/S de lecteur, d’écriture et de périphérique envoyées à l’aide d’E/S mises en mémoire tampon entraînent l’accès du pilote à une mémoire tampon intermédiaire unique. Dans ce cas, la mémoire tampon de sortie ne contient initialement rien et le pilote ne doit pas en lire. En outre, toutes les données que le pilote écrit dans la mémoire tampon d’entrée sont ignorées et ne sont pas retournées à l’application appelante.

Pour obtenir des instructions sur le moment où choisir les E/S mises en mémoire tampon, consultez WDF_DEVICE_IO_TYPE.

UMDF versions 1.9 et ultérieures peuvent prendre en charge la récupération immédiate ou différée des mémoires tampons de requête. Pour plus d’informations, consultez WDF_DEVICE_IO_BUFFER_RETRIEVAL.

Un pilote qui utilise le mode de récupération de mémoire tampon immédiate doit utiliser IWDFIoRequest::GetInputMemory et IWDFIoRequest::GetOutputMemory pour accéder aux mémoires tampons.

Un pilote qui utilise le mode de récupération différée de la mémoire tampon peut accéder aux mémoires tampons en appelant IWDFIoRequest2::RetrieveInputBuffer, IWDFIoRequest2::RetrieveInputMemory, IWDFIoRequest2::RetrieveOutputBuffer ou IWDFIoRequest2::RetrieveOutputMemory.

Utilisation d’E/S directes dans les pilotes UMDF

Si votre pilote utilise des E/S directes, le processus hôte du pilote vérifie l’accessibilité de l’espace de mémoire tampon spécifié par l’initiateur de la demande d’E/S (généralement une application en mode utilisateur), verrouille l’espace de mémoire tampon dans la mémoire physique, puis fournit au pilote un accès direct à l’espace tampon.

Pour obtenir des instructions sur le choix des E/S directes, consultez WDF_DEVICE_IO_TYPE.

Votre pilote peut accéder aux mémoires tampons en appelant IWDFIoRequest2::RetrieveInputBuffer, IWDFIoRequest2::RetrieveInputMemory, IWDFIoRequest2::RetrieveOutputBuffer ou IWDFIoRequest2::RetrieveOutputMemory.

Utilisation de ni d’E/S mises en mémoire tampon ni d’E/S directes dans les pilotes UMDF

La méthode d’accès à la mémoire tampon, connue sous le nom de méthode d’E/S sans mise en mémoire tampon ni méthode d’E/S directe (ou méthode « ni », pour faire court) permet aux pilotes d’accéder directement aux pointeurs de mémoire tampon de requête d’une application. Les pilotes basés sur UMDF ne peuvent pas utiliser cette méthode d’accès.

Toutefois, les définitions de certains codes de contrôle d’E/S d’appareil (IOCTL) spécifient que les demandes utilisent la méthode « ni l’un ni l’autre ». Si vous le souhaitez, UMDF peut convertir la méthode d’accès à la mémoire tampon de ces demandes de contrôle d’E/S d’appareil en E/S mises en mémoire tampon ou en E/S directes. Utiliser les étapes suivantes :

  1. Incluez la directive UmdfMethodNeitherAction dans une section INF DDInstall du fichier INF de votre pilote INF. Vous pouvez définir la valeur de la directive pour indiquer qu’UMDF doit transmettre les demandes de contrôle d’E/S d’appareil qui utilisent la méthode d’accès « ni l’un ni l’autre » au pilote. (Sinon, UMDF effectue ces demandes d’E/S avec une erreur status valeur.)

  2. Accédez aux mémoires tampons de la demande d’E/S à l’aide des méthodes objet fournies par UMDF pour les E/S mises en mémoire tampon ou les E/S directes.

Vous devez activer la prise en charge des requêtes IOCTL qui utilisent la méthode « ni l’un ni l’autre » uniquement si vous êtes sûr que UMDF peut convertir la méthode d’accès en E/S mises en mémoire tampon ou en E/S directes. Par exemple, si l’IOCTL spécifie une demande personnalisée qui ne suit pas les règles de spécification de mémoire tampon décrites dans La section Descriptions des mémoires tampons pour les codes de contrôle d’E/S, UMDF ne peut pas convertir les mémoires tampons.