Tastatur- und Maus-HID-Clienttreiber

Hinweis

Dieses Thema richtet sich an Entwickler, die Treiber für Tastatur- und Maus-HID-Clients erstellen. Wenn Sie eine Maus oder Tastatur reparieren möchten, lesen Sie:

In diesem Artikel werden Tastatur- und Maus-HID-Clienttreiber erläutert. Tastaturen und Mäuse stellen den ersten Satz von HID-Clients dar, die in den HID-Verwendungstabellen standardisiert und in Windows-Betriebssystemen implementiert wurden.

Tastatur- und Maus-HID-Clienttreiber werden in Form von HID-Mappertreibern implementiert. Ein HID-Mappertreiber ist ein Kernelmodus-WDM-Filtertreiber, der eine bidirektionale Schnittstelle für E/A-Anforderungen zwischen einem Nicht-HID-Klassentreiber und dem HID-Klassentreiber bereitstellt. Der Mapper-Treiber ordnet die E/A-Anforderungen und Datenprotokolle voneinander zu.

Windows bietet vom System bereitgestellte HID-Mappertreiber für HID-Tastatur und HID-Mäusegeräte.

Architektur und Übersicht

Die folgende Abbildung zeigt die vom System bereitgestellten Treiberstapel für USB-Tastatur-, Maus- und Touchpadgeräte.

Diagramm des Tastatur- und Maustreiberstapels mit den HID-Klassenzuordnungstreibern für Tastaturen und Mäuse.

Die Abbildung zeigt die folgenden Komponenten:

  • KBDHID.sys: HID-Clientzuordnungstreiber für Tastaturen. Wandelt HID-Verwendungen in Scancodes in Schnittstellen mit dem vorhandenen Tastaturklassentreiber um.
  • MOUHID.sys: HID-Client-Mappertreiber für Mäuse/Touchpads. Wandelt HID-Verwendungen in Mausbefehle (X/Y, Schaltflächen, Rad) in die Schnittstelle mit dem vorhandenen Tastaturklassentreiber um.
  • KBDCLASS.sys: Der Tastaturklassentreiber bietet Funktionen für alle Tastaturen und Tastaturen auf sichere Weise auf dem System.
  • MOUCLASS.sys: Der Mausklassentreiber bietet Funktionen für alle Mäuse und Touchpads auf dem System. Der Treiber unterstützt sowohl absolute als auch relative Zeigegeräte. MOUCLASS.sys ist nicht der Windows-Treiber für Touchscreens.
  • HIDCLASS.sys: Der HID-Klassentreiber. Der HID-Klassentreiber ist der Klebstoff zwischen KBDHID.sys und MOUHID.sys HID-Clients und verschiedenen Transporten wie USB, Bluetooth usw.

Das System erstellt den Treiberstapel wie folgt:

  • Der Transportstapel erstellt ein physisches Geräteobjekt (PDO) für jedes angeschlossene HID-Gerät und lädt den entsprechenden HID-Transporttreiber, der wiederum den HID-Klassentreiber lädt.
  • Der HID-Klassentreiber erstellt einen PDO für jede Tastatur oder Maus-TLC. Komplexe HID-Geräte (mehr als ein TLC) werden als mehrere VON HID-Klassentreibern erstellte PDOs verfügbar gemacht. Beispielsweise kann eine Tastatur mit einer integrierten Maus eine Sammlung für die Standardtastaturen und eine andere Sammlung für die Maus haben.
  • Die Tastatur- oder Maus-HID-Clientzuordnungstreiber werden auf den entsprechenden FDO geladen.
  • Die HID-Mappertreiber erstellen FDOs für Tastatur und Maus und laden die Klassentreiber.

Wichtige Hinweise

  • Anbietertreiber sind für Tastaturen und Mäuse, die den unterstützten HID-Verwendungen und Sammlungen der obersten Ebene entsprechen, nicht erforderlich.
  • Anbieter bieten optional Filtertreiber im HID-Stapel an, um die Funktionalität dieser spezifischen TLC zu ändern/zu verbessern.
  • Anbieter sollten separate, herstellerspezifische TLCs erstellen, um proprietäre Daten zwischen ihrem HID-Client und dem Gerät auszutauschen. Vermeiden Sie die Verwendung von Filtertreibern, es sei denn, es ist wichtig.
  • Das System öffnet alle Tastatur- und Maussammlungen zur exklusiven Verwendung.
  • Das System verhindert die Deaktivierung/Aktivierung einer Tastatur.
  • Das System bietet Unterstützung für horizontale/vertikale Räder mit reibungslosen Bildlauffunktionen.

Treiberleitfaden

Microsoft bietet diese Anleitung für IHVs zum Schreiben von Treibern:

  1. Treiberentwickler dürfen in Form eines Filtertreibers oder eines neuen HID-Clienttreibers weitere Treiber hinzufügen.

    1. Filtertreiber: Treiberentwickler sollten sicherstellen, dass ihr Wert-Add-Treiber ein Filtertreiber ist und vorhandene Windows HID-Treiber im Eingabestapel nicht ersetzt (oder anstelle dieser verwendet werden).

      • Filtertreiber sind in diesen Szenarien zulässig:
        • Als oberer Filter für kbdhid/mouhid
        • Als oberer Filter für kbdclass/mouclass
      • Filtertreiber werden nicht als Filter zwischen HIDCLASS- und HID-Transport-Minidrivern empfohlen.
    2. Funktionstreiber: Alternativ können Anbieter einen Funktionstreiber (anstelle eines Filtertreibers) erstellen, aber nur für herstellerspezifische HID-PDOs (bei Bedarf mit einem Benutzermodusdienst).

      Funktionstreiber sind in diesen Szenarien zulässig:

      • Nur laden auf die Hardware des jeweiligen Herstellers
    3. Transporttreiber: Das Windows-Team empfiehlt nicht, mehr HID-Transport-Minidriver zu erstellen, die für das Schreiben und Warten komplex sind. Wenn ein Partner einen neuen HID-Transport-Minidriver erstellt, insbesondere auf SoC-Systemen, empfehlen wir eine detaillierte Architekturüberprüfung, um die Begründung zu verstehen und sicherzustellen, dass der Treiber ordnungsgemäß entwickelt wird.

  2. Treiberentwickler sollten Treiberframeworks (KMDF oder UMDF) verwenden und sich nicht auf WDM für ihre Filtertreiber verlassen.

  3. Treiberentwickler sollten die Anzahl der Kernelbenutzerübergänge zwischen ihrem Dienst und dem Treiberstapel verringern.

  4. Treiberentwickler sollten sicherstellen, dass das System sowohl über die Tastatur als auch über die Touchpadfunktion (vom Endbenutzer (Gerätemanager) oder vom PC-Hersteller angepasst werden kann. Zusätzlich zu SoC-Systemen müssen diese Geräte in der Lage sein, sich aus einem niedrigeren Betriebszustand zu reaktivieren, während sich das System in einem funktionierenden S0-Zustand befindet.

  5. Treiberentwickler sollten sicherstellen, dass ihre Hardware effizient verwaltet wird.

    • Das Gerät kann in den niedrigsten Leistungszustand wechseln, wenn das Gerät im Leerlauf ist.
    • Das Gerät befindet sich im niedrigsten Leistungszustand, wenn sich das System in einem Energiesparzustand befindet (z. B. Standby (S3) oder angeschlossener Standbymodus).

Tastaturlayout

Ein Tastaturlayout beschreibt die Eingabemerkmale einer Tastatur für Microsoft Windows 2000 und höhere Versionen vollständig. Ein Tastaturlayout gibt z. B. die Sprache, den Tastaturtyp und die Version, Modifizierer, Scancodes usw. an.

Informationen zu Tastaturlayouts finden Sie in den folgenden Ressourcen:

  • Tastaturheaderdatei, kdb.h, im Windows Driver Development Kit (DDK), die allgemeine Informationen zu Tastaturlayouts dokumentiert.

  • Beispieltastaturlayouts.

Informationen zum Visualisieren des Layouts einer bestimmten Tastatur finden Sie unter Windows-Tastaturlayouts.

Weitere Informationen zum Tastaturlayout finden Sie unter Systemsteuerung\Uhr, Sprache und Region\Sprache.

Unterstützte Tasten und Räder auf Mäusen

In der folgenden Tabelle sind die Features aufgeführt, die in verschiedenen Clientversionen des Windows-Betriebssystems unterstützt werden.

Funktion Windows XP Windows Vista Windows 7 Windows 8 und höher
Schaltflächen 1-5 Unterstützt (P/2 & HID) Unterstützt (PS/2 & HID) Unterstützt (PS/2 & HID) Unterstützt (PS/2 & HID)
Vertikales Bildlaufrad Unterstützt (PS/2 & HID) Unterstützt (PS/2 & HID) Unterstützt (PS/2 & HID) Unterstützt (PS/2 & HID)
Horizontales Bildlaufrad Nicht unterstützt Unterstützt(nur HID) Unterstützt(nur HID) Unterstützt(nur HID)
Unterstützung für glattes Bildlaufrad (horizontal und vertikal) Nicht unterstützt Teilweise unterstützt Unterstützt (nur HID) Unterstützt (nur HID)

Aktivieren von Tasten 4-5 und Rad auf PS/2 Mäusen

Die Methode, die von Windows zum Aktivieren der neuen vier- und fünfstelligen Knopf- und Radmodus verwendet wird, ist eine Erweiterung der Methode, die zum Aktivieren der dritten Taste und des Rads in IntelliMouse-kompatiblen Mäusen verwendet wird:

  • Die Maus wird auf den Drei-Tasten-Radmodus festgelegt, indem die Berichtsrate auf 200 Berichte pro Sekunde, dann auf 100 Berichte pro Sekunde und dann auf 80 Berichte pro Sekunde festgelegt wird. Lesen Sie dann die ID aus der Maus. Die Maus sollte eine ID von 3 melden, wenn diese Sequenz abgeschlossen ist.

  • Die Maus wird dann auf den Fünf-Tasten-Radmodus festgelegt, indem die Berichtsrate auf 200 Berichte pro Sekunde festgelegt wird, dann wieder auf 200 Berichte pro Sekunde, dann auf 80 Berichte pro Sekunde. Lesen Sie dann die ID aus der Maus. Sobald die Sequenz abgeschlossen ist, sollte eine Fünf-Tasten-Rad-Maus eine ID von 4 melden (während eine IntelliMouse-kompatible Drei-Tasten-Rad-Maus trotzdem eine ID von 3 melden würde).

Diese Methode gilt nur für PS/2-Mäuse, nicht für HID-Mäuse. HID-Mäuse müssen genaue Verwendungen in ihrem Berichtsdeskriptor melden.

Standard-PS/2-kompatibles Mausdatenpaketformat (zwei Schaltflächen)

Byte D7 D6 D5 D4 D3 D2 D1 D0 Kommentar
1 Yover Xover Ysign Xsign Tag M R L X/Y-Überläufe und -zeichen, Schaltflächen
2 X7 X6 X5 X4 X3 X2 X1 X0 X-Datenbyte
3 J7 J6 J5 J4 J3 Y2 J1 Y0 Y-Datenbytes

Hinweis

Windows-Maustreiber überprüfen die Überlaufbits nicht. Bei Überlauf sollte die Maus einfach den maximal signierten Verdrängungswert senden.

Standardmäßiges PS/2-kompatibles Mausdatenpaketformat (drei Tasten + vertikales Rad)

Byte D7 D6 D5 D4 D3 D2 D1 D0 Kommentar
1 0 0 Ysign Xsign 1 M R L X/Y-Zeichen und R/L/M-Tasten
2 X7 X6 X5 X4 X3 X2 X1 X0 X-Datenbyte
3 J7 J6 J5 J4 J3 Y2 J1 Y0 Y-Datenbytes
4 Z7 Z6 Z5 Z4 Z3 Z2 Z1 Z0 Z/Wheel-Datenbyte

Standardmäßiges PS/2-kompatibles Mausdatenpaketformat (fünf Tasten + vertikales Rad)

Byte D7 D6 D5 D4 D3 D2 D1 D0 Kommentar
1 0 0 Ysign Xsign 1 M R L X/Y-Zeichen und R/L/M-Tasten
2 X7 X6 X5 X4 X3 X2 X1 X0 X-Datenbyte
3 J7 J6 J5 J4 J3 Y2 J1 Y0 Y-Datenbytes
4 0 0 B5 B4 Z3 Z2 Z1 Z0 Z/Rad-Daten und Schaltflächen 4 und 5

Wichtig

Beachten Sie, dass die Z/Wheel-Daten für eine Fünf-Tasten-Rad-Maus auf vier Bits reduziert wurden, anstelle der 8 Bits, die im IntelliMouse-kompatiblen Drei-Tasten-Radmodus verwendet werden. Diese Reduzierung wird durch die Tatsache ermöglicht, dass das Rad in der Regel keine Werte über den Bereich +7/-8 während eines bestimmten Unterbrechungszeitraums generieren kann. Windows-Maustreiber signieren die vier Z/Rad-Datenbits, wenn sich die Maus im Fünf-Tasten-Radmodus befindet, und das vollständige Z/Rad-Datenbyte, wenn die Maus im Drei-Tasten-Radmodus ausgeführt wird.

Schaltflächen 4 & 5 sind WM_APPCOMMAND Nachrichten zugeordnet und entsprechen App_Back und App_Forward.

Geräte, für die keine Anbietertreiber erforderlich sind

Anbietertreiber sind für die folgenden Geräte nicht erforderlich:

  • Geräte, die dem HID-Standard entsprechen.
  • Tastatur-, Maus- oder Spieleportgeräte, die von den vom System bereitgestellten nicht HIDClass-Treibern betrieben werden.

Kbfiltr-Beispiel

Kbfiltr wird mit Kbdclass, dem Systemklassentreiber für Tastaturgeräte und I8042prt, dem Funktionstreiber für eine PS/2-Stil-Tastatur verwendet. Kbfiltr veranschaulicht das Filtern von E/A-Anforderungen und das Hinzufügen von Rückrufroutinen, die den Vorgang von Kbdclass und I8042prt ändern.

Weitere Informationen zum Kbfiltr-Vorgang finden Sie unter:

Kbfiltr-E/A-Steuercodes

Die folgenden IOCTLs werden von Kbfiltr verwendet.

IOCTL_INTERNAL_I8042_HOOK_KEYBOARD

Die IOCTL_INTERNAL_I8042_HOOK_KEYBOARD Anforderung:

  • Fügt der I8042prt-Tastaturinitialisierungsroutine eine Initialisierungsrückrufroutine hinzu.
  • Fügt der I8042prt-Tastatur-ISR eine ISR-Rückrufroutine hinzu.

Die Initialisierung und ISR-Rückrufe sind optional und werden von einem Filtertreiber auf oberster Ebene für ein PS/2-Tastaturgerät bereitgestellt.

Nachdem I8042prt eine IOCTL_INTERNAL_KEYBOARD_CONNECT Anforderung empfängt, sendet sie eine synchrone IOCTL_INTERNAL_I8042_HOOK_KEYBOARD Anforderung an den Anfang des Tastaturgerätestapels.

Nachdem Kbfiltr die Hook-Tastaturanforderung empfängt, filtert Kbfiltr die Anforderung wie folgt:

  • Speichert die an Kbfiltr übergebenen Informationen der oberen Ebene, die den Kontext eines Geräteobjekts der oberen Ebene, einen Zeiger auf einen Initialisierungsrückruf und einen Zeiger auf einen ISR-Rückruf enthält.
  • Ersetzt die Informationen auf oberster Ebene durch eigene Informationen.
  • Speichert den Kontext von I8042prt und Zeigern in Rückrufen, die der Kbfiltr ISR-Rückruf verwenden kann.

IOCTL_INTERNAL_KEYBOARD_CONNECT

Die IOCTL_INTERNAL_KEYBOARD_CONNECT Anforderung verbindet den Kbdclass-Dienst mit dem Tastaturgerät. Kbdclass sendet diese Anforderung an den Tastaturgerätestapel, bevor es das Tastaturgerät öffnet.

Nachdem Kbfiltr die Tastaturverbindungsanforderung empfangen hat, filtert Kbfiltr die Verbindungsanforderung wie folgt:

  • Speichert eine Kopie der CONNECT_DATA (Kbdclass)-Struktur von Kbdclass, die von Kbdclass an den Filtertreiber übergeben wird.
  • Ersetzt seine eigenen Verbindungsinformationen für die Verbindungsinformationen des Klassentreibers.
  • Sendet die IOCTL_INTERNAL_KEYBOARD_CONNECT Anforderung an den Gerätestapel nach unten.

Wenn die Anforderung nicht erfolgreich ist, schließt Kbfiltr die Anforderung mit einem entsprechenden Fehlerstatus ab.

Kbfiltr stellt eine Vorlage für eine Filterdienstrückrufroutine bereit, die den Vorgang von KeyboardClassServiceCallback, der Kbdclass-Dienstrückrufroutine, ergänzen kann. Der Filterdienstrückruf kann die Eingabedaten filtern, die vom Geräteeingabepuffer in die Klassendatenwarteschlange übertragen werden.

IOCTL_INTERNAL_KEYBOARD_DISCONNECT

Die IOCTL_INTERNAL_KEYBOARD_DISCONNECT Anforderung wird mit dem Status STATUS_NOT_IMPLEMENTED abgeschlossen. Der Plug & Play-Manager kann eine Plug & Play Tastatur hinzufügen oder entfernen.

Für alle anderen Gerätesteuerungsanforderungen überspringt Kbfiltr den aktuellen IRP-Stapel und sendet die Anforderung ohne weitere Verarbeitung an den Gerätestapel.

Von Kbfiltr implementierte Rückrufroutinen

Kbfiltr implementiert die folgenden Rückrufroutinen.

KbFilter_InitializationRoutine

Siehe PI8042_KEYBOARD_INITIALIZATION_ROUTINE

Die KbFilter_InitializationRoutine ist nicht erforderlich, wenn die I8042prt-Standardinitialisierung einer Tastatur ausreicht.

I8042prt ruft KbFilter_InitializationRoutine auf, wenn die Tastatur initialisiert wird. Die Standardmäßige Tastaturinitialisierung umfasst die folgenden Vorgänge:

  • Zurücksetzen der Tastatur
  • festlegen der typgesteuerten Rate und Verzögerung
  • setzen Sie die Leuchtdioden (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

Siehe PI8042_KEYBOARD_ISR. Dieser Rückruf ist nicht erforderlich, wenn der Standardvorgang von I8042prt ausreichend ist.

Der I8042prt-Tastatur-ISR ruft KbFilter_IsrHook auf, nachdem er den Interrupt überprüft und den Scancode liest.

KbFilter_IsrHook wird im Kernelmodus auf der IRQL der I8042prt-Tastatur ausgeführt.

/*
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

Siehe PSERVICE_CALLBACK_ROUTINE.

Die ISR-Verteilerabschlussroutine des Funktionstreibers ruft KbFilter_ServiceCallback auf, wodurch dann die Implementierung von PSERVICE_CALLBACK_ROUTINE des Tastaturklassentreibers aufgerufen wird. Ein Anbieter kann einen Filterdienstrückruf implementieren, um die Eingabedaten zu ändern, die vom Eingabepuffer des Geräts in die Klassendatenwarteschlange übertragen werden. Beispielsweise kann der Rückruf Daten löschen, transformieren oder einfügen.

/*
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
);

Moufiltr-Beispiel

Moufiltr wird mit Mouclass, dem Systemklassentreiber für Mausgeräte verwendet, die mit Windows 2000 und höheren Versionen verwendet werden, und I8042prt, dem Funktionstreiber für eine PS/2-Stil-Maus, die mit Windows 2000 und höher verwendet wird. Moufiltr veranschaulicht, wie E/A-Anforderungen gefiltert und Rückrufroutinen hinzugefügt werden, die den Vorgang von Mouclass und I8042prt ändern.

Weitere Informationen zum Moufiltr-Vorgang finden Sie in den folgenden Ressourcen:

E/A-Steuercodes für Moufiltr

Die folgenden IOCTLs werden von Moufiltr verwendet.

IOCTL_INTERNAL_I8042_HOOK_MOUSE

Die IOCTL_INTERNAL_I8042_HOOK_MOUSE Anforderung fügt der I8042prt Mouse ISR eine ISR-Rückrufroutine hinzu. Der ISR-Rückruf ist optional und wird von einem Mausfiltertreiber der oberen Ebene bereitgestellt.

I8042prt sendet diese Anforderung, nachdem sie eine IOCTL_INTERNAL_MOUSE_CONNECT Anforderung erhalten hat. I8042prt sendet eine synchrone IOCTL_INTERNAL_I8042_HOOK_MOUSE Anforderung an den oberen Rand des Mausgerätestapels.

Nachdem Moufiltr die Hook-Mausanforderung empfängt, filtert sie die Anforderung wie folgt:

  • Speichert die informationen der oberen Ebene, die an Moufiltr übergeben werden, einschließlich des Kontexts eines Geräteobjekts der oberen Ebene und eines Zeigers auf einen ISR-Rückruf.
  • Ersetzt die Informationen auf oberster Ebene durch eigene Informationen.
  • Speichert den Kontext von I8042prt und Zeigern in Rückrufen, die die Moufiltr ISR-Rückrufe verwenden können.

IOCTL_INTERNAL_MOUSE_CONNECT

Die IOCTL_INTERNAL_MOUSE_CONNECT Anforderung verbindet Mouclass-Dienst mit einem Mausgerät.

IOCTL_INTERNAL_MOUSE_DISCONNECT

Moufiltr schließt die IOCTL_INTERNAL_MOUSE_DISCONNECT Anforderung mit einem Fehlerstatus von STATUS_NOT_IMPLEMENTED ab.

Für alle anderen Anforderungen überspringt Moufiltr den aktuellen IRP-Stapel und sendet die Anforderung ohne weitere Verarbeitung an den Gerätestapel.

Moufiltr Callback-Routinen

MouFiltr implementiert die folgenden Rückrufroutinen.

MouFilter_IsrHook

Siehe 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
);

Ein MouFilter_IsrHook Rückruf ist nicht erforderlich, wenn der Standardvorgang von I8042prt ausreicht.

Die I8042prt Mouse ISR ruft MouFilter_IsrHook auf, nachdem der Interrupt überprüft wurde.

Um eine Maus zurückzusetzen, durchläuft I8042prt eine Sequenz von operativen Unterstates. Ein MOUSE_RESET_SUBSTATE Enumerationswert identifiziert jeden Unterstatus. Weitere Informationen dazu, wie I8042prt eine Maus zurücksetzt und die entsprechenden Unterstates zum Zurücksetzen der Maus, finden Sie in der Dokumentation von MOUSE_RESET_SUBSTATE in ntdd8042.h.

MouFilter_IsrHook wird im Kernelmodus am IRQL des I8042prt Mouse ISR ausgeführt.

MouFilter_ServiceCallback

Siehe 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
);

Der ISR-DPC von I8042prt ruft MouFilter_ServiceCallback auf, was dann MouseClassServiceCallback aufruft. Ein Filterdienstrückruf kann so konfiguriert werden, dass die Eingabedaten geändert werden, die vom Eingabepuffer des Geräts in die Klassendatenwarteschlange übertragen werden. Beispielsweise kann der Rückruf Daten löschen, transformieren oder einfügen.