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.
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:
Treiberentwickler dürfen in Form eines Filtertreibers oder eines neuen HID-Clienttreibers weitere Treiber hinzufügen.
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.
- Filtertreiber sind in diesen Szenarien zulässig:
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
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.
Treiberentwickler sollten Treiberframeworks (KMDF oder UMDF) verwenden und sich nicht auf WDM für ihre Filtertreiber verlassen.
Treiberentwickler sollten die Anzahl der Kernelbenutzerübergänge zwischen ihrem Dienst und dem Treiberstapel verringern.
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.
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.
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:
Der Beispielquellcode für Moufiltr .
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.