Minidriver und der HID-Klassentreiber
In diesem Artikel werden Minidriver und der HID-Klassentreiber beschrieben.
Weitere Informationen finden Sie unter Erstellen von WDF HID-Minidrivern.
Betriebsfunktionen des HID-Klassentreibers
Der HID-Klassentreiber führt die folgenden Vorgänge aus:
Stellt die Schnittstelle der oberen Ebene bereit, die Kernelmodustreiber und Benutzermodusanwendungen für den Zugriff auf die HID-Sammlungen verwenden, die von einem Eingabegerät unterstützt werden.
Der HID-Klassentreiber verwaltet und leitet die gesamte Kommunikation zwischen Treibern der oberen Ebene und Anwendungen und den zugrunde liegenden Eingabegeräten, die HID-Sammlungen unterstützen, transparent weiter. Es verwaltet die verschiedenen Datenprotokolle, die von verschiedenen Eingabegeräten und Eingabewarteschlangen verwendet werden, die mehr als eine geöffnete Datei in derselben HID-Sammlung unterstützen.
Die Oberebenenschnittstelle für HID-Sammlungen besteht aus den HID-Klassentreiber-IOCTLs, den HIDClass-Unterstützungsroutinen und den HIDClass-Strukturen.
Kommuniziert mit einem HID-Minidriver, indem die Standardtreiberroutinen des Minidrivers aufgerufen werden.
Erstellt ein funktionales Geräteobjekt (Functional Device Object, FDO) für HIDClass-Eingabegeräte, die von einem Bus- oder Porttreiber auf niedrigerer Ebene aufgelistet werden.
Der HID-Klassentreiber erstellt und verwaltet beispielsweise die Vorgänge eines FDO, das ein USB HID-Gerät darstellt, das vom systemseitig bereitgestellten USB-Treiberstapel aufgezählt wird.
Stellt die Funktionalität eines Bustreibers für die untergeordneten Geräte (HID-Sammlungen) bereit, die von einem zugrunde liegenden Eingabegerät unterstützt werden.
Der HID-Klassentreiber erstellt ein physisches Geräteobjekt (PDO) für jede HID-Auflistung, die von einem Eingabegerät unterstützt wird, und verwaltet den Vorgang der Sammlung.
Binden eines Minidrivers an HIDClass
Ein HID-Minidriver bindet seinen Vorgang an den HID-Klassentreiber, indem er HidRegisterMinidriver aufruft, um sich beim HID-Klassentreiber zu registrieren. Der Registrierungsvorgang:
Speichert eine Kopie der Einstiegspunkte (Zeiger) auf die Standardtreiberroutinen des HID-Minidrivers in der Geräteerweiterung des HID-Klassentreibers.
Ein HID-Minidriver legt seine Einstiegspunkte im Treiberobjekt fest, das der Minidriver als Eingabe für seine DRIVER_INITIALIZE Routine empfängt. Der HID-Minidriver legt diese Einstiegspunkte fest, bevor er sich beim HID-Klassentreiber registriert.
Setzt die Einstiegspunkte im Treiberobjekt des Minitreibers auf die Einstiegspunkte für die vom HID-Klassentreibertreiber bereitgestellten Standardtreiberroutinen zurück.
Der HID-Klassentreiber stellt die folgenden Standardtreiberroutinen bereit:
DRIVER_ADD_DEVICE und DRIVER_UNLOAD Routinen
Dispatchroutinen für die folgenden E/A-Anforderungen:
Der Registrierungsprozess weist auch Arbeitsspeicher für die HID mind River-Geräteerweiterung zu. Obwohl der Arbeitsspeicher vom HID-Klassentreiber zugewiesen wird, verwendet nur der HID-Minidriver diese Geräteerweiterung.
Kommunikation mit einem HID-Minidriver
Der HID-Klassentreiber kommuniziert mit einem HID-Minidriver, indem er die DRIVER_ADD_DEVICE-, DRIVER_UNLOAD- und Dispatchroutinen des HID-Minidrivers wie folgt aufruft:
Aufrufen der AddDevice-Routine
Wenn die AddDevice-Routine des HID-Klassentreibers aufgerufen wird, um ein funktionales Geräteobjekt (Functional Device Object, FDO) zu erstellen, erstellt der HID-Klassentreiber die FDO, initialisiert sie und ruft die HID-Minidriver-AddDevice-Routine auf. Die HID-Minidriver-AddDevice-Routine führt eine interne gerätespezifische Initialisierung durch und gibt bei erfolgreicher Ausführung STATUS_SUCCESS zurück. Wenn die HID-Minidriver-AddDevice-Routine nicht erfolgreich ist, löscht der HID-Klassentreiber die FDO und gibt die von der HID-Minidriver-AddDevice-Routine zurückgegebene status zurück.
Aufrufen der Entladen-Routine
Wenn die HID-Klassentreiber-Unload-Routine aufgerufen wird, schließt der HID-Klassentreiber die Freigabe aller ressourcen ab, die FDO zugeordnet sind, und ruft die Entladeroutine des HID-Minitreibers auf.
Aufrufen der Dispatchroutinen
Um ein Gerät zu betreiben, ruft der HID-Klassentreiber in erster Linie die HID-Minidriver-Dispatchroutine für interne Gerätesteuerungsanforderungen auf.
Wenn der E/A-Manager Anforderungen an den HID-Klassentreiber sendet, verarbeitet der HID-Klassentreiber die Anforderung und ruft die entsprechende Dispatchroutine des HID-Minidrivers auf.
Der HID-Klassentreiber sendet die folgenden Anforderungen nicht an das HID-Minidriver: create, close oder device control.
Betrieb eines HID-Minidrivers
Ein HID-Transportminidriver abstrahiert den Betrieb eines Hardwarebusses oder -ports, an den Ihr Eingabegerät angeschlossen ist.
HID-Minidriver können mit einem der folgenden Frameworks erstellt werden:
- UMDF – Benutzermodustreiberframework
- KDMF – Kernelmodustreiberframework
- WDF – Windows-Treiberframework
- WDM – Windows-Treibermodell (Legacy)
Microsoft empfiehlt die Verwendung einer Frameworks-basierten Lösung (KMDF oder UMDF). Weitere Informationen zu den einzelnen Treibermodellen finden Sie in den folgenden Abschnitten:
- KMDF-basierte HID-Minidriver, siehe Erstellen frameworkbasierter HID-Minidriver
- UMDF-basierte HID-Minidriver, siehe Erstellen von WDF HID-Minidrivern
Im folgenden Abschnitt wird die Registrierung eines WDM-basierten HID-Minidrivers beschrieben, aber ein Großteil davon ist auch für einen KMDF-basierten Frameworks-Treiber relevant. Alle HID-Minitreiber müssen sich beim HID-Klassentreiber registrieren, und der HID-Klassentreiber kommuniziert mit dem Minidriver, indem er die Standardtreiberroutinen des Minitreibers aufruft.
Weitere Informationen zur Funktionalität, die ein HID-Minidriver in seinen Standardtreiberroutinen unterstützen muss, finden Sie in den folgenden Abschnitten:
- Registrieren eines HID-Minidrivers
- HID Minidriver-Erweiterung
- Verwenden der HID_DEVICE_EXTENSION-Struktur
- Standard-Minidriver-Routinen
Weitere Informationen zum HID-Klassentreiber finden Sie unter Betrieb des HID-Minidrivers.
Registrieren eines HID-Minidrivers
Nachdem ein HID-Minidriver alle anderen Treiberinitialisierung in seiner DRIVER_INITIALIZE Routine abgeschlossen hat, bindet der HID-Minidriver seinen Vorgang an den HID-Klassentreiber, indem er HidRegisterMinidriver aufruft.
Wenn der HID-Minidriver beim HID-Klassentreiber registriert wird, verwendet er eine HID_MINIDRIVER_REGISTRATION-Struktur . Die Struktur gibt Folgendes an:
- Die HID-Revision
- Das HID-Minitreiberobjekt
- Die Größe einer HID Minidriver-Geräteerweiterung
- Ob Geräte abgefragt werden
HID Minidriver-Erweiterung
Eine HID-Minidriver-Geräteerweiterung ist gerätespezifisch und wird nur von einem HID-Minidriver verwendet. Der HID-Klassentreiber weist den Arbeitsspeicher für die Minidriver-Geräteerweiterung zu, wenn der Klassentreiber seine Geräteerweiterung für ein funktionales Geräteobjekt (FDO) erstellt. Der HID-Minidriver gibt die Größe seiner Geräteerweiterung an, wenn er den Minidriver beim HID-Klassentreiber registriert. Die Größe wird vom DeviceExtensionSize-Member einer HID_MINIDRIVER_REGISTRATION-Struktur angegeben.
Verwenden der HID_DEVICE_EXTENSION-Struktur
Ein HID-Minidriver muss eine HID_DEVICE_EXTENSION-Struktur als Layout für die Geräteerweiterung verwenden, die vom HID-Klassentreiber für ein funktionales Geräteobjekt (Functional Device Object, FDO) erstellt wurde. Der HID-Klassentreiber legt die Member dieser Struktur fest, wenn er die FDO initialisiert. Ein HID-Minitreiber darf die Informationen in dieser Struktur nicht ändern.
Eine HID_DEVICE_EXTENSION-Struktur enthält die folgenden Elemente:
PhysicalDeviceObject ist ein Zeiger auf das physische Geräteobjekt (PDO), das das zugrunde liegende Eingabegerät darstellt.
NextDeviceObject ist ein Zeiger auf den oberen Rand des Gerätestapels unter der FDO.
MiniDeviceExtension ist ein Zeiger auf die HID-Minidriver-Geräteerweiterung.
Bei einem Zeiger auf die FDO eines Eingabegeräts gibt das folgende GET_MINIDRIVER_DEVICE_EXTENSION Makro einen Zeiger auf eine HID-Minidriver-Erweiterung zurück:
#define GET_MINIDRIVER_DEVICE_EXTENSION(DO) ((PDEVICE_EXTENSION) (((PHID_DEVICE_EXTENSION)(DO)->DeviceExtension)->MiniDeviceExtension))
PDEVICE_EXTENSION ist ein Zeiger auf eine gerätespezifische Geräteerweiterung, die von einem HID-Minidriver deklariert wird.
Auf ähnliche Weise kann ein HID-Minidriver einen Zeiger auf die PDO des Eingabegeräts und den oberen Rand des Gerätestapels unter dem FDO des Eingabegeräts abrufen.
Wenn ein HID-Minidriver einen IRP im Gerätestapel sendet, sollte nextDeviceObject als Zielgerätobjekt verwendet werden.
Standard-Minidriver-Routinen
Ein HID-Minidriver muss die folgenden Standardtreiberunterstützungsroutinen bereitstellen:
- HID Minidriver DriverEntry Routine
- HID minidriver AddDevice Routine
- HID Minidriver-Entladeroutine
Ein HID-Minidriver muss auch die In dispatch routines beschriebenen Versandroutinen unterstützen, die von einem HID-Minidriver bereitgestellt werden.
DriverEntry-Routine
Die DRIVER_INITIALIZE Routine in einem HID-Minidriver führt folgendes aus:
Erstellt ein Treiberobjekt für das verknüpfte Treiberpaar (HID-Klassentreiber und HID-Minitreiber).
Legt die erforderlichen Treibereinstiegspunkte im HID-Minitreiberobjekt fest.
Ruft HidRegisterMinidriver auf, um den HID-Minitreiber beim HID-Klassentreiber zu registrieren.
Führt gerätespezifische Konfigurationen aus, die nur vom HID-Minitreiber verwendet werden.
AddDevice-Routine
Der HID-Klassentreiber übernimmt das Erstellen und Initialisieren des funktionalen Geräteobjekts (Functional Device Object, FDO) für ein zugrunde liegendes Eingabegerät. Der HID-Klassentreiber betreibt die FDO auch aus der Perspektive der Schnittstelle der oberen Ebene zum zugrunde liegenden Gerät und seinen untergeordneten Geräten (HID-Sammlungen).
Der HID-Klassentreiber DRIVER_ADD_DEVICE Routine ruft die HID-Minidriver-AddDevice-Routine auf, damit der Minitreiber eine interne gerätespezifische Initialisierung durchführen kann.
Die Parameter, die an den HID-Minitreiber DRIVER_ADD_DEVICE Routine übergeben werden, sind das Minitreiberobjekt und die FDO. Der HID-Klassentreiber übergibt die FDO an die AddDevice-Routine des Minitreibers und nicht an das physische Geräteobjekt für das zugrunde liegende Eingabegerät.
Der HID-Minitreiber DRIVER_ADD_DEVICE Routine ruft einen Zeiger auf die Minidriver-Geräteerweiterung von der FDO ab.
In der Regel führt die HID-Minitreiberroutine DRIVER_ADD_DEVICE die folgenden Aktionen aus:
Initialisiert die Minidriver-Geräteerweiterung. Die Geräteerweiterung wird nur vom Minidriver verwendet.
Gibt STATUS_SUCCESS zurück. Wenn der Minitreiber einen Fehler status zurückgibt, löscht der HID-Klassentreiber die FDO und gibt den Fehler status an den Plug & Play-Manager zurück.
Entladeroutine
Die Entladeroutine des HID-Klassentreibers ruft den HID-Minitreiber DRIVER_UNLOAD Routine auf. Ein HID-Minitreiber gibt alle vom Minitreiber zugeordneten internen Ressourcen frei.
Dispatchroutinen
Ein HID-Minitreiber muss die folgenden Dispatchroutinen bereitstellen: Erstellen, Schließen, interne Gerätesteuerung, Systemsteuerung, Plug & Play und Energieverwaltung. Mit Ausnahme interner Gerätesteuerungsanforderungen bieten die meisten dieser Dispatchroutinen eine minimale Funktion. Wenn der HID-Klassentreiber diese Dispatchroutinen aufruft, übergibt er das Minitreiberobjekt und das Funktionale Geräteobjekt (FDO).
IRP_MJ_CREATE
In Übereinstimmung mit den WDM-Anforderungen stellen der HID-Klassentreiber und ein HID-Minitreiber eine Dispatchroutine für Erstellungsanforderungen bereit. Die FDO kann jedoch nicht geöffnet werden. Der HID-Klassentreiber gibt STATUS_UNSUCCESSFUL zurück.
Ein HID-Minitreiber muss nur einen Stub bereitstellen. Die Create Dispatch-Routine wird nie aufgerufen.
IRP_MJ_CLOSE
In Übereinstimmung mit den WDM-Anforderungen müssen der HID-Klassentreiber und ein HID-Minitreiber eine Dispatchroutine für Close-Anforderungen bereitstellen. Die FDO kann jedoch nicht geöffnet werden. Der HID-Klassentreiber gibt STATUS_INVALID_PARAMETER_1 zurück.
Ein HID-Minitreiber muss nur einen Stub bereitstellen. Die Close Dispatch-Routine wird nie aufgerufen.
IRP_MJ_DEVICE_CONTROL
Ein HID-Minitreiber benötigt keine Dispatchroutine für Gerätesteuerungsanforderungen. Der HID-Klassentreiber übergibt keine Gerätesteuerungsanforderungen an einen Minitreiber.
IRP_MJ_INTERNAL_DEVICE_CONTROL
Ein HID-Minidriver muss eine Dispatchroutine für interne Gerätesteuerungsanforderungen bereitstellen, die die unter HID-Minitreiber-IOCTLs beschriebenen Anforderungen unterstützt.
Der HID-Klassentreiber verwendet in erster Linie interne Gerätesteuerungsanforderungen, um auf das zugrunde liegende Eingabegerät zuzugreifen.
Der HID-Minitreiber verarbeitet diese Anforderungen gerätespezifisch.
IRP_MJ_SYSTEM_CONTROL
Ein HID-Minitreiber muss eine Dispatchroutine für Systemsteuerungsanforderungen bereitstellen. Ein HID-Minitreiber ist jedoch nur erforderlich, um Systemsteuerungsanforderungen auf dem Gerätestapel wie folgt weiterzureichen:
Überspringen des aktuellen IRP-Stapelspeicherorts
Senden der Anforderung auf den Gerätestapel der FDO
IRP_MJ_PNP
Ein HID-Minitreiber muss eine Dispatchroutine für Plug & Play Anforderungen bereitstellen.
Der HID-Klassentreiber führt alle Plug & Play Verarbeitung aus, die der FDO zugeordnet sind. Wenn der HID-Klassentreiber eine Plug & Play-Anforderung verarbeitet, ruft er die Plug & Play Dispatchroutine des HID-Minitreibers auf.
Ein HID-Minitreiber Plug & Play Dispatchroutine:
Behandelt das Senden der Anforderung im Gerätestapel der FDO und das Abschließen der Anforderung auf die Art der Sicherung des Gerätestapels, je nach Anforderungstyp.
Führt eine gerätespezifische Verarbeitung durch, die bestimmten Anforderungen zugeordnet ist, um Informationen zum Status der FDO zu aktualisieren.
Beispielsweise kann der Minidriver den Plug & Play Status der FDO aktualisieren (insbesondere, ob die FDO gestartet, beendet oder gerade entfernt wird).
IRP_MJ_POWER
Der HID-Minitreiber muss eine Dispatchroutine für Energieanforderungen bereitstellen. Der HID-Klassentreiber übernimmt jedoch die Energieverarbeitung für die FDO.
In Übereinstimmung mit den WDM-Anforderungen sendet ein HID-Minitreiber Stromanforderungen auf die folgende Weise im Gerätestapel der FDO:
Überspringt den aktuellen IRP-Stapelspeicherort.
Startet die nächste Energie-IRP
Sendet den Energie-IRP auf den Gerätestapel der FDO.
In der Regel übergibt der HID-Minitreiber Stromanforderungen im Gerätestapel ohne zusätzliche Verarbeitung.