Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
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 appareil d’entrée prend en charge.
Le pilote de classe HID gère et route de manière transparente toutes les communications entre les pilotes de niveau supérieur et les applications et les périphériques d’entrée sous-jacents qui prennent en charge les regroupements 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 des collections HID se compose des IOCTLs du pilote de classe HID, des routines de prise en charge de HIDClass et des structures HIDClass.
Communique avec le minidriver HID en appelant les routines de pilotage standard du minidriver.
Crée un objet d’appareil fonctionnel (FDO) pour les périphériques d’entrée HIDClass énumérés par un bus ou un pilote 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 USB HID é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) prises en charge par un appareil d’entrée sous-jacent.
Le pilote de classe HID crée un objet d’appareil 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 opération 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) des routines de pilote 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 à sa routine de DRIVER_INITIALIZE . Le minidriver HID définit ces points d'entrée avant de s'enregistrer 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 des routines de pilotes standard fournies par le pilote de classe HID.
Le pilote de classe HID fournit les routines de pilotes standard suivantes :
Routines de répartition pour les requêtes d'E/S suivantes :
Le processus d’inscription alloue également de la mémoire pour l’extension de l’appareil HID mind river. Bien que la mémoire soit allouée par le pilote de classe HID, seul le mini-pilote 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 DRIVER_ADD_DEVICE, DRIVER_UNLOAD et les routines de dispatch de la manière suivante :
Appel de la routine AddDevice
Lorsque la routine AddDevice du pilote de classe HID est appelée pour créer un objet d’appareil fonctionnel (FDO), le pilote de classe HID crée l’objet 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 AddDevice de minidriver HID ne réussit pas, le pilote de classe HID supprime l’objet FDO et retourne l’état retourné par la routine AddDevice du minidriver HID.
Appel de la routine de déchargement
Lorsque la routine de déchargement du pilote de classe HID est appelée, le pilote de classe HID libère toutes les ressources associées à FDO et appelle la routine de déchargement du minidriver HID.
Appel des routines Dispatch
Pour utiliser un appareil, le pilote de classe HID appelle principalement la routine de répartition du mini-pilote HID pour traiter les requêtes de contrôle interne de l'appareil.
Lorsque le gestionnaire d’E/S envoie des requêtes au pilote de classe HID, le pilote de classe HID traite la requête 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.
Opération d’un minidriver HID
Un minidriver de transport HID abstrait le fonctionnement d’un bus matériel ou d’un port auquel votre appareil d’entrée est attaché.
Les minidrivers HID peuvent être créés à l'aide de l'une des structures suivantes :
- UMDF – Infrastructure du pilote en mode utilisateur
- KDMF – Infrastructure du 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, voir Création de minidrivers HID basés sur le framework KMDF
- Minidriver HID basé sur UMDF, voir Création de minidrivers HID WDF
La section suivante traite de l’inscription d’un minidriver HID basé sur WDM, mais une grande partie de ces informations est également pertinente pour un pilote basé sur le cadre KMDF. Tous les minipilotes HID doivent s’inscrire auprès du pilote de classe HID, et le pilote de classe HID communique avec le minipilote en appelant les routines de pilote standard du minipilote.
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 :
- Enregistrement d’un mini-pilote HID
- Extension minidriver HID
- Utilisation de la structure HID_DEVICE_EXTENSION
- Routines de minidriver standard
Pour plus d’informations sur le pilote de classe HID, consultez Opération du minidriver HID.
Enregistrement d’un minidriver HID
Une fois qu’un minidriver HID termine l’initialisation de tous les autres pilotes dans sa routine de DRIVER_INITIALIZE , le minidriver HID lie son opération au pilote de classe HID en appelant HidRegisterMinidriver.
Lorsque le minipilote HID s'enregistre auprès du pilote de classe HID, il utilise une structure HID_MINIDRIVER_REGISTRATION. La structure spécifie :
- Révision HID
- Objet du pilote minidriver HID
- Taille d’une extension d’appareil minidriver HID
- Indique si les appareils sont interrogés
Extension minidriver HID
Une extension de dispositif minidriver HID est spécifique au dispositif et est utilisée uniquement par un minidriver HID. Le pilote de classe HID alloue la mémoire de 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 l'étendue de son dispositif lorsqu’il enregistre 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 de périphérique 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 l’opération 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 la FDO.
MiniDeviceExtension est un pointeur vers l’extension d’appareil minidriver HID.
Étant donné un pointeur vers le FDO d’un appareil d’entrée, la macro GET_MINIDRIVER_DEVICE_EXTENSION suivante retourne un pointeur vers une extension minidriver HID :
#define GET_MINIDRIVER_DEVICE_EXTENSION(DO) ((PDEVICE_EXTENSION) (((PHID_DEVICE_EXTENSION)(DO)->DeviceExtension)->MiniDeviceExtension))
PDEVICE_EXTENSION est un pointeur vers une extension spécifique à l’appareil déclarée par un minidriver HID.
De même, un mini-pilote HID peut obtenir un pointeur vers le PDO du périphérique d'entrée et le sommet de la pile de périphériques sous le FDO du périphérique d'entrée.
Lorsqu’un minidriver HID envoie un IRP vers le bas de la pile d’appareils, il doit utiliser NextDeviceObject comme objet d’appareil cible.
Routines de minidriver standard
Un minidriver HID doit fournir les routines de support standard suivantes :
- Routine DriverEntry du minidriver HID
- Procédure AddDevice du mini-driver HID
- Routine de déchargement de 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 de pilote pour la paire liée de pilotes (pilote de classe HID et minidriver HID).
Définit les points d’entrée de pilotes requis dans l’objet pilote HID Minidriver.
Appelle HidRegisterMinidriver pour inscrire le minidriver HID auprès du pilote de classe HID.
Est-ce que des configurations spécifiques à l’appareil sont utilisées uniquement par le minidriver HID ?
Routine AddDevice
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 exploite é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 Hid minidriver AddDevice afin que le minidriver puisse effectuer une initialisation interne spécifique à l’appareil.
Les paramètres passés à la routine DRIVER_ADD_DEVICE du minidriver HID sont l'objet pilote minidriver et le FDO. Le pilote de classe HID transmet le FDO à la routine AddDevice du minipilote, et non à l'objet d'appareil physique pour le périphérique d'entrée sous-jacent.
Le minidriver HID DRIVER_ADD_DEVICE routine obtient un pointeur vers l’extension d’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 périphérique du minidriver. L’extension d’appareil est utilisée uniquement par le minidriver.
Retourne STATUS_SUCCESS. Si le minidriver retourne un état d’erreur, le pilote de classe HID supprime le FDO et retourne l’état d’erreur au gestionnaire Plug-and-Play.
Décharger la routine
La routine de désinstallation du pilote de classe HID appelle la routine DRIVER_UNLOAD du minidriver HID. 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ôle interne de l'appareil, contrôle du système, Plug and Play, et gestion de l’alimentation. À l’exception des demandes de contrôle d’appareil interne, la plupart de ces routines de traitement 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 création de distribution n'est jamais appelée.
IRP_MJ_CLOSE
En conformité avec les exigences WDM, le pilote de classe HID et un minidriver HID doivent fournir une routine de répartition pour les demandes de fermeture. 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 proche n’est jamais appelée.
IRP_MJ_DEVICE_CONTROL
Un minidriver HID n’a pas besoin d’une routine de dispatch 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 dispatch pour les demandes de contrôle d'appareil interne qui prennent en charge les requêtes décrites dans les IOCTL de minidriver HID.
Le pilote de classe HID utilise principalement les demandes de contrôle d’appareil interne pour accéder au périphérique d’entrée sous-jacent.
Le minidriver HID gère ces requêtes de manière spécifique à l’appareil.
IRP_MJ_SYSTEM_CONTROL
Un minidriver HID doit fournir une routine de distribution pour les demandes de contrôle système. Toutefois, un minidriver HID n’est nécessaire que pour transmettre les demandes de contrôle système à la pile d’appareils comme suit :
Ignorer l’emplacement actuel de la pile IRP
Envoyer la requête vers le bas de la pile de périphériques du FDO
IRP_MJ_PNP
Un minidriver HID doit fournir une routine de distribution pour les demandes Plug-and-Play.
Le pilote de classe HID effectue tout le traitement Plug and Play associé au FDO. Lorsque le pilote de classe HID traite une demande Plug-and-Play, il appelle la routine de distribution Plug-and-Play du minidriver HID.
Une routine de répartition HID minidriver Plug and Play :
Gère l’envoi de la requête vers le bas de la pile d’appareils du FDO et la fin de la demande sur la façon de sauvegarder la pile de l’appareil, selon les besoins de chaque type de requête.
Le traitement spécifique à l'appareil est-il 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 activé, arrêté ou en cours de retrait).
IRP_MJ_POWER
Le minidriver HID doit fournir une routine de distribution pour les demandes d’alimentation. Toutefois, le pilote de classe HID gère le traitement de l'énergie pour le FDO.
En conformité avec les exigences WDM, un minidriver HID envoie les demandes de puissance vers le bas de la pile d’appareils du FDO de cette façon :
Ignore l’emplacement actuel de la pile IRP
Démarre l’IRP d’alimentation suivante
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 à la pile des appareils sans traitement supplémentaire.