Configuration des pilotes de classe clavier et souris

Notes

Cette rubrique s’adresse aux développeurs qui configurent des pilotes de classe clavier et souris. Si vous cherchez à corriger une souris ou un clavier, consultez :

Les claviers et les souris non HID peuvent se connecter sur plusieurs bus hérités, tout en utilisant le même pilote de classe. Cette section contient des détails sur les pilotes de classe eux-mêmes. Les sections suivantes détaillent les contrôleurs.

Cette rubrique décrit la configuration physique classique des périphériques clavier et souris dans Microsoft Windows 2000 et versions ultérieures.

Les illustrations suivantes montrent deux configurations courantes qui utilisent un seul clavier et une seule souris.

Diagramme illustrant deux configurations qui utilisent un seul clavier et une seule souris.

La figure de gauche montre un clavier et une souris connectés à un bus système via des contrôleurs indépendants. Une configuration classique se compose d’un clavier de style PS/2 actionné via un contrôleur i8042 et d’une souris de style série actionné via un contrôleur de port série.

Les informations supplémentaires suivantes sont importantes pour les fabricants de claviers et de souris :

  • Les claviers sont ouverts en mode exclusif par la pile du système d’exploitation pour des raisons de sécurité
  • Windows prend en charge la connexion simultanée de plusieurs claviers et souris.
  • Windows ne prend pas en charge l’accès indépendant d’un client à chaque appareil.

Fonctionnalités du pilote de classe

Cette rubrique décrit les fonctionnalités des pilotes de classe système Microsoft Windows 2000 et ultérieur suivants :

  • Kbdclass, pilote de classe pour les appareils de GUID_CLASS_KEYBOARD classe de périphérique

  • Mouclass, pilote de classe pour les appareils de GUID_CLASS_MOUSE classe de périphérique

Kbdclass implémente le service Kbdclass et son image exécutable est kbdclass.sys.

Mouclass implémente le service Mouclass et son image exécutable est mouclass.sys.

Kbdclass et Mouclass chaque fonctionnalité :

  • Opération générique et indépendante du matériel de la classe d’appareil.

  • Plug-and-Play, la gestion de l’alimentation et Windows Management Instrumentation (WMI).

  • Fonctionnement des appareils hérités.

  • Opération simultanée de plusieurs appareils.

  • Connexion d’une routine de rappel de service de classe qu’un pilote de fonction utilise pour transférer des données de la mémoire tampon de données d’entrée de l’appareil vers la mémoire tampon de données du pilote de classe.

Configuration des objets d’appareil

L’illustration suivante montre la configuration des objets d’appareil pour un Plug-and-Play clavier et souris de style PS/2. Chaque pilote de classe crée un objet de périphérique de filtre de classe de niveau supérieur (filtre DO) qui est attaché à un objet de périphérique de fonction (FDO) par le biais d’un filtre de périphérique de niveau supérieur facultatif DO. Un pilote de filtre de périphérique de niveau supérieur crée le filtre de périphérique de niveau supérieur DO. I8042prt crée la fonction DO et l’attache à un objet de périphérique physique (PDO) créé par le pilote de bus racine.

Diagramme illustrant la configuration d’objets d’appareil pour un clavier et une souris de style plug-and-play ps/2.

Clavier PS/2

La pile des pilotes de clavier se compose des éléments suivants.

  • Kbdclass, le pilote de filtre de classe de clavier de niveau supérieur
  • Un ou plusieurs pilotes de filtre de clavier de niveau supérieur facultatifs
  • I8042prt, le pilote de fonction

Souris PS/2

La pile de pilotes de souris se compose des éléments suivants.

  • Mouclass, le pilote de filtre de classe de souris de niveau supérieur
  • Un ou plusieurs pilotes de filtre de souris de niveau supérieur facultatifs
  • I8042prt, le pilote de fonction

Kbdclass et Mouclass peuvent prendre en charge plusieurs appareils dans deux modes différents. En mode un-à-un, chaque appareil dispose d’une pile d’appareils indépendante. Le pilote de classe crée et attache une classe indépendante DO à chaque pile de périphériques. Chaque pile d’appareils a son propre état de contrôle et sa propre mémoire tampon d’entrée. Le sous-système Microsoft Win32 accède aux entrées de chaque appareil via un objet fichier unique.

En mode grandmaster, le pilote de classe gère tous les appareils de la manière suivante :

  • Le pilote de classe crée à la fois une classe grandmaster DO qui représente tous les appareils et une classe subordonnée DO pour chaque appareil.

    Le pilote de classe attache une classe subordonnée DO à chaque pile de périphériques. Sous la classe subordonnée DO, la pile d’appareils est identique à celle créée en mode un-à-un.

  • La classe grandmaster DO contrôle le fonctionnement de tous les DO subordonnés.

  • Le sous-système Win32 accède à toutes les entrées d’appareil via l’objet file qui représente l’appareil de classe grandmaster.

  • Toutes les entrées d’appareil sont mises en mémoire tampon dans la file d’attente de données du grand maître.

  • Le grand maître conserve un seul état global de l’appareil.

Kbdclass et Mouclass fonctionnent en mode un-à-un si leur valeur d’entrée de Registre ConnectMultiplePorts est définie sur 0x00 (sous la clé HKLM\Services\CurrentControlSet\<class service>\Parameters, où service de classe est Kbdclass ou Mouclass). Sinon, Kbdclass et Mouclass fonctionnent en mode grandmaster.

Ouvrir et fermer via le pilote de classe

Le sous-système Microsoft Win32 ouvre tous les périphériques clavier et souris pour son utilisation exclusive. Pour chaque classe d’appareil, le sous-système Win32 traite l’entrée de tous les appareils comme si l’entrée provenait d’un seul périphérique d’entrée. Une application ne peut pas demander à recevoir des entrées d’un seul appareil particulier.

Le sous-système Win32 ouvre dynamiquement Plug-and-Play périphériques d’entrée après avoir reçu une notification du gestionnaire de Plug-and-Play indiquant qu’une interface d’appareil GUID_CLASS_KEYBOARD ou GUID_CLASS_MOUSE est activée. Le sous-système Win32 ferme Plug-and-Play appareils après avoir reçu une notification indiquant qu’une interface ouverte est désactivée. Le sous-système Win32 ouvre également les appareils hérités par leur nom (par exemple, « \Device\KeyboardLegacyClass0 »). Notez qu’une fois que le sous-système Win32 ouvre correctement un appareil hérité, il ne peut pas déterminer si l’appareil est physiquement supprimé ultérieurement.

Une fois que Kbdclass et Mouclass ont reçu une demande de création, ils effectuent les opérations suivantes pour Plug-and-Play et l’opération héritée :

  • Plug-and-Play, opération

    Si l’appareil est à l’état Plug-and-Play démarré, le pilote de classe envoie la demande IRP_MJ_CREATE dans la pile des pilotes. Sinon, le pilote de classe termine la requête sans envoyer la requête dans la pile des pilotes. Le pilote de classe définit le fichier approuvé qui dispose d’un accès en lecture à l’appareil. S’il existe un périphérique grandmaster, le pilote de classe envoie une demande de création à tous les ports associés aux périphériques de classe subordonnée.

  • Opération héritée

    Le pilote de classe envoie une demande de contrôle de périphérique interne au pilote de port pour activer l’appareil.

Connecter un rappel de service à un appareil

Les pilotes de classe doivent connecter leur service de classe à un appareil avant que l’appareil puisse être ouvert. Les pilotes de classe connectent leur service de classe après avoir attaché une classe DO à une pile de périphériques. Le pilote de fonction utilise le rappel de service de classe pour transférer les données d’entrée d’un appareil vers la file d’attente de données de classe pour l’appareil. La routine d’achèvement de la répartition ISR du pilote de fonction pour un appareil appelle le rappel de service de classe. Kbdclass fournit le rappel de service de classe KeyboardClassServiceCallback, et Mouclass fournit le rappel de service de classe MouseClassServiceCallback.

Un fournisseur peut modifier le fonctionnement d’un rappel de service de classe en installant un pilote de filtre de niveau supérieur pour un appareil. L’exemple de pilote de filtre de clavier Kbfiltr définit le rappel KbFilter_ServiceCallback , et l’exemple de pilote de filtre de souris Moufiltr définit le rappel MouFilter_ServiceCallback . Les exemples de rappels de service de filtre peuvent être configurés pour modifier les données d’entrée transférées de la mémoire tampon d’entrée de port d’un appareil vers la file d’attente de données de classe. Par exemple, le rappel du service de filtre peut supprimer, transformer ou insérer des données.

Les rappels de service de classe et de filtre sont connectés de la manière suivante :

  • Le pilote de classe envoie une demande de connexion de périphérique interne dans la pile des appareils (IOCTL_INTERNAL_KEYBOARD_CONNECT ou IOCTL_INTERNAL_MOUSE_CONNECT). Les données de connexion de classe sont spécifiées par une structure CONNECT_DATA qui inclut un pointeur vers l’objet de périphérique de classe et un pointeur vers le rappel du service de classe.

  • Une fois que le pilote de filtre a reçu la demande de connexion, il enregistre une copie des données de connexion de classe et remplace les données de connexion de la demande par les données de connexion de filtre. Les données de connexion de filtre spécifient un pointeur vers l’objet de périphérique de filtre et un pointeur vers le rappel du service de pilote de filtre. Le pilote de filtre envoie ensuite la demande de connexion filtrée au pilote de fonction.

Les rappels de service de classe et de filtre sont appelés de la manière suivante :

  • Le pilote de fonction utilise les données de connexion de filtre pour effectuer le rappel initial au rappel du service de filtre.

  • Après avoir filtré les données d’entrée, le rappel de service de filtre utilise les données de connexion de classe qu’il a enregistrées pour effectuer un rappel au rappel du service de classe.

Interroger et définir un périphérique clavier

I8042prt prend en charge les demandes de contrôle d’appareil internes suivantes pour interroger des informations sur un périphérique clavier et définir des paramètres sur un périphérique clavier :

IOCTL_KEYBOARD_QUERY_ATTRIBUTES

IOCTL_KEYBOARD_QUERY_INDICATOR_TRANSLATION

IOCTL_KEYBOARD_QUERY_INDICATORS

IOCTL_KEYBOARD_QUERY_TYPEMATIC

IOCTL_KEYBOARD_SET_INDICATORS

IOCTL_KEYBOARD_SET_TYPEMATIC

Pour plus d’informations sur toutes les demandes de contrôle de périphérique clavier, consultez Référence des appareils d’interface humaine.

Analyser le mappeur de code pour les claviers

Dans les systèmes d’exploitation Microsoft Windows, les codes d’analyse compatibles PS/2 fournis par un périphérique d’entrée sont convertis en clés virtuelles, qui sont propagées via le système sous la forme de messages Windows. Si un appareil produit un code d’analyse incorrect pour une certaine clé, le message de clé virtuelle incorrect est envoyé. Cela peut être résolu en écrivant un pilote de filtre qui analyse les codes d’analyse générés par le microprogramme et modifie le code d’analyse incorrect en un code d’analyse compris par le système. Toutefois, il s’agit d’un processus fastidieux qui peut parfois entraîner de graves problèmes, si des erreurs existent dans le pilote de filtre au niveau du noyau.

Windows 2000 et Windows XP incluent un nouveau mappeur de code d’analyse, qui fournit une méthode qui permet le mappage des codes d’analyse. Les mappages de code d’analyse pour Windows sont stockés dans la clé de Registre suivante :

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layout

Note Il existe également une touche Dispositions du clavier (notez le pluriel) sous la touche Contrôle, mais cette touche ne doit pas être modifiée.

Dans la touche Disposition du clavier , la valeur Scancode Map doit être ajoutée. Cette valeur est de type REG_BINARY (petit format Endian) et a le format de données spécifié dans le tableau suivant.

Décalage de début (en octets) Taille (en octets) Données
0 4 En-tête : Informations de version
4 4 En-tête : indicateurs
8 4 En-tête : nombre de mappages
12 4 Mappage individuel
... ... ...
4 derniers octets 4 Terminateur Null (0x00000000)

Le premier et le deuxième magasin DWORDS stockent les informations d’en-tête et doivent être définis sur tous les zéros pour la version actuelle du mappeur de code d’analyse. La troisième entrée DWORD contient le nombre total de mappages qui suivent, y compris le mappage de fin null. Le nombre minimal serait donc de 1 (aucun mappage spécifié). Les mappages individuels suivent l’en-tête. Chaque mappage a une longueur DWORD et est divisé en deux champs de longueur WORD. Chaque champ WORD stocke le code d’analyse d’une clé à mapper.

Une fois la carte stockée dans le Registre, le système doit être redémarré pour que les mappages prennent effet. Notez que si le mappage d’un code d’analyse est nécessaire sur une touche, l’étape est effectuée en mode utilisateur juste avant que le code d’analyse ne soit converti en clé virtuelle. Cette conversion en mode utilisateur peut présenter certaines limitations, telles que le mappage ne fonctionne pas correctement lors de l’exécution sous Terminal Services.

Pour supprimer ces mappages, supprimez la valeur de Registre Scancode Map et redémarrez.

Exemple 1

Voici un exemple. Pour permuter la touche CTRL gauche avec la touche VERR. CAPS, utilisez un éditeur de Registre (de préférence Regedt32.exe) pour modifier la clé de carte Scancode avec la valeur suivante :

00000000 00000000 03000000 3A001D00 1D003A00 00000000

Le tableau suivant contient ces entrées divisées en champs DWORD et les octets échangés.

Valeur : Interprétation

0x00000000 : En-tête : Version. Définissez sur tous les zéros.

0x00000000 : En-tête : indicateurs. Définissez sur tous les zéros.

0x00000003 : trois entrées dans la carte (y compris l’entrée null).

0x001D003A : Touche CTRL gauche --> VERR. MAJ (0x1D --> 0x3A).

0x003A001D : VERR. MAJ .-> Touche CTRL gauche (0x3A --> 0x1D).

0x00000000 : Terminateur Null.

Exemple 2

Il est également possible d’ajouter une touche qui n’est pas généralement disponible sur un clavier ou de supprimer une touche qui n’est jamais utilisée. L’exemple suivant montre la valeur stockée dans Scancode Map pour supprimer la touche CTRL droite et modifier les fonctionnalités de la touche ALT droite pour qu’elle fonctionne comme une touche muet :

00000000 00000000 03000000 00001DE0 20E038E0 00000000

Le tableau suivant contient ces entrées divisées en champs DWORD et les octets échangés.

Valeur : Interprétation

0x00000000 : En-tête : Version. Définissez sur tous les zéros.

0x00000000 : En-tête : indicateurs. Définissez sur tous les zéros.

0x00000003 : trois entrées dans la carte (y compris l’entrée null).

0xE01D0000 : supprimez la touche CTRL droite (0xE01D --> 0x00).

0xE038E020 : Touche ALT droite --> Désactiver la touche (0xE038 --> 0xE020).

0x00000000 : Terminateur Null.

Une fois les données nécessaires générées, elles peuvent être insérées dans le Registre de plusieurs façons.

  • Vous pouvez générer un fichier .reg qui peut être facilement incorporé dans le registre système à l’aide d’un éditeur de Registre.
  • Un fichier .inf peut également être créé avec une section [AddReg] qui contient les informations du Registre à ajouter.
  • Regedt32.exe pouvez être utilisé pour ajouter manuellement les informations au Registre.

Le mappeur de code de balayage présente plusieurs avantages et inconvénients.

Les avantages sont les suivants :

  • Le Mappeur peut être utilisé comme un correctif facile pour corriger les erreurs de microprogramme.
  • Les touches fréquemment utilisées peuvent être ajoutées au clavier en modifiant la carte dans le Registre. Les clés qui ne sont pas souvent utilisées (par exemple, touche CTRL de droite) peuvent être mappées à null (supprimées) ou échangées contre d’autres clés.
  • Les emplacements clés peuvent être facilement modifiés. Les utilisateurs peuvent facilement personnaliser l’emplacement des clés fréquemment utilisées pour leur avantage.

Les inconvénients suivants sont reconnus :

  • Une fois la carte stockée dans le Registre, un redémarrage du système est nécessaire pour l’activer.
  • Les mappages stockés dans le Registre fonctionnent au niveau du système et s’appliquent à tous les utilisateurs. Ces mappages ne peuvent pas être définis pour fonctionner différemment en fonction de l’utilisateur actuel.
  • L’implémentation actuelle restreint les fonctionnalités de la carte de sorte que les mappages s’appliquent toujours à tous les claviers connectés au système. Il n’est actuellement pas possible de créer une carte par clavier.

Interroger un appareil de souris

I8042prt prend en charge la demande de contrôle d’appareil interne suivante pour interroger des informations sur un appareil à souris :

IOCTL_MOUSE_QUERY_ATTRIBUTES

Pour plus d’informations sur toutes les demandes de contrôle d’appareil de souris, consultez Informations de référence sur les appareils d’interface humaine.

Paramètres du Registre associés au pilote de classe de souris

Voici une liste de clés de Registre associées au pilote de classe de souris.

[Clé : HKLM\SYSTEM\CurrentControlSet\Services\Mouclass\Parameters]

  • MaximumPortsServiced : non utilisé sur Windows XP et versions ultérieures. Uniquement pour Windows NT4.
  • PointerDeviceBaseName : spécifie le nom de base pour les objets de périphérique créés par le pilote de périphérique de classe de souris
  • ConnectMultiplePorts : détermine s’il existe un ou plusieurs objets d’appareil de port pour chaque objet d’appareil de classe. Cette entrée est principalement utilisée par les pilotes de périphérique.
  • MouseDataQueueSize : spécifie le nombre d’événements de souris mis en mémoire tampon par le pilote de souris. Il est également utilisé pour calculer la taille de la mémoire tampon interne du pilote de souris dans le pool de mémoire non paginé.

Appareils de pointage absolus

Pour les appareils de type GUID_CLASS_MOUSE, le pilote de fonction d’un appareil :

  • Gère les entrées spécifiques à l’appareil.

  • Crée les structures MOUSE_INPUT_DATA requises par MouseClassServiceCallback.

  • Transfère MOUSE_INPUT_DATA structures vers la file d’attente de données Mouclass en appelant MouseClassServiceCallback dans sa routine d’achèvement de la répartition ISR.

Pour un appareil de pointage absolu, le pilote de fonction de l’appareil doit définir les membres LastX, LastY et Flags des structures MOUSE_INPUT_DATA de la manière suivante :

  • En plus de diviser la valeur d’entrée de l’appareil par la capacité maximale de l’appareil, le pilote met à l’échelle la valeur d’entrée de l’appareil de 0xFFFF :

    LastX = ((device input x value) * 0xFFFF ) / (Maximum x capability of the device)
    LastY = ((device input y value) * 0xFFFF ) / (Maximum y capability of the device)
    
  • Le pilote définit l’indicateur MOUSE_MOVE_ABSOLUTE dans Indicateurs.

  • Si l’entrée doit être mappée par Le Gestionnaire de fenêtres à un bureau virtuel entier, le pilote définit l’indicateur MOUSE_VIRTUAL_DESKTOP dans Indicateurs. Si l’indicateur MOUSE_VIRTUAL_DESKTOP n’est pas défini, Window Manager mappe l’entrée uniquement au moniteur principal.

Les éléments suivants spécifient, par type d’appareil, la façon dont ces exigences spéciales pour un appareil de pointage absolu sont implémentées :

  • Appareils HID :

    Mouhid, le pilote de fonction Windows pour les appareils à souris HID, implémente automatiquement ces exigences spéciales.

  • Appareils de style PS/2 :

    Un pilote de filtre de niveau supérieur est requis. Le pilote de filtre fournit un rappel IsrHook et un rappel de service de classe. I8042prt appelle l’IsrHook pour gérer l’entrée brute de l’appareil et appelle le rappel du service de classe de filtre pour filtrer l’entrée. Le rappel du service de classe de filtre appelle à son tour MouseClassServiceCallback. La combinaison du rappel IsrHook et du rappel du service de classe gère les entrées spécifiques à l’appareil, crée les structures MOUSE_INPUT_DATA requises, met à l’échelle les données d’entrée de l’appareil et définit l’indicateur MOUSE_MOVE_ABSOLUTE.

  • Plug-and-Play appareils de port COM énumérés par Serenum :

    Un pilote de fonction Plug-and-Play est requis. Le pilote de fonction crée les structures MOUSE_INPUT_DATA requises, met à l’échelle les données d’entrée d’appareil et définit l’indicateur MOUSE_MOVE_ABSOLUTE avant d’appeler MouseClassServiceCallback.

  • Appareils à port COM non Plug-and-Play :

    Un pilote de fonction spécifique à l’appareil est requis. Le pilote de fonction crée les structures MOUSE_INPUT_DATA requises, met à l’échelle les données d’entrée d’appareil et définit l’indicateur MOUSE_MOVE_ABSOLUTE avant d’appeler MouseClassServiceCallback.

  • Appareil sur un bus non pris en charge :

    Un pilote de fonction spécifique à l’appareil est requis. Le pilote de fonction crée les structures MOUSE_INPUT_DATA requises, met à l’échelle les données d’entrée d’appareil et définit l’indicateur MOUSE_MOVE_ABSOLUTE avant d’appeler MouseClassServiceCallback.