Freigeben über


Auswahl eines Treibermodells für die Entwicklung eines USB-Client-Treibers

Dieser Artikel 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 bieten, 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 werden die in diesem Artikel erläuterten Auswahlmöglichkeiten 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 nur eine einzelne Anwendung auf das Gerät zugreift, laden Sie WinUSB als Funktionstreiber.
  3. Wenn auf das Gerät durch gleichzeitige Anwendungen zugegriffen wird und Ihr Gerät keine isochronen Endpunkte hat, schreiben Sie einen UMDF-basierten Clienttreiber.
  4. Wenn Klassentreiber, WinUSB- oder UMDF-Lösungen keine Optionen für Sie 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 häufigste Ansatz besteht darin, einen Gerätetreiber (als USB-Clienttreiber in diesem Dokumentationssatz bezeichnet) zu implementieren und ein Installationspaket bereitzustellen, das den Treiber als Funktionstreiber im Gerätestapel oberhalb des von Microsoft bereitgestellten USB-Treiberstapels installiert. Der Clienttreiber macht eine Geräteschnittstelle verfügbar, mit der Anwendungen das Dateihandle des Geräts abrufen können. 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 Methode, um 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
  • Entfernen eines Überraschungsgeräts
  • Zustandsverwaltung
  • Bereinigen, wenn das Gerät entfernt wird

Bevor Sie einen Treiber schreiben möchten, 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 VON Microsoft unterstützten USB-Geräteklasse.

    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 nicht zu einer Geräteklasse.

    Bewerten Sie für solche Geräte die Gerätefeatures, um zu ermitteln, ob Sie den von Microsoft bereitgestellten 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 soll mit einem Zielcomputer mit Windows XP mit Service Pack 2 (SP2) und höheren Versionen von Windows arbeiten.

      Das Laden von WinUSB als Funktionstreiber bietet eine einfachere Alternative zur Implementierung eines benutzerdefinierten USB-Treibers. Beispielsweise ist WinUSB der bevorzugte Ansatz für eine elektronische Wetterstation, auf die nur von einer Anwendung zugegriffen wird, die mit dem Gerät verpackt 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-Datei 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 bereits über Kernelmodusunterstützung im Windows-Betriebssystem 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.

      Ab Windows 8 haben wir der INF für WinUSB-Installation eine 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.

Wenn Sie einen USB-Clienttreiber schreiben, welches Treibermodell am besten geeignet ist?

Die Antwort hängt vom Design Ihres Geräts ab. Ermitteln Sie zunächst, ob ein bestimmtes Treibermodell Ihre Anforderungen erfüllt. Einige Entwurfsüberlegungen basieren darauf, ob auf das USB-Gerät durch mehrere gleichzeitige Anwendungen zugegriffen werden soll und das Datenstreaming über isochrone Endpunkte unterstützt werden soll.

Wenn Sie einen Treiber schreiben möchten, stehen Ihnen die folgenden Optionen zur Auswahl:

  • Benutzermodustreiberframework (UMDF)

    UMDF stellt Gerätetreiberschnittstellen (Device Driver Interfaces, DDIs) bereit, mit denen ein Clienttreiber in Windows-Komponenten wie den Plug & Play-Manager und Power Manager integriert werden kann. UMDF bietet auch spezielle Zielobjekte für USB-Geräte, die die Hardware im Benutzermodus abstrahieren und E/A-Vorgänge für den Treiber vereinfachen. Neben den UMDF-Schnittstellen bietet WDF erweiterte Debuggererweiterungen und Ablaufverfolgungstools für Benutzermodustreiber. UMDF basiert auf dem Komponentenobjektmodell (COM) und die Entwicklung eines Benutzermodustreibers ist für einen C++-Entwickler einfacher.

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

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

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

      Treiber, die im Benutzermodus ausgeführt werden, können nur auf den (virtuellen) Benutzeradressraum zugreifen und ein geringeres Risiko für das System darstellen. 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 sicherer als ein Kernelmodustreiber in Bezug auf Sicherheit und Stabilität sein.

      Ein weiterer Vorteil von Benutzermodustreibern besteht darin, dass sie alle Win32-APIs verwenden können. 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.

      Hinweis

      Windows 8.1 hat Version 2.0 von UMDF eingeführt. Mit UMDF Version 2.0 können Sie einen UMDF-Treiber in der C-Programmiersprache schreiben, der viele der Methoden aufruft, die kmDF-Treibern zur Verfügung stehen. Sie können UMDF Version 2.0 nicht verwenden, um niedrigere Filtertreiber für USB zu schreiben.

  • Kernelmodustreiberframework (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 Kernelmodus-USB-Treibern vereinfachen als die früheren Windows Driver Model (WDM)-Treiber. Darüber hinaus bietet KMDF spezielle Eingabe-/Ausgabeziele (I/O), 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, verwendet jedoch KMDF-Methoden, um auf einen ausgewählten Satz von WDM-Routinen zuzugreifen. Um beispielsweise isochrone Übertragungen durchzuführen, kann ein KMDF-basierter Clienttreiber WDM-Stil-URBs senden, die die Anforderung an den USB-Treiberstapel beschreiben. Solche Treiber werden in diesem Dokumentationssatz als Hybridtreiber bezeichnet.

    KMDF unterstützt auch das Port-Miniport-Treibermodell. Beispielsweise kann ein Kernel-Streaming-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 enthält USB-Benutzermodustreiber und USB-Kernelmodustreiber , 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 Artikeln:

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

WinUSB-, UMDF-, 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 No Ja Ja
Isoliert den Adressraum des Treibers aus dem Anwendungsadressraum. No Ja No
Unterstützt Massen-, Unterbrechungs- und Steuerungsübertragungen Ja Ja Ja
Unterstützt isochrone Übertragungen Ja 4 No Ja
Unterstützt die Installation von Kernelmodustreibern, z. B. Filtertreibern, als überlagerte Ebene auf dem USB-Stapel No Nein Ja
Unterstützt selektives Anhalten und den Warte-/Wake-Zustand Ja Ja Ja

In der folgenden Tabelle sind die WDF-Optionen zusammengefasst, die unterschiedliche Versionen von Windows unterstützen.

Windows-Version WinUSB UMDF KMDF
Windows 11 Ja Ja Ja
Windows 10 Ja Ja Ja
Windows 8 Ja Ja Ja
Windows 7 Ja Ja Ja
Windows Vista Ja1 Ja1 Ja
Windows Server 2003 No Nein Ja
Windows XP Ja2 Ja2 Ja
Microsoft Windows 2000 No No Ja3

Ja1: WinUSB und UMDF werden nur in x86-basierten 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öher-Versionen von Windows unterstützt.

Alle Client-SKUs der 32-Bit-Versionen von Windows XP mit SP2 unterstützen WinUSB. WinUSB ist nicht nativ für Windows XP, es muss mit dem WinUSB-Coinstaller installiert werden. Alle Windows Vista-SKUs und höhere Versionen von Windows unterstützen WinUSB.