Freigeben über


Konfiguration von Tastatur- und Mausklassentreibern

Hinweis

Dieser Artikel richtet sich an Entwickler, die Tastatur- und Mausklassentreiber konfigurieren. Wenn Sie eine Maus oder Tastatur reparieren möchten, lesen Sie:

Nicht-HID-Tastaturen und Mäuse können sich über mehrere ältere Busse verbinden, aber weiterhin den gleichen Klassentreiber verwenden. Dieser Abschnitt enthält Details zu den Klassentreibern selbst. In den folgenden Abschnitten werden details zu den Controllern beschrieben.

In diesem Artikel wird die typische physische Konfiguration von Tastatur- und Mausgeräten in Microsoft Windows 2000 und höher beschrieben.

Die folgenden Abbildungen zeigen zwei gängige Konfigurationen, die eine einzelne Tastatur und eine einzelne Maus verwenden.

Diagramm mit zwei Konfigurationen, die eine einzelne Tastatur und eine einzelne Maus verwenden.

Die Abbildung zeigt eine Tastatur und eine Maus, die über unabhängige Controller mit einem Systembus verbunden ist. Eine typische Konfiguration besteht aus einer POWERSHELL/2-Tastatur, die über einen i8042-Controller betrieben wird, und einer seriellen Maus, die über einen seriellen Anschlusscontroller betrieben wird.

Die folgenden zusätzlichen Informationen sind für Tastatur- und Maushersteller wichtig:

  • Das Betriebssystem öffnet Tastaturen aus Sicherheitsgründen im exklusiven Modus.
  • Windows unterstützt die gleichzeitige Verbindung mehrerer Tastatur- und Mausgeräte.
  • Windows unterstützt keinen unabhängigen Zugriff durch einen Client auf jedes Gerät.

Klassentreiberfeatures

In diesem Artikel werden die Features der folgenden Systemklassentreiber von Microsoft Windows 2000 und höher beschrieben:

  • Kbdclass, der Klassentreiber für Geräte GUID_CLASS_KEYBOARD Geräteklasse

  • Mouclass, der Klassentreiber für Geräte der GUID_CLASS_MOUSE Geräteklasse

Kbdclass implementiert den Kbdclass-Dienst, und das ausführbare Image wird kbdclass.sys.

Mouclass implementiert den Mouclass-Dienst und das ausführbare Image ist mouclass.sys.

Kbdclass und Mouclass für jedes Feature:

  • Allgemeiner und hardwareunabhängiger Betrieb der Geräteklasse.

  • Plug & Play, Energieverwaltung und Windows-Verwaltungsinstrumentation (Windows Management Instrumentation, WMI).

  • Betrieb von älteren Geräten.

  • Gleichzeitiger Betrieb von mehr als einem Gerät.

  • Verbindung einer Klassendienstrückrufroutine , die ein Funktionstreiber verwendet, um Daten aus dem Eingabedatenpuffer des Geräts in den Datenpuffer des Klassentreibers zu übertragen.

Konfiguration von Geräteobjekten

Die folgende Abbildung zeigt die Konfiguration von Geräteobjekten für ein Plug & Play PS/2-Tastatur- und Mausgerät. Jeder Klassentreiber erstellt ein Klassenfilterobjekt auf oberster Ebene (Filter DO), das einem Funktionsgeräteobjekt (FDO) über einen optionalen Gerätefilter auf oberster Ebene zugeordnet ist. Ein Gerätefiltertreiber der oberen Ebene erstellt die Do-Funktion des Gerätefilters auf oberster Ebene. I8042prt erstellt die Funktion DO und fügt sie an ein physisches Geräteobjekt (PDO) an, das vom Stammbustreiber erstellt wurde.

Diagramm zur Veranschaulichung der Konfiguration von Geräteobjekten für ein Plug-and-Play ps/2-Stil-Tastatur- und Mausgerät.

PS/2-Tastatur

Der Tastaturtreiberstapel besteht aus den folgenden Komponenten:

  • Kbdclass, der Tastaturklassenfiltertreiber der oberen Ebene
  • Mindestens ein optionaler Tastaturfiltertreiber auf oberster Ebene
  • I8042prt, der Funktionstreiber

PS/2 Maus

Der Maustreiberstapel besteht aus den folgenden Komponenten:

  • Mouclass, der Mausklassenfiltertreiber der oberen Ebene
  • Mindestens ein optionaler Mausfiltertreiber auf oberer Ebene
  • I8042prt, der Funktionstreiber

Kbdclass und Mouclass können mehrere Geräte in zwei verschiedenen Modi unterstützen. Im 1:1-Modus verfügt jedes Gerät über einen unabhängigen Gerätestapel. Der Klassentreiber erstellt und fügt eine unabhängige Klassen-DO an jeden Gerätestapel an. Jeder Gerätestapel verfügt über einen eigenen Steuerzustand und einen eigenen Eingabepuffer. Das Microsoft Win32-Subsystem greift über ein eindeutiges Dateiobjekt auf Eingaben von jedem Gerät zu.

Im Großmeistermodus betreibt der Klassentreiber alle Geräte wie folgt:

  • Der Klassentreiber erstellt sowohl eine Großmeisterklasse DO , die alle Geräte darstellt, als auch eine untergeordnete Klasse DO für jedes Gerät.

    Der Klassentreiber fügt eine untergeordnete Klasse DO an jeden Gerätestapel an. Unterhalb der untergeordneten Klasse DO entspricht der Gerätestapel dem stapel, der im 1:1-Modus erstellt wurde.

  • Die Großmasterklasse DO steuert den Vorgang aller untergeordneten DOs.

  • Das Win32-Subsystem greift über das Dateiobjekt, das das Grandmaster-Klassengerät darstellt, auf alle Geräteeingaben zu.

  • Alle Geräteeingaben werden in der Datenwarteschlange des Großmasters gepuffert.

  • Der Großmeister verwaltet einen einzelnen globalen Gerätestatus.

Kbdclass und Mouclass werden im 1:1-Modus ausgeführt, wenn der Registrierungseintragswert ConnectMultiplePorts auf 0x00 festgelegt ist (unter dem Schlüssel HKLM\Services\CurrentControlSet\class service>\<Parameters, wobei klassendienst kbdclass oder Mouclass ist). Andernfalls funktionieren Kbdclass und Mouclass im Großmeistermodus.

Öffnen und Schließen über den Klassentreiber

Das Microsoft Win32-Subsystem öffnet alle Tastatur- und Mausgeräte zur exklusiven Verwendung. Für jede Geräteklasse behandelt das Win32-Subsystem Eingaben von allen Geräten, als ob die Eingabe von einem einzelnen Eingabegerät stammt. Eine Anwendung kann nicht anfordern, dass nur ein bestimmtes Gerät Eingaben empfängt.

Das Win32-Subsystem öffnet dynamisch Plug & Play Eingabegeräte, nachdem sie Benachrichtigungen vom Plug & Play-Manager erhalten hat, dass eine GUID_CLASS_KEYBOARD- oder GUID_CLASS_MOUSE Geräteschnittstelle aktiviert ist. Das Win32-Subsystem schließt Plug & Play Geräte, nachdem eine geöffnete Schnittstelle deaktiviert wurde. Das Win32-Subsystem öffnet auch ältere Geräte anhand des Namens (z. B. "\Device\KeyboardLegacyClass0"). Nachdem das Win32-Subsystem erfolgreich ein Legacygerät geöffnet hat, kann es nicht ermitteln, ob das Gerät später physisch entfernt wird.

Nachdem Kbdclass und Mouclass eine Erstellungsanforderung erhalten haben, gehen sie für Plug & Play- und Legacyvorgänge wie folgt vor:

  • Plug & Play Operation

    Wenn sich das Gerät im zustand "Plug & Play gestartet" befindet, sendet der Klassentreiber die IRP_MJ_CREATE Anforderung an den Treiberstapel. Andernfalls schließt der Klassentreiber die Anforderung ab, ohne die Anforderung an den Treiberstapel zu senden. Der Klassentreiber legt die vertrauenswürdige Datei mit Lesezugriff auf das Gerät fest. Wenn ein Großmastergerät vorhanden ist, sendet der Klassentreiber eine Erstellungsanforderung an alle Ports, die den untergeordneten Klassengeräten zugeordnet sind.

  • Legacyvorgang

    Der Klassentreiber sendet eine interne Gerätesteuerungsanforderung an den Porttreiber, um das Gerät zu aktivieren.

Verbinden eines Dienstrückrufs mit einem Gerät

Die Klassentreiber müssen ihren Klassendienst mit einem Gerät verbinden, bevor das Gerät geöffnet werden kann. Die Klassentreiber verbinden ihren Klassendienst, nachdem sie eine Klassen-DO an einen Gerätestapel angefügt haben. Der Funktionstreiber verwendet den Klassendienstrückruf, um Eingabedaten von einem Gerät in die Klassendatenwarteschlange für das Gerät zu übertragen. Die ISR-Verteilerroutine des Funktionstreibers für ein Gerät ruft den Klassendienstrückruf auf. Kbdclass stellt den Klassendienstrückruf KeyboardClassServiceCallback bereit, und Mouclass stellt den Klassendienstrückruf MouseClassServiceCallback bereit.

Ein Anbieter kann den Vorgang eines Klassendienstrückrufs ändern, indem er einen Filtertreiber auf oberster Ebene für ein Gerät installiert. Der Beispieltastaturfiltertreiber Kbfiltr definiert den KbFilter_ServiceCallback Rückruf, und der Beispiel-Mausfiltertreiber Moufiltr definiert den MouFilter_ServiceCallback Rückruf. Die Beispielfilterdienstrückrufe können so konfiguriert werden, dass die Eingabedaten geändert werden, die vom Porteingabepuffer für ein Gerät in die Klassendatenwarteschlange übertragen werden. Beispielsweise kann der Filterdienstrückruf Daten löschen, transformieren oder einfügen.

Die Klassen- und Filterdienstrückrufe sind wie folgt verbunden:

  • Der Klassentreiber sendet eine interne Geräteverbindungsanforderung an den Gerätestapel (IOCTL_INTERNAL_KEYBOARD_CONNECT oder IOCTL_INTERNAL_MOUSE_CONNECT). Die Klassenverbindungsdaten werden durch eine CONNECT_DATA Struktur angegeben, die einen Zeiger auf das Klassengerätobjekt und einen Zeiger auf den Klassendienstrückruf enthält.

  • Nachdem der Filtertreiber die Verbindungsanforderung empfangen hat, speichert er eine Kopie der Klassenverbindungsdaten und ersetzt die Verbindungsdaten der Anforderung durch Filterverbindungsdaten. Die Filterverbindungsdaten legen einen Zeiger auf das Filtergerätobjekt und einen Zeiger auf den Filtertreiberdienstrückruf fest. Der Filtertreiber sendet dann die gefilterte Verbindungsanforderung an den Funktionstreiber.

Die Klassen- und Filterdienstrückrufe werden wie folgt aufgerufen:

  • Der Funktionstreiber verwendet die Filterverbindungsdaten, um den anfänglichen Rückruf an den Filterdienstrückruf vorzunehmen.

  • Nach dem Filtern der Eingabedaten verwendet der Filterdienstrückruf die Klassenverbindungsdaten, die er gespeichert hat, um einen Rückruf an den Klassendienstrückruf vorzunehmen.

Abfragen und Festlegen eines Tastaturgeräts

I8042prt unterstützt die folgenden internen Gerätesteuerungsanforderungen zum Abfragen von Informationen zu einem Tastaturgerät und zum Festlegen von Parametern auf einem Tastaturgerät:

IOCTL_KEYBOARD_QUERY_ATTRIBUTES

IOCTL_KEYBOARD_QUERY_INDICATOR_TRANSLATION

IOCTL_KEYBOARD_QUERY_INDICATORS

IOCTL_KEYBOARD_QUERY_TYPEMATIC

IOCTL_KEYBOARD_SET_INDICATORS

IOCTL_KEYBOARD_SET_TYPEMATIC

Weitere Informationen zu allen Anforderungen an die Tastatursteuerung finden Sie in der Referenz zu Human Interface Devices.

Scancode-Mapper für Tastaturen

In Microsoft Windows-Betriebssystemen werden PS/2-kompatible Scancodes, die von einem Eingabegerät bereitgestellt werden, in virtuelle Schlüssel konvertiert, die über das System in Form von Windows-Nachrichten verteilt werden. Wenn ein Gerät einen falschen Scancode für einen bestimmten Schlüssel erzeugt, wird die falsche nachricht des virtuellen Schlüssels gesendet. Dieses Problem kann behoben werden, indem ein Filtertreiber geschrieben wird, der die von der Firmware generierten Scancodes analysiert und den falschen Scancode in einen vom System verstandenen ändert. Dies ist jedoch ein mühsamer Prozess und kann manchmal zu schwerwiegenden Problemen führen, wenn Fehler im Filtertreiber auf Kernelebene vorhanden sind.

Windows 2000 und Windows XP enthalten eine neue Scancodezuordnung, die eine Methode bereitstellt, die die Zuordnung von Scancodes ermöglicht. Die Scancodezuordnungen für Windows werden im folgenden Registrierungsschlüssel gespeichert:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layout

Hinweis

Es gibt auch eine Tastaturlayouttaste unter der Ctrl-Taste, diese Taste sollte jedoch nicht geändert werden.

In der Tastaturlayouttaste muss der Wert " Scancode Map " hinzugefügt werden. Dieser Wert ist vom Typ REG_BINARY (kleines Endian-Format) und weist das in der folgenden Tabelle angegebene Datenformat auf.

Startoffset (in Byte) Größe (in Bytes) Daten
0 4 Kopfzeile: Versionsinformationen
4 4 Kopfzeile: Kennzeichnungen
8 4 Kopfzeile: Anzahl der Zuordnungen
12 4 Individuelle Zuordnung
... ... ...
Letzte 4 Bytes 4 Null-Terminator (0x00000000)

Die Kopfzeileninformationen des ersten und zweiten DWORDS-Speichers sollten für die aktuelle Version des Scan Code Mapper auf alle Nullen festgelegt werden. Der dritte DWORD-Eintrag enthält eine Anzahl der folgenden Zuordnungen, einschließlich der Null-Endzuordnung. Die Mindestanzahl wäre daher 1 (keine Zuordnungen angegeben). Die einzelnen Zuordnungen folgen der Kopfzeile. Jede Zuordnung ist eine DWORD-Länge und ist in zwei WORD-Längenfelder unterteilt. Jedes WORD-Feld speichert den Scancode, damit ein Schlüssel zugeordnet werden kann.

Sobald die Zuordnung in der Registrierung gespeichert ist, muss das System neu gestartet werden, damit die Zuordnungen wirksam werden. Wenn die Zuordnung eines Scancodes auf einer Keypress erforderlich ist, wird der Schritt im Benutzermodus unmittelbar vor der Konvertierung des Scancodes in einen virtuellen Schlüssel ausgeführt. Durch diese Konvertierung im Benutzermodus können bestimmte Einschränkungen auftreten, z. B. die Zuordnung, die nicht ordnungsgemäß funktioniert, wenn sie unter Terminaldienste ausgeführt wird.

Um diese Zuordnungen zu entfernen, entfernen Sie den Registrierungswert "Scancode Map" und "Neustart".

Beispiel 1

Um die linke STRG-TASTE mit der FESTSTELLTASTE zu tauschen, verwenden Sie einen Registrierungs-Editor (vorzugsweise Regedt32.exe), um den Scancode Map-Schlüssel mit dem folgenden Wert zu ändern:

00000000 00000000 03000000 3A001D00 1D003A00 00000000

Die folgende Tabelle enthält diese Einträge, die in DWORD-Felder unterteilt sind, und die ausgetauschten Bytes.

Wert: Interpretation

0x00000000: Header: Version. Auf alle Nullen festgelegt.

0x00000000: Kopfzeile: Flags. Auf alle Nullen festgelegt.

0x00000003: Drei Einträge in der Karte (einschließlich NULL-Eintrag).

0x001D003A: LINKE STRG-TASTE -> FESTSTELLTASTE (0x1D --> 0x3A).

0x003A001D: FESTSTELLTASTE --> LINKE STRG-TASTE (0x3A --> 0x1D).

0x00000000: Null-Endator.

Beispiel 2

Es ist auch möglich, eine Taste hinzuzufügen, die nicht allgemein auf einer Tastatur verfügbar ist, oder eine nie verwendete Taste zu entfernen. Das folgende Beispiel zeigt den wert, der in Scancode Map gespeichert ist, um die rechte STRG-TASTE zu entfernen und die Funktionalität der rechten ALT-TASTE so zu ändern, dass sie als Stummschalttaste funktioniert:

00000000 00000000 03000000 00001DE0 20E038E0 00000000

Die folgende Tabelle enthält diese Einträge, die in DWORD-Felder unterteilt sind, und die ausgetauschten Bytes.

Wert: Interpretation

0x00000000: Header: Version. Auf alle Nullen festgelegt.

0x00000000: Kopfzeile: Flags. Auf alle Nullen festgelegt.

0x00000003: Drei Einträge in der Karte (einschließlich NULL-Eintrag).

0xE01D0000: Entfernen Sie die rechte STRG-TASTE (0xE01D --> 0x00).

0xE038E020: NACH-RECHTS-ALT-TASTE -> Stummschalttaste (0xE038 --> 0xE020).

0x00000000: Null-Endator.

Nachdem die erforderlichen Daten generiert wurden, kann sie auf verschiedene Weise in die Registrierung eingefügt werden.

  • Eine .reg Datei kann generiert werden, die mithilfe eines Registrierungs-Editors problemlos in die Systemregistrierung integriert werden kann.
  • Eine INF-Datei kann auch mit einem [AddReg]-Abschnitt erstellt werden, der die registrierungsinformationen enthält, die hinzugefügt werden sollen.
  • Regedt32.exe können verwendet werden, um die Informationen manuell zur Registrierung hinzuzufügen.

Der Scancode-Mapper hat mehrere Vor- und Nachteile.

Zu den Vorteilen gehören:

  • Der Mapper kann als einfache Behebung von Firmwarefehlern verwendet werden.
  • Häufig verwendete Tasten können der Tastatur hinzugefügt werden, indem sie die Karte in der Registrierung ändern. Nicht häufig verwendete Tasten (z. B. rechte STRG-TASTE) können null (entfernt) oder für andere Tasten ausgetauscht werden.
  • Wichtige Speicherorte können einfach geändert werden. Benutzer können den Standort häufig verwendeter Schlüssel ganz einfach anpassen.

Die folgenden Nachteile werden erkannt:

  • Sobald die Zuordnung in der Registrierung gespeichert ist, ist ein Systemneustart erforderlich, um sie zu aktivieren.
  • Die in der Registrierung gespeicherten Zuordnungen funktionieren auf Systemebene und gelten für alle Benutzer. Diese Zuordnungen können je nach aktuellem Benutzer nicht unterschiedlich funktionieren.
  • Die aktuelle Implementierung schränkt die Funktionalität der Karte so ein, dass Zuordnungen immer auf alle Tastaturen angewendet werden, die mit dem System verbunden sind. Es ist derzeit nicht möglich, eine Karte pro Tastatur zu erstellen.

Abfragen eines Mausgeräts

I8042prt unterstützt die folgende interne Gerätesteuerungsanforderung zum Abfragen von Informationen zu einem Mausgerät:

IOCTL_MOUSE_QUERY_ATTRIBUTES

Weitere Informationen zu allen Anforderungen an mausgerätesteuerung finden Sie unter Human Interface Devices Reference.

Registrierungseinstellungen, die dem Mausklassentreiber zugeordnet sind

Hier ist eine Liste der Registrierungsschlüssel, die dem Mausklassentreiber zugeordnet sind.

[Schlüssel: HKLM\SYSTEM\CurrentControlSet\Services\Mouclass\Parameters]

  • MaximumPortsServiced – Wird unter Windows XP und höher nicht verwendet. Nur für Windows NT4.
  • PointerDeviceBaseName – Gibt den Basisnamen für die Geräteobjekte an, die vom Mausklassengerätetreiber erstellt wurden.
  • ConnectMultiplePorts – Bestimmt, ob für jedes Klassengeräteobjekt ein oder mehrere Portgeräteobjekt vorhanden sind. Dieser Eintrag wird hauptsächlich von Gerätetreibern verwendet.
  • MouseDataQueueSize – Gibt die Anzahl der vom Maustreiber gepufferten Mausereignisse an. Es wird auch verwendet, um die Größe des internen Puffers des Maustreibers im nicht ausgelagerten Speicherpool zu berechnen.

Absolute Zeigegeräte

Für Geräte vom Typ GUID_CLASS_MOUSE, der Funktionstreiber eines Geräts:

  • Behandelt gerätespezifische Eingaben.

  • Erstellt die MOUSE_INPUT_DATA Strukturen, die von MouseClassServiceCallback benötigt werden.

  • Überträgt MOUSE_INPUT_DATA Strukturen in die Mouclass-Datenwarteschlange, indem MouseClassServiceCallback in seiner ISR-Verteilerroutine aufgerufen wird.

Für ein absolutes Zeigegerät muss der Funktionstreiber des Geräts die Elemente "LastX", "LastY" und "Flags " der MOUSE_INPUT_DATA Strukturen wie folgt festlegen:

  • Zusätzlich zum Dividieren des Geräteeingabewerts durch die maximale Funktion des Geräts skaliert der Treiber den Geräteeingabewert um 0xFFFF:

    LastX = ((device input x value) * 0xFFFF ) / (Maximum x capability of the device)
    LastY = ((device input y value) * 0xFFFF ) / (Maximum y capability of the device)
    
  • Der Treiber legt das MOUSE_MOVE_ABSOLUTE Flag in Flags fest.

  • Wenn die Eingabe von Window Manager einem gesamten virtuellen Desktop zugeordnet werden soll, legt der Treiber das MOUSE_VIRTUAL_DESKTOP Flag in Flags fest. Wenn das MOUSE_VIRTUAL_DESKTOP Flag nicht festgelegt ist, ordnet der Fenster-Manager die Eingabe nur dem primären Monitor zu.

In der folgenden Liste wird angegeben, wie diese speziellen Anforderungen für ein absolutes Zeigegerät nach Gerätetyp implementiert werden:

  • HID-Geräte:

    Mouhid, der Windows-Funktionstreiber für HID-Mausgeräte, implementiert diese speziellen Anforderungen automatisch.

  • PS/2-Geräte:

    Ein Filtertreiber auf oberster Ebene ist erforderlich. Der Filtertreiber liefert einen IsrHook-Rückruf und einen Klassendienstrückruf. I8042prt ruft den IsrHook auf, um rohe Geräteeingaben zu verarbeiten, und ruft den Filterklassendienstrückruf auf, um die Eingabe zu filtern. Der Rückruf des Filterklassendiensts ruft wiederum MouseClassServiceCallback auf. Die Kombination aus dem IsrHook-Rückruf und dem Klassendienstrückruf verarbeitet gerätespezifische Eingaben, erstellt die erforderlichen MOUSE_INPUT_DATA Strukturen, skaliert die Geräteeingabedaten und legt das MOUSE_MOVE_ABSOLUTE Flag fest.

  • Plug & Play COM-Portgeräte, aufgezählt von Serenum:

    Ein Plug & Play Funktionstreiber ist erforderlich. Der Funktionstreiber erstellt die erforderlichen MOUSE_INPUT_DATA Strukturen, skaliert die Geräteeingabedaten und legt das MOUSE_MOVE_ABSOLUTE Flag fest, bevor MouseClassServiceCallback aufgerufen wird.

  • Nicht Plug & Play COM-Portgeräte:

    Ein gerätespezifischer Funktionstreiber ist erforderlich. Der Funktionstreiber erstellt die erforderlichen MOUSE_INPUT_DATA Strukturen, skaliert die Geräteeingabedaten und legt das MOUSE_MOVE_ABSOLUTE Flag fest, bevor MouseClassServiceCallback aufgerufen wird.

  • Gerät auf einem nicht unterstützten Bus:

    Ein gerätespezifischer Funktionstreiber ist erforderlich. Der Funktionstreiber erstellt die erforderlichen MOUSE_INPUT_DATA Strukturen, skaliert die Geräteeingabedaten und legt das MOUSE_MOVE_ABSOLUTE Flag fest, bevor MouseClassServiceCallback aufgerufen wird.