Share via


Auswählen eines Treibermodells für die Entwicklung eines USB-Clienttreibers

Dieses Thema enthält Richtlinien für die Auswahl des besten Treibermodells für die Entwicklung eines USB-Clienttreibers, der als Funktionstreiber des Geräts fungiert.

USB-Gerätehersteller müssen häufig eine Möglichkeit für Anwendungen bereitstellen, auf die Features des Geräts zuzugreifen. Um den besten Mechanismus für den Zugriff auf ein USB-Gerät auszuwählen, beginnen Sie mit dem einfachsten Ansatz, und wechseln Sie nur dann zu komplexeren Lösungen, wenn dies erforderlich ist. In der folgenden Liste sind die in diesem Thema erläuterten Optionen zusammengefasst:

  1. Wenn Ihr Gerät zu einer USB-Geräteklasse gehört, für die Windows einen Posteingangstreiber enthält, müssen Sie keinen Treiber schreiben.
  2. Wenn Ihr Gerät nicht über einen von Microsoft bereitgestellten Klassentreiber verfügt und eine einzelne Anwendung auf das Gerät zugreift, laden Sie WinUSB als Funktionstreiber.
  3. Wenn gleichzeitige Anwendungen auf das Gerät zugreifen müssen und Ihr Gerät über keine isochronen Endpunkte verfügt, schreiben Sie einen UMDF-basierten Clienttreiber.
  4. Wenn Klassentreiber, WinUSB oder UMDF-Lösungen keine Optionen sind, die für Sie geeignet sind, schreiben Sie einen KMDF-basierten Clienttreiber.
  5. Wenn ein bestimmtes Feature von KMDF nicht unterstützt wird, schreiben Sie einen Hybridtreiber, der WDM-Routinen aufruft.

Der gebräuchlichste Ansatz war die Implementierung eines Gerätetreibers (in dieser Dokumentation als USB-Clienttreiber bezeichnet) und die Bereitstellung eines Installationspakets, das den Treiber als Funktionstreiber im Gerätestapel oberhalb des von Microsoft bereitgestellten USB-Treiberstapels installiert. Der Clienttreiber macht eine Geräteschnittstelle verfügbar, die Anwendungen verwenden können, um das Dateihandle des Geräts abzurufen. Anwendungen können dann dieses Dateihandle verwenden, um mit dem Treiber zu kommunizieren, indem sie Windows-APIs aufrufen.

Das Schreiben eines Treibers, der an die Anforderungen des Geräts angepasst ist, ist die flexibelste Möglichkeit, den Zugriff auf ein USB-Gerät zu ermöglichen. Die Implementierung eines Treibers erfordert jedoch viel Arbeit. Der Treiber muss komplexe Aufgaben ausführen, z. B. Treiberinitialisierung, wenn neue Geräte erkannt werden, Energieverwaltung, E/A-Vorgänge, Überraschungsentfernung, Zustandsverwaltung und Bereinigung, wenn das Gerät entfernt wird. Bevor Sie sich für das Schreiben eines Treibers entscheiden, stellen Sie die folgenden Fragen:

Können Sie einen von Microsoft bereitgestellten Treiber verwenden?

Möglicherweise müssen Sie keinen Treiber schreiben, wenn:

  • Ihr Gerät gehört zu einer USB-Geräteklasse, die von Microsoft unterstützt wird.

    In diesem Fall wird der entsprechende Klassentreiber als Gerätetreiber geladen. Eine Liste der Geräteklassen, für die Windows einen Posteingangstreiber enthält, finden Sie unter USB-Geräteklassentreiber, die in Windows enthalten sind.

  • Ihr Gerät gehört keiner Geräteklasse an.

    Bewerten Sie für solche Geräte die Gerätefeatures, um zu ermitteln, ob Sie die von Microsoft bereitgestellte WinUSB (Winusb.sys) als Funktionstreiber des Geräts laden können. Die Verwendung von WinUSB ist die beste Lösung, wenn:

    • Auf Ihr Gerät wird über eine einzelne Anwendung zugegriffen.

    • Ihr Gerät unterstützt Massen-, Interrupt- oder isochrone Endpunkte.

    • Ihr Gerät ist für die Verwendung mit einem Zielcomputer vorgesehen, auf dem Windows XP mit Service Pack 2 (SP2) und höheren Versionen von Windows ausgeführt wird.

      Das Laden von WinUSB als Funktionstreiber bietet eine einfachere Alternative zur Implementierung eines benutzerdefinierten USB-Treibers. WinUSB ist beispielsweise der bevorzugte Ansatz für eine elektronische Wetterstation, auf die nur eine Anwendung zugreift, die mit dem Gerät gepackt ist. Es ist auch nützlich für die Diagnosekommunikation mit einem Gerät und für flashende Firmware.

      Um Anwendungen das Senden von Anforderungen an Winusb.sys zu erleichtern, stellen wir eine DLL im Benutzermodus Winusb.dll bereit, die WinUSB-Funktionen verfügbar macht. Eine Anwendung kann diese Funktionen aufrufen, um auf das Gerät zuzugreifen, es zu konfigurieren und Daten an die Endpunkte des Geräts zu übertragen.

      WinUSB ist keine Option, wenn:

    • Auf Ihr Gerät wird von mehreren Anwendungen zugegriffen.

    • Ihr Gerät verfügt über Funktionen, die im Windows-Betriebssystem bereits über Kernelmodusunterstützung verfügen. Beispielsweise müssen Sie für Modemfunktionen (die TAPI unterstützt) oder LAN-Funktionen (die NDIS unterstützt) die Schnittstelle verwenden, die der Usbser.sys Treiber unterstützt, um Modemgeräte mit Benutzermodussoftware zu verwalten.

      In Windows 8 haben wir der INSTALLATION von INF für WinUSB eine neue kompatible ID hinzugefügt. Wenn die Gerätefirmware diese kompatible ID enthält, wird WinUSB standardmäßig als Funktionstreiber für das Gerät geladen. Dies bedeutet, dass Hardwarehersteller keine INF-Dateien für ihre WinUSB-Geräte verteilen müssen. Weitere Informationen finden Sie unter WinUSB-Gerät.

Welches Treibermodell ist am besten geeignet, wenn Sie einen USB-Clienttreiber schreiben?

Die Antwort hängt vom Design Ihres Geräts ab. Ermitteln Sie zunächst, ob ein bestimmtes Treibermodell Ihren Anforderungen entspricht. Einige Entwurfsüberlegungen basieren darauf, ob auf das USB-Gerät von mehreren gleichzeitigen Anwendungen zugegriffen werden soll und datenstreaming über isochrone Endpunkte unterstützt werden soll.

Wenn Sie einen Treiber schreiben möchten, haben Sie folgende Optionen:

  • Benutzermodustreiberframework (UMDF)

    UMDF stellt Gerätetreiberschnittstellen (Device Driver Interfaces, DDIs) bereit, die ein Clienttreiber für die Integration in Windows-Komponenten wie den Plug & Play-Manager und Power Manager verwenden kann. UMDF bietet auch spezielle Zielobjekte für USB-Geräte, die die Hardware im Benutzermodus abstrahen und E/A-Vorgänge für den Treiber vereinfachen. Zusätzlich zu den UMDF-Schnittstellen bietet WDF erweiterte Debuggererweiterungen und Ablaufverfolgungstools für Benutzermodustreiber. UMDF basiert auf dem Component Object Model (COM), und die Entwicklung eines Benutzermodustreibers ist für C++-Entwickler einfacher.

    Implementieren Sie in den folgenden Fällen einen UMDF-basierten Clienttreiber für ein USB-Gerät:

    • Auf das Gerät wird gleichzeitig von mehreren Anwendungen zugegriffen.

    • Das Gerät unterstützt Massen- oder Interruptübertragungen.

      Treiber, die im Benutzermodus ausgeführt werden, können nur auf den (virtuellen) Benutzeradressraum zugreifen und stellen ein viel geringeres Risiko für das System dar. Kernelmodustreiber können auf den Systemadressraum und die internen Systemstrukturen zugreifen. Ein falsch codierter Kernelmodustreiber kann Probleme verursachen, die sich auf andere Treiber oder das System auswirken und schließlich den Computer abstürzen. Daher kann ein Benutzermodustreiber in Bezug auf Sicherheit und Stabilität sicherer als ein Kernelmodustreiber sein.

      Ein weiterer Vorteil von Benutzermodustreibern ist, dass sie alle Win32-APIs nutzen. Beispielsweise können die Treiber APIs wie Winsock, Komprimierung, Verschlüsselungs-APIs usw. aufrufen. Diese APIs sind für Kernelmodustreiber nicht verfügbar.

      Ein UMDF-basierter Clienttreiber ist keine Option für USB-Geräte, die isochrone Endpunkte unterstützen.

      Beachten Sie Windows 8.1 Version 2.0 von UMDF eingeführt wird. Mit UMDF Version 2.0 können Sie einen UMDF-Treiber in der Programmiersprache C schreiben, der viele der Methoden aufruft, die für KMDF-Treiber verfügbar sind. Sie können UMDF-Version 2.0 nicht verwenden, um niedrigere Filtertreiber für USB zu schreiben.

  • Kernelmodus-Treiberframework (KMDF)

    KMDF wurde entwickelt, um die Treibermodelle einfach zu erweitern, um neue Hardwaretypen zu unterstützen. KMDF stellt DDIs und Datenstrukturen bereit, die die Implementierung von USB-Treibern im Kernelmodus als die früheren WdM-Treiber (Windows Driver Model) vereinfachen. Darüber hinaus bietet KMDF spezielle Eingabe-/Ausgabeziele (E/A), mit denen Sie einen voll funktionsfähigen Clienttreiber schreiben können, der den Microsoft USB-Treiberstapel verwendet.

    In bestimmten Fällen, in denen ein bestimmtes Feature nicht über KMDF verfügbar gemacht wird, muss der Treiber WDM-Routinen aufrufen. Der Treiber muss nicht die gesamte WDM-Infrastruktur implementieren, sondern verwendet KMDF-Methoden, um auf einen ausgewählten Satz von WDM-Routinen zuzugreifen. Um beispielsweise isochrone Übertragungen durchzuführen, kann ein KMDF-basierter Clienttreiber URBs im WDM-Stil senden, die die Anforderung beschreiben, an den USB-Treiberstapel. Solche Treiber werden in dieser Dokumentation als Hybridtreiber bezeichnet.

    KMDF unterstützt auch das Port-Miniport-Treibermodell. Für instance kann ein Kernelstreaming-Miniporttreiber (z. B. eine USB-Webcam), der Kernelstreaming am oberen Rand verwendet, KMDF-USB-E/A-Zielobjekte verwenden, um Anforderungen an den USB-Treiberstapel zu senden. NDIS-Treiber können auch mithilfe von KMDF für protokollbasierte Busse wie USB geschrieben werden.

    Reine WDM-Treiber sind schwierig zu schreiben, komplex und nicht robust. Mit der Entwicklung von KMDF ist das Schreiben dieses Treibertyps nicht mehr erforderlich.

Microsoft Visual Studio 2012 enthält Vorlagen für USB-User-Mode-Treiber und USB-Kernel-Mode-Treiber , die Startcode für einen UMDF- bzw. KMDF-USB-Clienttreiber generieren. Der Vorlagencode initialisiert ein USB-Zielgerätobjekt, um die Kommunikation mit der Hardware zu ermöglichen. Weitere Informationen finden Sie in den folgenden Themen:

Informationen zum Implementieren von UMDF- und KMDF-Treibern finden Sie im Microsoft Press-Buch Developing Drivers with the Windows Driver Foundation .

WinUSB-, UMDF- und KMDF-Featurevergleich

In der folgenden Tabelle sind die Funktionen von WinUSB, UMDF-basierten USB-Treibern und KMDF-basierten USB-Treibern zusammengefasst.

Funktion Winusb UMDF KMDF
Unterstützt mehrere gleichzeitige Anwendungen Nein Ja Yes
Isoliert den Treiberadressraum vom Anwendungsadressraum. Nein Ja Nein
Unterstützt Massen-, Interrupt- und Steuerungsübertragungen Yes Yes Yes
Unterstützt isochrone Übertragungen Ja 4 Nein Ja
Unterstützt die Installation von Kernelmodustreibern, z. B. Filtertreibern, als überlappende Schicht auf dem USB-Stapel. No Nein Ja
Unterstützt selektives Anhalten und den Warte-/Aktivierungszustand Yes Yes Yes

In der folgenden Tabelle sind die WDF-Optionen zusammengefasst, die von verschiedenen Versionen von Windows unterstützt werden.

Windows-Version Winusb UMDF KMDF
Windows 8 Ja Yes Yes
Windows 7 Ja Yes Ja
Windows Vista Ja1 Ja1 Ja
Windows Server 2003 Nein Nein Ja
Windows XP Ja2 Ja2 Ja
Microsoft Windows 2000 No Nein Ja3

Ja1: WinUSB und UMDF werden nur unter x86- und x64-basierten Versionen von Windows unterstützt.

Ja2: WINUSB und UMDF werden in Windows XP mit Service Pack 2 (SP2) oder höheren Versionen von Windows unterstützt.

Ja3: KMDF wird in Windows 2000 mit SP4 oder höheren Versionen von Windows unterstützt.

Ja4: Isochrone Übertragungen werden in Windows 8.1 oder höheren Versionen von Windows unterstützt.

Alle Client-SKUs der 32-Bit-Versionen von Windows XP mit SP2support WinUSB. WinUSB ist nicht nativ für Windows XP; Es muss mit dem WinUSB-Co-Installer installiert werden. Alle Windows Vista-SKUs und höhere Versionen von Windows unterstützen WinUSB.