Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
In diesem Artikel werden Minidriver und der HID-Klassentreiber beschrieben.
Weitere Informationen finden Sie unter Erstellen von WDF HID-Minidrivern.
Betriebsmerkmale des HID-Klasse-Treibers
Der HID-Klassentreiber führt die folgenden Vorgänge aus:
Stellt die hochrangige Schnittstelle bereit, die Kernelmodustreiber und Benutzermodusanwendungen verwenden, um auf die HID-Auflistungen zuzugreifen, die ein Eingabegerät unterstützt.
Der HID-Klassentreiber verwaltet und leitet die gesamte Kommunikation zwischen übergeordneten Treibern 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-Auflistung unterstützen.
Die obere Schnittstelle zu HID-Auflistungen besteht aus den HIDClass 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 (FDO) für HIDClass-Eingabegeräte, die von einem Bus- oder Porttreiber auf niedrigerer Ebene aufgezählt werden.
Der HID-Klassentreiber erstellt und verwaltet beispielsweise die Vorgänge eines FDO, das ein VOM System bereitgestelltes USB-HID-Gerät darstellt, das vom vom System bereitgestellten USB-Treiberstapel aufgezählt wird.
Stellt die Funktionalität eines Bustreibers für die untergeordneten Geräte (HID-Collections) 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 HidRegisterMinidriver aufgerufen wird, um sich beim HID-Klassentreiber zu registrieren. Der Registrierungsvorgang:
Speichert eine Kopie der Einstiegspunkte (Zeiger) in den 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 beim HID-Klassentreiber registriert wird.
Setzt die Einstiegspunkte im Treiberobjekt des Minidrivers auf die Einstiegspunkte für die Standardtreiberroutinen zurück, die vom HID-Klassentreiber bereitgestellt werden.
Der HID-Klassentreiber liefert die folgenden Standardtreiberroutinen:
DRIVER_ADD_DEVICE und DRIVER_UNLOAD Routinen
Verteilerroutinen für die folgenden E/A-Anforderungen:
Der Registrierungsprozess weist außerdem Speicher für die HID Mind River Geräteerweiterung zu. Obwohl der Speicher 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 Dispatch-Routinen des HID-Minidrivers wie folgt aufruft:
Aufrufen der AddDevice-Routine
Wenn die AddDevice-Routine des HID-Klassentreibers aufgerufen wird, um ein funktionales Geräteobjekt (FDO) zu erstellen, erstellt der HID-Klassentreiber den FDO, initialisiert ihn und ruft die HID-Minidriver-AddDevice-Routine auf. Die HID-Minidriver-AddDevice-Routine führt 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 den FDO und gibt den Status zurück, der von der HID-Minidriver-AddDevice-Routine zurückgegeben wird.
Aufrufen der Unload-Routine
Wenn die Unload-Routine des HID-Klassentreibers aufgerufen wird, schließt der HID-Klassentreiber das Freigeben aller Ressourcen ab, die dem FDO zugeordnet sind, und ruft die Unload-Routine des HID-Minidrivers auf.
Aufrufen der Dispatch-Routinen
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 Anfragen nicht an den HID-Minidriver: Erstellung, Schließen oder Gerätesteuerung.
Betrieb eines HID-Minidrivers
Ein HID-Transport-Minidriver abstrahiert den Betrieb eines Hardware-Bus 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 Driver Framework
- WDM – Windows-Treibermodell (veraltet)
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-Minitreiber, siehe Erstellen von Framework-basierten HID-Minitreibern
- UMDF-basierte HID-Minitreiber, siehe Erstellen von WDF-HID-Minitreibern
Im folgenden Abschnitt wird die Registrierung eines WDM-basierten HID-Minidrivers behandelt, aber ein Großteil davon ist auch für einen KMDF-basierten Frameworks-Treiber relevant. Alle HID-Minidriver müssen sich beim HID-Klassentreiber registrieren, und der HID-Klassentreiber kommuniziert mit dem Minidriver, indem die Standardtreiberroutinen des Minidrivers aufgerufen werden.
Weitere Informationen zu den Funktionen, die ein HID Minidriver in seinen Standardtreiberroutinen unterstützen muss, finden Sie in den folgenden Abschnitten:
- HID-Minitreiber registrieren
- HID Minidriver-Erweiterung
- Verwenden der HID_DEVICE_EXTENSION-Struktur
- Standard-Minidriver-Routinen
Weitere Informationen zum HID-Klassentreiber finden Sie unter 'Funktionsweise des HID-Minitreibers'.
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 durch Aufrufen von HidRegisterMinidriver.
Wenn sich der HID-Minidriver beim HID-Klassentreiber registriert, wird eine HID_MINIDRIVER_REGISTRATION Struktur verwendet. Die Struktur gibt Folgendes an:
- Die HID-Revision
- Das HID-Minidrivertreiberobjekt
- Die Größe einer HID-Minidriver-Geräteerweiterung
- Gibt an, 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 Speicher 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 der Geräteerweiterung an, wenn der Minidriver beim HID-Klassentreiber registriert wird. Die Größe wird durch das DeviceExtensionSize-Element 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 (FDO) erstellt wurde. Der HID-Klassentreiber legt die Mitglieder dieser Struktur fest, wenn er das FDO initialisiert. Ein HID-Minidriver 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 das oberes Element des Gerätestapels unter dem FDO.
MiniDeviceExtension ist ein Zeiger auf die HID-Minidriver-Geräteerweiterung.
Bei einem Zeiger auf den 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.
Ebenso kann ein HID-Minidriver einen Zeiger auf das PDO des Eingabegeräts und den oberen Rand des Gerätestapels unter dem FDO des Eingabegeräts abrufen.
Wenn ein HID-Minidriver einen IRP nach unten an den 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-Minitreiber-AddDevice-Routine
- HID-Minitreiber-Entlade-Routine
Ein HID-Minidriver muss auch die in "Dispatch-Routinen Bereitgestellt von einem HID-Minidriver" beschriebenen Abläufe unterstützen.
DriverEntry-Routine
Die DRIVER_INITIALIZE Routine in einem HID-Minidriver führt folgende Aktionen aus:
Erstellt ein Treiberobjekt für das verknüpfte Treiberpaar (HID-Klassentreiber und ein HID-Minidriver).
Legt die erforderlichen Treibereinstiegspunkte im HID Minidriver-Treiberobjekt fest.
Ruft HidRegisterMinidriver auf, um den HID Minidriver beim HID-Klassentreiber zu registrieren.
Gibt gerätespezifische Konfigurationen an, die nur vom HID-Minidriver genutzt werden.
AddDevice-Routine
Der HID-Klassentreiber behandelt das Erstellen und Initialisieren des funktionalen Geräteobjekts (FDO) für ein zugrunde liegendes Eingabegerät. Der HID-Klassentreiber betreibt auch den FDO aus der Perspektive der oberen Schnittstelle 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 Minidriver interne gerätespezifische Initialisierungen ausführen kann.
Die Parameter, die an den HID Minidriver DRIVER_ADD_DEVICE Routine übergeben werden, sind das Minidrivertreiberobjekt und das FDO. Der HID-Klassentreiber übergibt den FDO an die AddDevice-Routine des Minidrivers, nicht an das physische Geräteobjekt für das zugrunde liegende Eingabegerät.
Die Routine DRIVER_ADD_DEVICE des HID-Minitreibers erhält einen Zeiger auf die Geräteerweiterung des Minitreibers vom FDO.
In der Regel führt der HID-Minidriver DRIVER_ADD_DEVICE Routine folgende Aktionen aus:
Initialisiert die Minidriver-Geräteerweiterung. Die Geräteerweiterung wird nur vom Minidriver verwendet.
Gibt STATUS_SUCCESS zurück. Wenn der Minidriver einen Fehlerstatus zurückgibt, löscht der HID-Klassentreiber den FDO und gibt den Fehlerstatus an den Plug and Play-Manager zurück.
Unloadroutine
Die Unload-Routine des HID-Klassentreibers ruft die DRIVER_UNLOAD-Routine des HID-Minidrivers auf. Der HID-Minidriver gibt alle internen Ressourcen frei, die vom Minidriver zugeordnet wurden.
Verteilerroutinen
Ein HID-Minidriver muss die folgenden Dispatch-Routinen bereitstellen: Erstellen, Schließen, interne Gerätesteuerung, Systemsteuerung, Plug-and-Play und Energieverwaltung. Mit Ausnahme interner Gerätesteuerungsanforderungen bieten die meisten dieser Dispatch-Routinen minimale Funktionen. Wenn der HID-Klassentreiber diese Dispatch-Routinen aufruft, übergibt er das Minidriver-Treiberobjekt und das funktionale Geräteobjekt (FDO).
IRP_MJ_CREATE
In Übereinstimmung mit WDM-Anforderungen bieten der HID-Klassentreiber und ein HID-Minidriver eine Verteilerroutine zum Erstellen von Anforderungen. Der FDO kann jedoch nicht geöffnet werden. Der HID-Klassentreiber gibt STATUS_UNSUCCESSFUL zurück.
Ein HID-Minidriver muss nur einen Stub bereitstellen. Die Create Dispatch-Routine wird nie aufgerufen.
IRP_MJ_CLOSE
In Übereinstimmung mit WDM-Anforderungen müssen der HID-Klassentreiber sowie ein HID-Minidriver eine Verteilerroutine für Schließanforderungen bereitstellen. Der FDO kann jedoch nicht geöffnet werden. Der HID-Klassentreiber gibt STATUS_INVALID_PARAMETER_1 zurück.
Ein HID-Minidriver muss nur einen Stub bereitstellen. Die Close-Dispatch-Routine wird nie aufgerufen.
IRP_MJ_DEVICE_CONTROL
Ein HID-Minidriver benötigt keine Verteilerroutine für Gerätesteuerungsanforderungen. Der HID-Klassentreiber übergibt keine Gerätesteuerungsanforderungen an einen Minidriver.
IRP_MJ_INTERNAL_DEVICE_CONTROL
Ein HID-Minidriver muss eine Dispatch-Routine für interne Gerätesteuerungsanforderungen bereitstellen, die die in HID-Minidriver-IOCTLs beschriebenen Anforderungen unterstützen.
Der HID-Klassentreiber verwendet in erster Linie interne Gerätesteuerungsanforderungen für den Zugriff auf das zugrunde liegende Eingabegerät.
Der HID-Minidriver verarbeitet diese Anforderungen auf gerätespezifische Weise.
IRP_MJ_SYSTEM_CONTROL
Ein HID-Minidriver muss eine Dispatch-Routine für Systemsteuerungsanforderungen bereitstellen. Ein HID-Minidriver ist jedoch nur erforderlich, um Systemsteuerungsanforderungen wie folgt an den Gerätestapel zu übergeben:
Überspringen der aktuellen IRP-Stapelposition
Senden der Anforderung an den Gerätestapel des FDO
IRP_MJ_PNP
Ein HID-Minidriver muss eine Dispatch-Routine für Plug and Play-Anforderungen bereitstellen.
Der HID-Klassentreiber führt alle Plug-and-Play-Verarbeitungen aus, die dem FDO zugeordnet sind. Wenn der HID-Klassentreiber eine Plug- und Play-Anforderung verarbeitet, ruft er die Plug- und Play-Dispatch-Routine des HID-Minidrivers auf.
HID-Minitreiber-Plug-and-Play-Dispatch-Routine
Behandelt das Senden der Anforderung an den Gerätestapel des FDO und das Abschließen der Anforderung auf dem Weg zur Sicherung des Gerätestapels, je nach Anforderungstyp.
Führt die gerätespezifische Verarbeitung, die mit bestimmten Anforderungen verbunden ist, durch, um Informationen über den Zustand des FDO zu aktualisieren.
Beispielsweise kann der Minidriver den Plug-and-Play-Zustand des FDO aktualisieren (insbesondere, ob der FDO gestartet, angehalten oder im Prozess des Entfernens ist).
IRP_MJ_POWER
Der HID-Minidriver muss eine Versandroutine für Stromanforderungen bereitstellen. Der HID-Klassentreiber übernimmt jedoch die Energieverarbeitung für den FDO.
Um die WDM-Anforderungen zu erfüllen, sendet ein HID-Minidriver Stromanforderungen, indem er sie wie folgt in den Gerätestapel des FDO hinunterleitet:
Überspringt die aktuelle IRP-Stapelposition.
Startet den nächsten Leistungs-IRP
Sendet den Strom-IRP nach unten im Gerätestapel des FDO
Normalerweise übergibt der HID-Minidriver Energieanforderungen ohne weitere Verarbeitungsschritte an den Gerätestapel.