Windows-Desktop-App für ein USB-Gerät
In diesem Artikel erfahren Sie, wie eine Anwendung WinUSB-Funktionen aufrufen kann, um mit einem USB-Gerät zu kommunizieren. Für eine solche Anwendung muss WinUSB (Winusb.sys) als Funktionstreiber des Geräts installiert werden. WinUSB im Kernelmodusstapel des Geräts. Dieser Treiber ist in Windows im Ordner "\Windows\System32\drivers" enthalten.
Wenn Sie Winusb.sys als Funktionstreiber eines USB-Geräts verwenden, können Sie WinUSB-Funktionen aus einer Anwendung aufrufen, um mit dem Gerät zu kommunizieren. Diese Funktionen, die von der DLL-Winusb.dll für den Benutzermodus verfügbar gemacht werden, vereinfachen den Kommunikationsprozess. Anstatt Geräte-E/A-Steuerungsanforderungen zu erstellen, um standardmäßige USB-Vorgänge auszuführen (z. B. Konfigurieren des Geräts, Senden von Steuerungsanforderungen und Übertragen von Daten an oder vom Gerät), rufen Anwendungen die entsprechende WinUSB-Funktion auf.
Winusb.dll verwendet die von der Anwendung bereitgestellten Daten, um die entsprechende Geräte-E/A-Steuerungsanforderung zu erstellen, und sendet die Anforderung dann zur Verarbeitung an Winusb.sys. Um mit dem USB-Stapel zu kommunizieren, ruft die WinUSB-Funktion die DeviceIoControl-Funktion mit der entsprechenden IOCTL auf, die mit der Anforderung der Anwendung korreliert. Wenn die Anforderung abgeschlossen ist, übergibt die WinUSB-Funktion alle von Winusb.sys zurückgegebenen Informationen (z. B. Daten aus einer Leseanforderung) an den aufrufenden Prozess zurück. Wenn der Aufruf von DeviceIoControl erfolgreich ist, wird ein Wert ungleich Null zurückgegeben. Wenn der Aufruf fehlschlägt oder aussteht (nicht sofort verarbeitet), gibt DeviceIoControl einen Nullwert zurück. Wenn ein Fehler auftritt, kann die Anwendung GetLastError für eine detailliertere Fehlermeldung aufrufen.
Es ist einfacher, WinUSB-Funktionen für die Kommunikation mit einem Gerät zu verwenden, als einen Treiber zu implementieren. Beachten Sie jedoch die folgenden Einschränkungen:
WinUSB-Funktionen ermöglichen jeweils eine Anwendung, mit dem Gerät zu kommunizieren. Wenn Sie mehr als eine Anwendung benötigen, um gleichzeitig mit einem Gerät zu kommunizieren, müssen Sie einen Funktionstreiber implementieren.
Vor Windows 8.1 unterstützen WinUSB-Funktionen kein Streaming von Daten zu oder von isochronen Endpunkten.
WinUSB-Funktionen unterstützen keine Geräte, die bereits Kernelmodus unterstützen. Beispiele für solche Geräte sind Modems und Netzwerkadapter, die von der Telefonie-API (TAPI) bzw. NDIS unterstützt werden.
Für Multifunktionsgeräte können Sie die INF-Datei des Geräts verwenden, um entweder einen integrierten Kernelmodustreiber oder Winusb.sys für jede USB-Funktion separat anzugeben. Sie können jedoch nur eine dieser Optionen für eine bestimmte Funktion angeben, nicht beide.
Hinweis
WinUSB-Funktionen erfordern Windows XP oder höher. Sie können diese Funktionen in Ihrer C/C++-Anwendung verwenden, um mit Ihrem USB-Gerät zu kommunizieren. Informationen zum Schreiben einer UWP-App, die WinUSB-APIs verwendet, finden Sie unter UWP-App für ein USB-Gerät.
Erste Schritte
Abrufen der tools, die zum Schreiben einer Windows-Desktop-App für Geräte erforderlich sind
- Folgen Sie den Anweisungen zum Herunterladen des Windows Driver Kit.
Rufen Sie ein USB-Testgerät und seine Hardwarespezifikation ab.
Verwenden Sie die Spezifikation, um die Funktionalität der App und die zugehörigen Entwurfsentscheidungen zu bestimmen.
Microsoft USB Test Tool (MUTT)-Geräte sind über JJG Technologies verfügbar. Für dieses Gerät ist Firmware von Microsoft erforderlich, die unter "MUTT-Softwarepaket herunterladen" verfügbar ist.
Schreiben Sie eine Skelett-App, die ein Handle für das Gerät abruft.
Es gibt zwei Ansätze zum Schreiben der ersten Anwendung:
Schreiben basierend auf der WinUSB-Vorlage, die in Visual Studio enthalten ist. Weitere Informationen finden Sie unter Schreiben einer Windows-Desktop-App basierend auf der WinUSB-Vorlage.
Rufen Sie SetupAPI-Routinen auf, um ein Handle für das Gerät abzurufen und zu öffnen, indem Sie WinUsb_Initialize aufrufen. Weitere Informationen finden Sie unter "Zugreifen auf ein USB-Gerät mithilfe von WinUSB-Funktionen".
Installieren Sie Winusb.sys für Ihr Gerät.
Wenn Sie Visual Studio verwenden, installieren Sie das Treiberpaket mithilfe der Visual Studio-Bereitstellung auf dem Zielcomputer. Anweisungen finden Sie unter Schreiben einer Windows-Desktop-App basierend auf der WinUSB-Vorlage. Installieren Sie den Treiber andernfalls manuell in Geräte-Manager, indem Sie einen benutzerdefinierten INF schreiben. Weitere Informationen finden Sie unter WinUSB (Winusb.sys) Installation.
Rufen Sie Informationen zu Ihrem Gerät ab, und zeigen Sie dessen Beschreibungen an.
Konzeptionelle Informationen finden Sie unter "Konzepte für alle USB-Entwickler". Rufen Sie Informationen zu Ihren Gerätefunktionen ab, indem Sie die Konfigurationsdeskriptoren, Schnittstellendeskriptoren für jede unterstützte alternative Einstellung und deren Endpunktdeskriptoren lesen. Weitere Informationen finden Sie unter Abfragen des Geräts für USB-Deskriptoren.
Senden Sie eine USB-Steuerübertragung.
Senden Sie Standardsteuerungsanfragen und Herstellerbefehle an Ihr Gerät. Weitere Informationen finden Sie unter Senden der Steuerelementübertragung an den Standardendpunkt.
Massenübertragungen senden oder unterbrechen.
Führen Sie Lese- und Schreibvorgänge aus, die von Ihrem Gerät unterstützt werden, in den Massen-, Interrupt- und isochronen Endpunkten. Weitere Informationen finden Sie unter Problem-E/A-Anforderungen.
Isochrone Übertragungen senden.
Senden Sie isochrone Lese- und Schreibanforderungen, die hauptsächlich zum Streamen von Daten verwendet werden. Dieses Feature ist nur für Windows 8.1 und höher verfügbar. Weitere Informationen finden Sie unter Senden isochroner USB-Übertragungen von einer WinUSB-Desktop-App.