Partager via


Pilotes clients HID clavier et souris

Remarque

Cette rubrique concerne les développeurs qui créent des pilotes pour les clients HID clavier et souris. Si vous cherchez à 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 hid Mapper. Un pilote de mappeur HID est un pilote de filtre WDM en mode noyau qui fournit une interface bidirectionnelle pour les demandes 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 d’analyse en interface avec le pilote de classe de clavier existant.
  • MOUHID.sys : pilote de mappeur client HID pour les souris/pavés tactiles. Convertit les utilisations HID en commandes de souris (X/Y, boutons, roulette) en interface avec le pilote de classe de clavier existant.
  • KBDCLASS.sys : le pilote de classe de clavier fournit des fonctionnalités pour tous les claviers et pavés clavier sur le système de manière sécurisée.
  • MOUCLASS.sys : le pilote de classe de souris fournit des fonctionnalités pour toutes les souris et pavés tactiles sur le 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 HID Class est la colle entre KBDHID.sys et MOUHID.sys clients HID et divers transports, tels que USB, Bluetooth, etc.

Le système génère la pile des 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 un PDO pour chaque TLC clavier ou souris. Les appareils HID complexes (plusieurs TLC) sont exposés sous la forme de plusieurs PDA 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 clavier ou souris sont chargés sur le FDO approprié.
  • Les pilotes de mappeur HID créent des FDO pour le clavier et la souris, puis chargent les pilotes de classe.

Remarques importantes

  • Les pilotes fournisseur ne sont pas requis pour les claviers et souris conformes aux collections HID Usage et de niveau supérieur prises en charge.
  • 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, sauf si critique.
  • 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 des fonctionnalités de défilement lisses.

Conseils sur les pilotes

Microsoft fournit ces conseils pour l’écriture de pilotes IHVS :

  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 filtre 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 davantage de minidrivers de transport HID qu’ils sont complexes à écrire et à gérer. Si un partenaire crée un minidriver de transport HID, en particulier sur les systèmes SoC, nous recommandons une révision architecturale détaillée pour comprendre le raisonnement 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 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.

    • 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, visitez Panneau de configuration\Horloge, Langue et Région\Langue.

Boutons et roues pris en charge sur les souris

Le tableau suivant identifie les fonctionnalités prises en charge dans différentes versions clientes du système d’exploitation Windows.

Fonctionnalité Windows XP Windows Vista Windows 7 Windows 8 et versions ultérieures
Boutons 1-5 Pris en charge (P/2 & HID) Pris en charge (PS/2 & HID) Pris en charge (PS/2 & HID) Pris en charge (PS/2 & HID)
Roulette de défilement verticale Pris en charge (PS/2 & HID) Pris en charge (PS/2 & HID) Pris en charge (PS/2 & HID) Pris en charge (PS/2 & HID)
Roulette de défilement horizontale Non pris en charge Pris en charge (HID uniquement) Pris en charge (HID uniquement) Pris en charge (HID uniquement)
Prise en charge de la roulette de défilement lisse (horizontale et verticale) Non pris en charge Partiellement pris en charge Pris en charge (HID uniquement) Pris en charge (HID uniquement)

Activation des boutons 4-5 et roue sur des 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 définie sur le mode roue à trois boutons en définissant le taux de rapport sur 200 rapports par seconde, puis sur 100 rapports par seconde, puis sur 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 définie sur le mode roue à cinq boutons en définissant le taux de rapport sur 200 rapports par seconde, puis sur 200 rapports par seconde, puis sur 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 données compatible PS/2 standard (deux boutons)

Byte D7 D6 D5 D4 D3 D2 D1 D0 Commentaire
1 Yover Xover Ysign Xsign Tag M R L Dépassements et signes X/Y, boutons
2 X7 X6 X5 X4 X3 X2 X1 X0 Octet de données X
3 A7 Y6 Y5 A4 A3 Y2 A1 A0 Octets de données Y

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 simplement envoyer la valeur maximale de déplacement signé.

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

Byte 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 A7 Y6 Y5 A4 A3 Y2 A1 A0 Octets de données Y
4 Z7 Z6 Z5 Z4 Z3 Z2 Z1 Z0 Octet de données Z/wheel

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

Byte 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 A7 Y6 Y5 A4 A3 Y2 A1 A0 Octets de données Y
4 0 0 B5 B4 Z3 Z2 Z1 Z0 Données et boutons Z/wheel 4 et 5

Important

Notez que les données Z/wheel d’une souris à roulette à cinq boutons ont été réduites à quatre bits au lieu des 8 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 signent les quatre bits de données Z/wheel lorsque la souris est en mode roue à cinq boutons, et 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 fournisseur

Les pilotes de fournisseur 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 de IOCTL_INTERNAL_KEYBOARD_CONNECT, il envoie une demande de IOCTL_INTERNAL_I8042_HOOK_KEYBOARD synchrone au sommet de la pile d’appareils 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 d’appareil 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 leur propre information.
  • Enregistre le contexte du rappel I8042prt et des pointeurs vers des rappels que le rappel Kbfiltr ISR 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 Kbdclass qui est passée au pilote de filtre par Kbdclass.
  • Remplace ses propres informations de connexion pour les informations de connexion du pilote de classe.
  • 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 rappel de service de filtre qui peut compléter l’opération de KeyboardClassServiceCallback, la routine de rappel de service de 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

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 une fois l’interruption validée et lit 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 d’achèvement de répartition ISR du pilote de fonction appelle KbFilter_ServiceCallback, qui appelle ensuite l’implémentation du pilote de classe de 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 de l’appareil vers la file d’attente 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 Moufiltr

Moufiltr est utilisé avec Mouclass, le pilote de classe système pour les appareils de souris utilisés avec Windows 2000 et versions ultérieures, et I8042prt, le pilote de fonction pour une souris de style PS/2 utilisée 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 demande de IOCTL_INTERNAL_I8042_HOOK_MOUSE synchrone en haut de la pile d’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 d’appareil de niveau supérieur et un pointeur vers un rappel ISR.
  • Remplace les informations de niveau supérieur par leur propre information.
  • Enregistre le contexte des rappels I8042prt et des pointeurs vers des rappels que les rappels ISR 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

Moufiltr termine la demande de 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. Un rappel de service de filtre peut être configuré 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 d’attente de données de classe. Par exemple, le rappel peut supprimer, transformer ou insérer des données.