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:

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:

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:

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.