Partager via


Développement de pilotes clients HID clavier et souris

Remarque

Cet article concerne les développeurs qui créent des pilotes pour les clients HID clavier et souris. Si vous souhaitez corriger une souris ou un clavier, consultez :

Cet article traite des pilotes clients HID du clavier et de la souris. Les claviers et souris représentent le premier ensemble de clients HID normalisés dans les tables d’utilisation HID et implémentés dans les systèmes d’exploitation Windows.

Les pilotes clients HID clavier et souris sont implémentés sous la forme de pilotes de mappeur HID. Un pilote de mappeur HID est un pilote de filtre en mode noyau qui fournit une interface bidirectionnelle pour les requêtes d’E/S entre un pilote de classe non HID et le pilote de classe HID. Le pilote du mappeur mappe les requêtes d’E/S et les protocoles de données de l’un à l’autre.

Windows fournit des pilotes de mappeur HID fournis par le système pour les claviers HID et les appareils de souris HID.

Architecture et vue d’ensemble

La figure suivante illustre les piles de pilotes fournies par le système pour les périphériques clavier, souris et pavé tactile USB.

Diagramme de la pile des pilotes clavier et souris montrant les pilotes de mappeur de classe HID pour les claviers et les souris.

La figure montre les composants suivants :

  • KBDHID.sys: pilote de mappeur client HID pour les claviers. Convertit les utilisations HID en codes de balayage pour interagir avec le pilote de classe de clavier existant.
  • MOUHID.sys: pilote de mappeur client HID pour les souris/pavés tactiles. Convertit les usages HID en commandes de souris (X/Y, boutons, roulette) pour interagir avec le pilote de classe de clavier existant.
  • KBDCLASS.sys: le pilote de classe de clavier fournit de manière sécurisée des fonctionnalités pour tous les claviers et claviers numériques sur le système.
  • MOUCLASS.sys: le pilote de souris de classe fournit des fonctionnalités pour toutes les souris et pavés tactiles du système. Le pilote prend en charge les appareils de pointage absolus et relatifs. MOUCLASS.sys n’est pas le pilote Windows pour les écrans tactiles.
  • HIDCLASS.sys: pilote de classe HID. Le pilote de classe HID assure la liaison entre les clients HID KBDHID.sys et MOUHID.sys et divers moyens de transport, tels que l'USB, le Bluetooth, etc.

Le système génère le stack de pilotes comme suit :

  • La pile de transport crée un objet d’appareil physique (PDO) pour chaque périphérique HID attaché et charge le pilote de transport HID approprié, qui charge à son tour le pilote de classe HID.
  • Le pilote de classe HID crée une PDO pour chaque collection de clavier ou de souris de niveau supérieur (TLC). Les appareils HID complexes (plus d'un TLC) sont exposés sous la forme de plusieurs objets de données physiques créés par le pilote de classe HID. Par exemple, un clavier avec une souris intégrée peut avoir une collection pour les contrôles de clavier standard et une collection différente pour la souris.
  • Les pilotes de mappeur client HID pour clavier ou souris sont chargés sur l’objet de périphérique fonctionnel approprié (FDO).
  • Les pilotes de mappage HID créent des FDO pour le clavier et la souris, puis chargent les pilotes de classe.

Remarques importantes

  • Les pilotes de fournisseur ne sont pas requis pour les claviers et souris conformes aux utilisations HID prises en charge et aux collections de niveau supérieur.
  • Les fournisseurs fournissent éventuellement des pilotes de filtre dans la pile HID pour modifier/améliorer les fonctionnalités de ces TLC spécifiques.
  • Les fournisseurs doivent créer des TLC distincts, spécifiques au fournisseur, pour échanger des données propriétaires entre leur client HID et l’appareil. Évitez d'utiliser des pilotes de filtre, à moins que ce soit indispensable.
  • Le système ouvre toutes les collections de clavier et de souris pour son utilisation exclusive.
  • Le système empêche la désactivation/l’activation d’un clavier.
  • Le système prend en charge les roues horizontales/verticales avec un défilement fluide.

Instructions pour les conducteurs

Microsoft fournit ces conseils pour les fournisseurs de matériel indépendants (IHD) écrivant des pilotes :

  1. Les développeurs de pilotes sont autorisés à ajouter d’autres pilotes sous la forme d’un pilote de filtre ou d’un nouveau pilote client HID.

    1. Pilotes de filtres : les développeurs de pilotes doivent s’assurer que leur pilote d’ajout de valeur est un pilote de filtre et ne remplace pas (ou n’est pas utilisé à la place) les pilotes Windows HID existants dans la pile d’entrée.

      • Les pilotes de filtre sont autorisés dans ces scénarios :
        • En tant que filtre supérieur pour kbdhid/mouhid
        • En tant que filtre supérieur pour kbdclass/mouclass
      • Les pilotes de filtre ne sont pas recommandés comme filtres entre HIDCLASS et les minidrivers de transport HID.
    2. Pilotes de fonction : les fournisseurs peuvent également créer un pilote de fonction (au lieu d’un pilote de filtre) mais uniquement pour les pdOs HID spécifiques au fournisseur (avec un service en mode utilisateur si nécessaire).

      Les pilotes de fonction sont autorisés dans ces scénarios :

      • Charge uniquement sur le matériel du fournisseur spécifique
    3. Pilotes de transport : l’équipe Windows ne recommande pas de créer plus de minidrivers de transport HID car ils sont complexes à écrire et à gérer. Si un partenaire crée un minipilote de transport HID, en particulier sur les systèmes sur puce (SoC), nous recommandons un examen architectural détaillé pour comprendre les motivations et s’assurer que le pilote est correctement développé.

  2. Les développeurs de pilotes doivent utiliser des frameworks de pilotes (KMDF ou UMDF) et ne s’appuient pas sur WDM pour leurs pilotes de filtre.

  3. Les développeurs de pilotes doivent réduire le nombre de transitions entre l'espace noyau-utilisateur de leur service et la pile des pilotes.

  4. Les développeurs de pilotes doivent garantir la possibilité de réveiller le système via les fonctionnalités clavier et pavé tactile (réglables par l’utilisateur final (gestionnaire de périphériques) ou le fabricant du PC). En outre sur les systèmes SoC, ces appareils doivent être en mesure de se réveiller à partir d’un état moins alimenté alors que le système est dans un état S0 opérationnel.

  5. Les développeurs de pilotes doivent s'assurer que leur matériel est géré efficacement en matière d'énergie.

    • L’appareil peut entrer dans son état d’alimentation le plus bas lorsque l’appareil est inactif.
    • L’appareil est dans l’état d’alimentation le plus bas lorsque le système est dans un état d’alimentation faible (par exemple, veille (S3) ou veille connectée).

Disposition du clavier

Une disposition de clavier décrit entièrement les caractéristiques d’entrée d’un clavier pour Microsoft Windows 2000 et versions ultérieures. Par exemple, une disposition de clavier spécifie la langue, le type de clavier et la version, les modificateurs, les codes d’analyse, et ainsi de suite.

Pour plus d’informations sur les dispositions du clavier, consultez ces ressources :

  • Fichier d’en-tête de clavier, kdb.h, dans le Kit de développement de pilotes Windows (DDK), qui documente des informations générales sur les dispositions du clavier.
  • Exemples de dispositions de clavier.

Pour visualiser la disposition d’un clavier spécifique, consultez Dispositions du clavier Windows.

Pour plus d’informations sur la disposition du clavier, consultez panneau de configuration\Horloge, Langue et Région\Langue.

Boutons et roues pris en charge sur les souris

Cette liste identifie les fonctionnalités de la souris prises en charge par Windows :

  • Boutons 1-5
  • Roulette de défilement verticale
  • Roulette de défilement horizontale
  • Prise en charge de la roulette de défilement lisse (horizontale et verticale)

Activation des boutons 4 et 5 ainsi que de la molette sur les souris PS/2

La méthode utilisée par Windows pour activer le nouveau mode à quatre et cinq boutons et roues est une extension de la méthode utilisée pour activer le troisième bouton et la roue dans les souris compatibles IntelliMouse :

  • La souris est réglée sur le mode à trois boutons en passant la fréquence de rapport à 200 rapports par seconde, puis à 100 rapports par seconde, puis à 80 rapports par seconde. Ensuite, lecture de l’ID à partir de la souris. La souris doit signaler un ID de 3 lorsque cette séquence est terminée.

  • La souris est ensuite configurée en mode roue à cinq boutons en réglant le taux de rapport à 200 rapports par seconde, puis de nouveau à 200 rapports par seconde, puis à 80 rapports par seconde. Ensuite, lecture de l’ID à partir de la souris. Une fois la séquence terminée, une souris à roulette à cinq boutons doit signaler un ID de 4 (tandis qu’une souris à trois boutons compatible intelliMouse signale toujours un ID de 3).

Cette méthode s’applique uniquement aux souris PS/2, pas aux souris HID. Les souris HID doivent signaler des utilisations précises dans leur descripteur de rapport.

Format de paquet de données de souris standard compatible PS/2 (deux boutons)

Octet D7 D6 D5 D4 D3 D2 D1 D0 Commentaire
1 Yover Xover Ysign Xsign Étiquette M R L Débordements et indicateurs X/Y, boutons
2 X7 X6 X5 X4 X3 X2 X1 X0 Octet de données X
3 Y7 Y6 Y5 Y4 Y3 Y2 Y1 Y0 Y octets de données

Remarque

Les pilotes de souris Windows ne vérifient pas les bits de dépassement. En cas de dépassement de capacité, la souris doit envoyer la valeur maximale de déplacement signé.

Format de paquet de données compatible PS/2 standard (trois boutons + molette verticale)

Octet D7 D6 D5 D4 D3 D2 D1 D0 Commentaire
1 0 0 Ysign Xsign 1 M R L Panneaux X/Y et boutons R/L/M
2 X7 X6 X5 X4 X3 X2 X1 X0 Octet de données X
3 Y7 Y6 Y5 Y4 Y3 Y2 Y1 Y0 Octets de données Y
4 Z7 Z6 Z5 Z4 Z3 Z2 Z1 Z0 Octet de données Z/roue

Format de paquet de données de souris compatible PS/2 standard (cinq boutons + roue verticale)

Octet D7 D6 D5 D4 D3 D2 D1 D0 Commentaire
1 0 0 Ysign Xsign 1 M R L Panneaux X/Y et boutons R/L/M
2 X7 X6 X5 X4 X3 X2 X1 X0 Octet de données X
3 Y7 Y6 Y5 Y4 Y3 Y2 Y1 Y0 Octets de données Y
4 0 0 B5 B4 Z3 Z2 Z1 Z0 Données et boutons Z/wheel 4 et 5

Important

Les données Z/wheel d’une souris à roulette à cinq boutons sont réduites à quatre bits au lieu des huit bits utilisés en mode roue à trois boutons compatibles IntelliMouse. Cette réduction est rendue possible par le fait que la roue ne peut généralement pas générer de valeurs au-delà de la plage +7/-8 pendant une période d’interruption donnée. Les pilotes de souris Windows étendent les quatre bits de données Z/wheel lorsque la souris est en mode roue à cinq boutons. Ils signent étendre l’octet de données Z/wheel complet lorsque la souris fonctionne en mode roue à trois boutons.

Les boutons 4 et 5 sont mappés aux messages WM_APPCOMMAND et correspondent à App_Back et App_Forward.

Appareils ne nécessitant pas de pilotes de constructeur

Les pilotes de constructeur ne sont pas requis pour les appareils suivants :

  • Appareils conformes à la norme HID.
  • Les périphériques clavier, souris ou port de jeu gérés par les pilotes non HIDClass fournis par le système.

Exemple Kbfiltr

Kbfiltr est utilisé avec Kbdclass, le pilote de classe système pour les périphériques clavier et I8042prt, le pilote de fonction pour un clavier de style PS/2. Kbfiltr montre comment filtrer les demandes d’E/S et comment ajouter des routines de rappel qui modifient l’opération de Kbdclass et I8042prt.

Pour plus d’informations sur l’opération Kbfiltr, consultez :

Codes de contrôle d’E/S Kbfiltr

Les IOCTL suivants sont utilisés par Kbfiltr.

IOCTL_INTERNAL_I8042_HOOK_KEYBOARD

Requête IOCTL_INTERNAL_I8042_HOOK_KEYBOARD :

  • Ajoute une routine de rappel d’initialisation à la routine d’initialisation du clavier I8042prt.
  • Ajoute une routine de rappel ISR au clavier I8042prt ISR.

Les rappels d’initialisation et d’ISR sont facultatifs et sont fournis par un pilote de filtre de niveau supérieur pour un périphérique clavier de style PS/2.

Une fois que I8042prt reçoit une demande IOCTL_INTERNAL_KEYBOARD_CONNECT, il envoie une demande synchrone IOCTL_INTERNAL_I8042_HOOK_KEYBOARD au sommet de la pile de dispositifs clavier.

Une fois que Kbfiltr reçoit la demande de clavier de hook, Kbfiltr filtre la requête de la manière suivante :

  • Enregistre les informations de niveau supérieur passées à Kbfiltr, qui incluent le contexte d’un objet de périphérique de niveau supérieur, un pointeur vers un rappel d’initialisation et un pointeur vers un rappel ISR.
  • Remplace les informations de niveau supérieur par la sienne.
  • Enregistre le contexte de I8042prt et des pointeurs vers les callbacks que le callback ISR de Kbfiltr peut utiliser.

IOCTL_INTERNAL_KEYBOARD_CONNECT

La requête IOCTL_INTERNAL_KEYBOARD_CONNECT connecte le service Kbdclass à l’appareil clavier. Kbdclass envoie cette requête vers le bas de la pile des appareils clavier avant d’ouvrir l’appareil clavier.

Une fois que Kbfiltr a reçu la demande de connexion au clavier, Kbfiltr filtre la demande de connexion de la façon suivante :

  • Enregistre une copie de la structure CONNECT_DATA (Kbdclass) de Kbdclasse qui est passée au pilote de filtre par Kbdclass.
  • Remplace les informations de connexion du pilote de classe par ses propres informations de connexion.
  • Envoie la requête IOCTL_INTERNAL_KEYBOARD_CONNECT vers le bas de la pile de l’appareil.

Si la demande ne réussit pas, Kbfiltr termine la demande avec un état d’erreur approprié.

Kbfiltr fournit un modèle pour une routine de filtre qui peut améliorer l’opération de KeyboardClassServiceCallback, la routine de rappel de service de la classe Kbdclass. Le rappel de service de filtre peut filtrer les données d’entrée transférées de la mémoire tampon d’entrée de l’appareil vers la file d’attente de données de classe.

IOCTL_INTERNAL_KEYBOARD_DISCONNECT (commande de déconnexion interne du clavier)

La demande IOCTL_INTERNAL_KEYBOARD_DISCONNECT est terminée avec l’état de STATUS_NOT_IMPLEMENTED. Le gestionnaire Plug-and-Play peut ajouter ou supprimer un clavier Plug-and-Play.

Pour toutes les autres demandes de contrôle d’appareil, Kbfiltr ignore la pile IRP actuelle et envoie la requête vers le bas de la pile d’appareils sans traitement supplémentaire.

Routines de rappel implémentées par Kbfiltr

Kbfiltr implémente les routines de rappel suivantes.

KbFilter_InitializationRoutine

Voir PI8042_KEYBOARD_INITIALIZATION_ROUTINE

La KbFilter_InitializationRoutine n’est pas nécessaire si l’initialisation par défaut I8042prt d’un clavier est suffisante.

I8042prt appelle KbFilter_InitializationRoutine quand il initialise le clavier. L’initialisation par défaut du clavier inclut les opérations suivantes :

  • réinitialiser le clavier
  • définir le taux typmatique et le délai
  • définir les diodes à émission de lumière (LED)
/*
Parameters
DeviceObject [in]
Pointer to the device object that is the context for this callback.

SynchFuncContext [in]
Pointer to the context for the routines pointed to by ReadPort and Writeport.

ReadPort [in]
Pointer to the system-supplied PI8042_SYNCH_READ_PORT callback that reads from the port.

WritePort [in]
Pointer to the system-supplied PI8042_SYNCH_WRITE_PORT callback that writes to the port.

TurnTranslationOn [out]
Specifies, if TRUE, to turn translation on. Otherwise, translation is turned off.

Return value
KbFilter_InitializationRoutine returns an appropriate NTSTATUS code.
*/

NTSTATUS KbFilter_InitializationRoutine(
  In  PDEVICE_OBJECT          DeviceObject,
  In  PVOID                   SynchFuncContext,
  In  PI8042_SYNCH_READ_PORT  ReadPort,
  In  PI8042_SYNCH_WRITE_PORT WritePort,
  Out PBOOLEAN                TurnTranslationOn
);

KbFilter_IsrHook

Voir PI8042_KEYBOARD_ISR. Ce rappel n’est pas nécessaire si l’opération par défaut de I8042prt est suffisante.

L’ISR du clavier I8042prt appelle KbFilter_IsrHook après avoir validé l’interruption et lu le code d’analyse.

KbFilter_IsrHook s’exécute en mode noyau à l’IRQL du clavier I8042prt.

/*
Parameters
DeviceObject [in]
Pointer to the filter device object of the driver that supplies this callback.

CurrentInput [in]
Pointer to the input KEYBOARD_INPUT_DATA structure that is being constructed by the ISR.

CurrentOutput [in]
Pointer to an OUTPUT_PACKET structure that specifies the bytes that are being written to the hardware device.

StatusByte [in, out]
Specifies the status byte that is read from I/O port 60 when an interrupt occurs.

DataByte [in]
Specifies the data byte that is read from I/O port 64 when an interrupt occurs.

ContinueProcessing [out]
Specifies, if TRUE, to continue processing in the I8042prt keyboard ISR after this callback returns; otherwise, processing is not continued.

ScanState [in]
Pointer to a KEYBOARD_SCAN_STATE structure that specifies the keyboard scan state.

Return value
KbFilter_IsrHook returns TRUE if the interrupt service routine should continue; otherwise it returns FALSE.
*/

KbFilter_IsrHook KbFilter_IsrHook(
  In    PDEVICE_OBJECT       DeviceObject,
  In    PKEYBOARD_INPUT_DATA CurrentInput,
  In    POUTPUT_PACKET       CurrentOutput,
  Inout UCHAR                StatusByte,
  In    PUCHAR               DataByte,
  Out   PBOOLEAN             ContinueProcessing,
  In    PKEYBOARD_SCAN_STATE ScanState
);

KbFilter_ServiceCallback

Voir PSERVICE_CALLBACK_ROUTINE.

La routine de fin d'envoi ISR du pilote de fonction appelle KbFilter_ServiceCallback, qui appelle ensuite l’implémentation du pilote de classe clavier de PSERVICE_CALLBACK_ROUTINE. Un fournisseur peut implémenter un rappel de service de filtre pour modifier les données d'entrée transférées de la mémoire tampon d'entrée du dispositif vers la file de données de classe. Par exemple, le rappel peut supprimer, transformer ou insérer des données.

/*
Parameters
DeviceObject [in]
Pointer to the class device object.

InputDataStart [in]
Pointer to the first keyboard input data packet in the input data buffer of the port device.

InputDataEnd [in]
Pointer to the keyboard input data packet that immediately follows the last data packet in the input data buffer of the port device.

InputDataConsumed [in, out]
Pointer to the number of keyboard input data packets that are transferred by the routine.

Return value
None
*/

VOID KbFilter_ServiceCallback(
  In    PDEVICE_OBJECT       DeviceObject,
  In    PKEYBOARD_INPUT_DATA InputDataStart,
  In    PKEYBOARD_INPUT_DATA InputDataEnd,
  Inout PULONG               InputDataConsumed
);

Exemple de Moufiltr

Moufiltr fonctionne avec Mouclass, le pilote de classe système pour les appareils de souris. Il fonctionne également avec I8042prt, le pilote de fonction pour une souris de style PS/2. Les deux pilotes sont utilisés avec Windows 2000 et versions ultérieures. Moufiltr montre comment filtrer les demandes d’E/S et ajouter des routines de rappel qui modifient l’opération de Mouclass et I8042prt.

Pour plus d’informations sur l’opération Moufiltr, consultez les ressources suivantes :

Codes de contrôle d’E/S Moufiltr

Les IOCTL suivants sont utilisés par Moufiltr.

IOCTL_INTERNAL_I8042_HOOK_MOUSE

La requête IOCTL_INTERNAL_I8042_HOOK_MOUSE ajoute une routine de rappel ISR à l’ISR de la souris I8042prt. Le rappel ISR est facultatif et est fourni par un pilote de filtre de souris de niveau supérieur.

I8042prt envoie cette requête une fois qu’elle reçoit une demande de IOCTL_INTERNAL_MOUSE_CONNECT . I8042prt envoie une requête IOCTL_INTERNAL_I8042_HOOK_MOUSE synchrone au sommet de la pile des appareils de la souris.

Une fois Que Moufiltr reçoit la demande de la souris de crochet, elle filtre la requête de la façon suivante :

  • Enregistre les informations de niveau supérieur passées à Moufiltr, qui incluent le contexte d’un objet de périphérique de niveau supérieur et un pointeur vers un callback ISR.
  • Remplace l'information de niveau supérieur par ses propres informations.
  • Enregistre le contexte de I8042prt et les pointeurs vers des rappels que les rappels ISR de Moufiltr peuvent utiliser.

IOCTL_INTERNAL_MOUSE_CONNECT

La requête IOCTL_INTERNAL_MOUSE_CONNECT connecte le service Mouclass à un appareil de souris.

IOCTL_INTERNAL_MOUSE_DISCONNECT (commande interne pour déconnecter la souris)

Moufiltr termine la demande d'IOCTL_INTERNAL_MOUSE_DISCONNECT avec un état d’erreur de STATUS_NOT_IMPLEMENTED.

Pour toutes les autres demandes, Moufiltr ignore la pile IRP actuelle et envoie la requête vers le bas de la pile de l’appareil sans traitement supplémentaire.

Routines de rappel Moufiltr

MouFiltr implémente les routines de rappel suivantes.

MouFilter_IsrHook

Voir PI8042_MOUSE_ISR.

/*
Parameters
DeviceObject
Pointer to the filter device object of the driver that supplies this callback.

CurrentInput
Pointer to the input MOUSE_INPUT_DATA structure being constructed by the ISR.

CurrentOutput
Pointer to the OUTPUT_PACKET structure that specifies the bytes being written to the hardware device.

StatusByte
Specifies a status byte that is read from I/O port 60 when the interrupt occurs.

DataByte
Specifies a data byte that is read from I/O port 64 when the interrupt occurs.

ContinueProcessing
Specifies, if TRUE, that the I8042prt mouse ISR continues processing after this callback returns. Otherwise, processing is not continued.

MouseState
Pointer to a MOUSE_STATE enumeration value, which identifies the state of mouse input.

ResetSubState
Pointer to MOUSE_RESET_SUBSTATE enumeration value, which identifies the mouse reset substate. See the Remarks section.

Return value
MouFilter_IsrHook returns TRUE if the interrupt service routine should continue; otherwise it returns FALSE.
*/

BOOLEAN MouFilter_IsrHook(
   PDEVICE_OBJECT        DeviceObject,
   PMOUSE_INPUT_DATA     CurrentInput,
   POUTPUT_PACKET        CurrentOutput,
   UCHAR                 StatusByte,
   PUCHAR                DataByte,
   PBOOLEAN              ContinueProcessing,
   PMOUSE_STATE          MouseState,
   PMOUSE_RESET_SUBSTATE ResetSubState
);

Un rappel MouFilter_IsrHook n’est pas nécessaire si l’opération par défaut de I8042prt est suffisante.

L’ISR de la souris I8042prt appelle MouFilter_IsrHook une fois l’interruption validée.

Pour réinitialiser une souris, I8042prt passe par une séquence de sous-états opérationnels. Une valeur d’énumération MOUSE_RESET_SUBSTATE identifie chaque sous-état. Pour plus d’informations sur la façon dont I8042prt réinitialise une souris et les sous-états de réinitialisation de la souris correspondants, consultez la documentation de MOUSE_RESET_SUBSTATE dans ntdd8042.h.

MouFilter_IsrHook s’exécute en mode noyau à l’IRQL de l’ISR de la souris I8042prt.

MouFilter_ServiceCallback

Voir PSERVICE_CALLBACK_ROUTINE

/*
Parameters
DeviceObject [in]
Pointer to the class device object.

InputDataStart [in]
Pointer to the first mouse input data packet in the input data buffer of the port device.

InputDataEnd [in]
Pointer to the mouse input data packet immediately following the last data packet in the port device's input data buffer.

InputDataConsumed [in, out]
Pointer to the number of mouse input data packets that are transferred by the routine.

Return value
None
*/

VOID MouFilter_ServiceCallback(
  _In_    PDEVICE_OBJECT    DeviceObject,
  _In_    PMOUSE_INPUT_DATA InputDataStart,
  _In_    PMOUSE_INPUT_DATA InputDataEnd,
  _Inout_ PULONG            InputDataConsumed
);

Le DPC ISR de I8042prt appelle MouFilter_ServiceCallback, qui appelle ensuite MouseClassServiceCallback. Une fonction de rappel de service de filtre peut être configurée pour modifier les données d’entrée transférées de la mémoire tampon d’entrée de l’appareil vers la file de données de classe. Par exemple, le rappel peut supprimer, transformer ou insérer des données.