Minidrivers et le pilote de classe HID

Cet article décrit les minidrivers et le pilote de classe HID.

Pour plus d’informations, consultez Création de minidrivers HID WDF.

Fonctionnalités opérationnelles du pilote de classe HID

Le pilote de classe HID effectue les opérations suivantes :

  • Fournit et gère l’interface de niveau supérieur que les pilotes en mode noyau et les applications en mode utilisateur utilisent pour accéder aux collections HID qu’un périphérique d’entrée prend en charge.

    Le pilote de classe HID gère et achemine de manière transparente toutes les communications entre les pilotes et les applications de niveau supérieur et les périphériques d’entrée sous-jacents qui prennent en charge les collections HID. Il gère les différents protocoles de données utilisés par différents périphériques d’entrée et files d’attente d’entrée qui prennent en charge plusieurs fichiers ouverts sur la même collection HID.

    L’interface de niveau supérieur aux collections HID se compose des IOCTL des pilotes de classe HID, des routines de prise en charge HIDClass et desstructures HIDClass.

  • Communique avec un minidriver HID en appelant les routines de pilote standard du minidriver.

  • Crée un objet d’appareil fonctionnel (FDO) pour les appareils d’entrée HIDClass énumérés par un pilote de bus ou de port de niveau inférieur.

    Par exemple, le pilote de classe HID crée et gère les opérations d’un FDO qui représente un périphérique HID USB énuméré par la pile de pilotes USB fournie par le système.

  • Fournit les fonctionnalités d’un pilote de bus pour les appareils enfants (collections HID) pris en charge par un périphérique d’entrée sous-jacent.

    Le pilote de classe HID crée un objet de périphérique physique (PDO) pour chaque collection HID prise en charge par un périphérique d’entrée et gère l’opération de la collection.

Liaison d’un minidriver à HIDClass

Un minidriver HID lie son fonctionnement au pilote de classe HID en appelant HidRegisterMinidriver pour s’inscrire auprès du pilote de classe HID. Opération d’inscription :

  • Enregistre une copie des points d’entrée (pointeurs) vers les routines de pilotes standard du minidriver HID dans l’extension de périphérique du pilote de classe HID.

    Un minidriver HID définit ses points d’entrée dans l’objet pilote que le minidriver reçoit comme entrée dans sa routine DRIVER_INITIALIZE . Le minidriver HID définit ces points d’entrée avant de s’inscrire auprès du pilote de classe HID.

  • Réinitialise les points d’entrée de l’objet pilote du minidriver aux points d’entrée pour les routines de pilote standard fournies par le pilote de classe HID.

Le pilote de classe HID fournit les routines de pilotes standard suivantes :

Le processus d’inscription alloue également de la mémoire pour l’extension d’appareil hid mind river. Bien que la mémoire soit allouée par le pilote de classe HID, seul le minidriver HID utilise cette extension de périphérique.

Communication avec un minidriver HID

Le pilote de classe HID communique avec un minidriver HID en appelant les DRIVER_ADD_DEVICE, les DRIVER_UNLOAD et les routines de répartition du minidriver HID comme suit :

Appel de la routine AddDevice

Lorsque la routine AddDevice du pilote de classe HID est appelée pour créer un objet de périphérique fonctionnel (FDO), le pilote de classe HID crée le FDO, l’initialise et appelle la routine AddDevice du minidriver HID. La routine AddDevice du minidriver HID effectue une initialisation interne spécifique à l’appareil et, si elle réussit, retourne STATUS_SUCCESS. Si la routine de minidriver AddDevice HID échoue, le pilote de classe HID supprime le FDO et retourne le status retourné par la routine AddDevice du minidriver HID.

Appel de la routine Deload

Lorsque la routine de déchargement du pilote de classe HID est appelée, le pilote de classe HID termine la libération de toutes les ressources associées à FDO et appelle la routine de déchargement du minidriver HID.

Appel des routines dispatch

Pour faire fonctionner un appareil, le pilote de classe HID appelle principalement la routine de répartition du minidriver HID pour les demandes de contrôle d’appareil internes.

Lorsque le gestionnaire d’E/S envoie des requêtes au pilote de classe HID, le pilote de classe HID traite la demande et appelle la routine de répartition correspondante du minidriver HID.

Le pilote de classe HID n’envoie pas les requêtes suivantes au minidriver HID : créer, fermer ou contrôler l’appareil.

Fonctionnement d’un minidriver HID

Un minidriver de transport HID extrait le fonctionnement d’un bus matériel ou d’un port auquel votre périphérique d’entrée est attaché.

Les mini-drivers HID peuvent être créés à l’aide de l’une des infrastructures suivantes :

  • UMDF – Infrastructure de pilote en mode utilisateur
  • KDMF – Infrastructure de pilote en mode noyau
  • WDF - Windows Driver Framework
  • WDM – Modèle de pilote Windows (hérité)

Microsoft recommande d’utiliser une solution basée sur des frameworks (KMDF ou UMDF). Pour plus d’informations sur chacun des modèles de pilotes, consultez les sections suivantes :

  • Minidriver HID basé sur KMDF, consultez Création de minidrivers HID basés sur framework
  • Minidriver HID basé sur UMDF, consultez Création de minidrivers HID WDF

La section suivante traite de l’inscription d’un minidriver HID basé sur WDM, mais il est également pertinent pour un pilote framework basé sur KMDF. Tous les minidriver HID doivent s’inscrire auprès du pilote de classe HID, et le pilote de classe HID communique avec le minidriver en appelant les routines de pilote standard du minidriver.

Pour plus d’informations sur les fonctionnalités qu’un minidriver HID doit prendre en charge dans ses routines de pilotes standard, consultez les sections suivantes :

Pour plus d’informations sur le pilote de classe HID, consultez Fonctionnement du minidriver HID.

Inscription d’un minidriver HID

Une fois qu’un minidriver HID a terminé l’initialisation de tous les autres pilotes dans sa routine DRIVER_INITIALIZE , le minidriver HID lie son fonctionnement au pilote de classe HID en appelant HidRegisterMinidriver.

Lorsque le minidriver HID s’inscrit auprès du pilote de classe HID, il utilise une structure HID_MINIDRIVER_REGISTRATION . La structure spécifie :

  • Révision HID
  • Objet de pilote de minidriver HID
  • Taille d’une extension de minidriver HID
  • Si les appareils sont interrogés

Extension de minidriver HID

Une extension d’appareil hid minidriver est spécifique à l’appareil et n’est utilisée que par un minidriver HID. Le pilote de classe HID alloue la mémoire pour l’extension de périphérique minidriver lorsque le pilote de classe crée son extension de périphérique pour un objet de périphérique fonctionnel (FDO). Le minidriver HID spécifie la taille de son extension d’appareil lorsqu’il inscrit le minidriver auprès du pilote de classe HID. La taille est spécifiée par le membre DeviceExtensionSize d’une structure HID_MINIDRIVER_REGISTRATION .

Utilisation de la structure HID_DEVICE_EXTENSION

Un minidriver HID doit utiliser une structure HID_DEVICE_EXTENSION comme disposition de l’extension d’appareil créée par le pilote de classe HID pour un objet de périphérique fonctionnel (FDO). Le pilote de classe HID définit les membres de cette structure lorsqu’il initialise le FDO. Un minidriver HID ne doit pas modifier les informations de cette structure.

Une structure HID_DEVICE_EXTENSION contient les membres suivants :

  • PhysicalDeviceObject est un pointeur vers l’objet d’appareil physique (PDO) qui représente l’appareil d’entrée sous-jacent.

  • NextDeviceObject est un pointeur vers le haut de la pile d’appareils sous le FDO.

  • MiniDeviceExtension est un pointeur vers l’extension du minidriver HID.

Avec un pointeur vers le FDO d’un périphérique d’entrée, la macro GET_MINIDRIVER_DEVICE_EXTENSION suivante retourne un pointeur vers une extension de minidriver HID :

#define GET_MINIDRIVER_DEVICE_EXTENSION(DO) ((PDEVICE_EXTENSION) (((PHID_DEVICE_EXTENSION)(DO)->DeviceExtension)->MiniDeviceExtension))

PDEVICE_EXTENSION est un pointeur vers une extension d’appareil spécifique à l’appareil déclarée par un minidriver HID.

De même, un minidriver HID peut obtenir un pointeur vers le PDO du périphérique d’entrée et le haut de la pile de l’appareil sous le FDO du périphérique d’entrée.

Lorsqu’un minidriver HID envoie un IRP dans la pile de l’appareil, il doit utiliser NextDeviceObject comme objet d’appareil cible.

Routines de minidriver standard

Un minidriver HID doit fournir les routines de prise en charge des pilotes standard suivantes :

  • Routine du minidriver Hid DriverEntry
  • Routine AddDevice minidriver HID
  • Routine de déchargement du minidriver HID

Un minidriver HID doit également prendre en charge les routines de répartition décrites dans Routines de répartition fournies par un minidriver HID.

Routine DriverEntry

La routine DRIVER_INITIALIZE dans un minidriver HID effectue les opérations suivantes :

  • Crée un objet pilote pour la paire de pilotes liée (pilote de classe HID et minidriver HID).

  • Définit les points d’entrée de pilote requis dans l’objet de pilote de minidriver HID.

  • Appelle HidRegisterMinidriver pour inscrire le minidriver HID auprès du pilote de classe HID.

  • Effectue des configurations spécifiques à l’appareil qui ne sont utilisées que par le minidriver HID.

AddDevice routine

Le pilote de classe HID gère la création et l’initialisation de l’objet de périphérique fonctionnel (FDO) pour un périphérique d’entrée sous-jacent. Le pilote de classe HID gère également le FDO du point de vue de l’interface de niveau supérieur vers l’appareil sous-jacent et ses appareils enfants (collections HID).

Le pilote de classe HID DRIVER_ADD_DEVICE routine appelle la routine AddDevice minidriver HID afin que le minidriver puisse effectuer une initialisation interne spécifique à l’appareil.

Les paramètres passés au minidriver HID DRIVER_ADD_DEVICE routine sont l’objet de pilote minidriver et le FDO. Le pilote de classe HID transmet le FDO à la routine AddDevice du minidriver, et non à l’objet de périphérique physique pour le périphérique d’entrée sous-jacent.

Le minidriver HID DRIVER_ADD_DEVICE routine obtient un pointeur vers l’extension de l’appareil minidriver à partir du FDO.

  • En règle générale, le minidriver hid DRIVER_ADD_DEVICE routine effectue les opérations suivantes :

  • Initialise l’extension de l’appareil minidriver. L’extension de l’appareil est utilisée uniquement par le minidriver.

  • Retourne STATUS_SUCCESS. Si le minidriver retourne une erreur status, le pilote de classe HID supprime le FDO et retourne le status d’erreur au gestionnaire de Plug-and-Play.

Décharger la routine

La routine Deload du pilote de classe HID appelle le minidriver HID DRIVER_UNLOAD routine. Un minidriver HID libère toutes les ressources internes allouées par le minidriver.

Routines de répartition

Un minidriver HID doit fournir les routines de répartition suivantes : créer, fermer, contrôler l’appareil interne, contrôler le système, Plug-and-Play et gérer l’alimentation. À l’exception des demandes de contrôle d’appareil internes, la plupart de ces routines de répartition fournissent une fonction minimale. Lorsque le pilote de classe HID appelle ces routines de répartition, il transmet l’objet de pilote minidriver et l’objet de périphérique fonctionnel (FDO).

IRP_MJ_CREATE

Conformément aux exigences WDM, le pilote de classe HID et un minidriver HID fournissent une routine de répartition pour les demandes de création. Toutefois, le FDO ne peut pas être ouvert. Le pilote de classe HID retourne STATUS_UNSUCCESSFUL.

Un minidriver HID doit uniquement fournir un stub. La routine de répartition de création n’est jamais appelée.

IRP_MJ_CLOSE

Conformément aux exigences WDM, le pilote de classe HID et un minidriver HID doivent fournir une routine de répartition pour les demandes de clôture. Toutefois, le FDO ne peut pas être ouvert. Le pilote de classe HID retourne STATUS_INVALID_PARAMETER_1.

Un minidriver HID doit uniquement fournir un stub. La routine de répartition rapprochée n’est jamais appelée.

IRP_MJ_DEVICE_CONTROL

Un minidriver HID n’a pas besoin d’une routine de répartition pour les demandes de contrôle d’appareil. Le pilote de classe HID ne transmet pas les demandes de contrôle d’appareil à un minidriver.

IRP_MJ_INTERNAL_DEVICE_CONTROL

Un minidriver HID doit fournir une routine de répartition pour les demandes de contrôle d’appareil internes qui prennent en charge les demandes décrites dans LES IOCTL de minidriver HID.

Le pilote de classe HID utilise principalement les demandes de contrôle d’appareil internes pour accéder au périphérique d’entrée sous-jacent.

Le minidriver HID gère ces requêtes d’une manière spécifique à l’appareil.

IRP_MJ_SYSTEM_CONTROL

Un minidriver HID doit fournir une routine de répartition pour les demandes de contrôle système. Toutefois, un minidriver HID est uniquement requis pour transmettre les demandes de contrôle système dans la pile de l’appareil comme suit :

  • Ignorer l’emplacement actuel de la pile IRP

  • Envoyer la requête vers le bas de la pile d’appareils du FDO

IRP_MJ_PNP

Un minidriver HID doit fournir une routine de répartition pour Plug-and-Play demandes.

Le pilote de classe HID effectue tous les Plug-and-Play traitement associés au FDO. Lorsque le pilote de classe HID traite une demande de Plug-and-Play, il appelle la routine de répartition Plug-and-Play du minidriver HID.

Un minidriver HID Plug-and-Play une routine de distribution :

  • Gère l’envoi de la requête vers le bas de la pile d’appareils du FDO et l’achèvement de la demande lors de la sauvegarde de la pile d’appareils, selon les besoins pour chaque type de requête.

  • Effectue un traitement spécifique à l’appareil associé à certaines demandes de mise à jour des informations sur l’état du FDO.

    Par exemple, le minidriver peut mettre à jour l’état Plug-and-Play du FDO (en particulier, si le FDO est démarré, arrêté ou en cours de suppression).

IRP_MJ_POWER

Le minidriver HID doit fournir une routine de répartition pour les demandes d’alimentation. Toutefois, le pilote de classe HID gère le traitement de l’alimentation pour le FDO.

Conformément aux exigences WDM, un minidriver HID envoie les demandes d’alimentation dans la pile d’appareils du FDO de cette manière :

  • Ignore l’emplacement actuel de la pile IRP

  • Démarre le IRP d’alimentation suivant

  • Envoie l’IRP d’alimentation vers le bas de la pile d’appareils du FDO

En règle générale, le minidriver HID transmet les demandes d’alimentation dans la pile de l’appareil sans traitement supplémentaire.