Gerät für WebUSB erstellen

Erstellen Sie ein Gerät, um die WebUSB API optimal zu nutzen.

In diesem Artikel wird erläutert, wie Sie ein Gerät bauen können, um die Vorteile der WebUSB API Eine kurze Einführung in die API selbst findest du unter Auf USB-Geräte zugreifen im Web.

Hintergrund

Der Universal Serial Bus (USB) ist zur gängigsten physischen Schnittstelle für Peripheriegeräte mit Desktop- und Mobilgeräten verbinden. Zusätzlich zu Definition der elektrischen Eigenschaften des Busses und eines mit einem Gerät kommunizieren können, umfassen die USB-Spezifikationen eine Reihe von Geräteklassen. Spezifikationen. Dies sind allgemeine Modelle für bestimmte Geräteklassen wie wie Speicherplatz, Audio, Video, Netzwerk usw., die Gerätehersteller umsetzen. Der Vorteil dieser Spezifikationen für die Geräteklasse besteht darin, dass ein Betriebssystemanbieter kann einen einzelnen Treiber basierend auf der Klasse implementieren. -Spezifikation (ein "Klassentreiber") und jedes Gerät, das diese Klasse implementiert, unterstützt. Dies war eine große Verbesserung gegenüber jedem Hersteller, der ihre eigenen Gerätetreiber.

Einige Geräte lassen sich jedoch keiner dieser standardisierten Geräteklassen zuordnen. A kann der Hersteller sein Gerät stattdessen so kennzeichnen, anbieterspezifischen Klassifizierung. In diesem Fall wählt das Betriebssystem aus, basierend auf den Informationen im Treiberpaket des Anbieters, in der Regel eine Reihe von Anbieter- und Produkt-IDs, die bekanntermaßen eine anbieterspezifisches Protokoll.

Eine weitere Funktion von USB besteht darin, dass Geräte mehrere Schnittstellen zur Verfügung stellen können, mit dem sie verbunden sind. Jede Schnittstelle kann entweder ein standardisierten Klassen oder anbieterspezifisch sein. Wenn ein Betriebssystem die die richtigen Treiber für das Gerät sind. Jede Schnittstelle kann von einem anderen . Eine USB-Webcam hat typischerweise zwei Schnittstellen, eine Implementierung der USB-Videoklasse (für die Kamera) und der Implementierung der USB- Audioklasse (für das Mikrofon) Das Betriebssystem lädt kein einzelnes "Webcam-Treiber" lädt stattdessen aber unabhängige Treiber für die Video- und Audioklasse. die für die separaten Funktionen des Geräts verantwortlich sind. Dieses Die Zusammensetzung von Schnittstellenklassen bietet mehr Flexibilität.

API-Grundlagen

Viele der Standard-USB-Klassen haben entsprechende Web-APIs. Beispiel: Seite kann mit getUserMedia() Videos von einem Gerät für den Videokurs aufnehmen oder Eingabeereignisse von einem Gerät der HID-Klasse (HID-Klasse) empfangen, indem Sie für KeyboardEvents oder PointerEvents oder über das Gamepad bzw. die WebHID API. Genauso wie nicht alle Geräte eine standardisierte Klassendefinition implementieren, -Geräte implementieren Funktionen, die vorhandenen Webplattform-APIs entsprechen. Wann? kann das WebUSB API diese Lücke schließen, indem es Websites die Möglichkeit bietet, eine anbieterspezifische Schnittstelle zu beanspruchen und Support dafür direkt auf ihrer Seite.

Die spezifischen Anforderungen für den Zugriff auf ein Gerät über WebUSB variieren geringfügig von Plattform zu Plattform, da die USB-Verbindung von Betriebssystemen unterschiedlich verwaltet wird. Geräte einrichten, aber die Grundvoraussetzung ist, dass ein Gerät nicht bereits eine der die gewünschte Oberfläche beansprucht. Dies kann entweder eine Generischer Klassentreiber, der vom Betriebssystemanbieter bereitgestellt wird, oder Gerätetreiber, der von Zulieferunternehmen. Da USB-Geräte mehrere Schnittstellen haben können, eigenen Treiber haben, ist es möglich, ein Gerät zu entwickeln, für das einige Schnittstellen vom Fahrer beansprucht und andere für den Browser zugänglich bleiben.

High-End-USB-Tastaturen bieten beispielsweise eine Schnittstelle der HID-Klasse, die vom Eingabesubsystem des Betriebssystems und einem anbieterspezifischen Schnittstelle, die WebUSB zur Verwendung durch ein Konfigurationstool zur Verfügung steht. Dieses kann auf der Website des Herstellers angezeigt werden, sodass Nutzende Aspekte des Geräteverhaltens, wie Makrotasten und Lichteffekte, ohne plattformspezifische Software zu installieren. Der Konfigurationsdeskriptor eines solchen Geräts würde etwa so aus:

Wert Feld Beschreibung
Konfigurationsdeskriptor
0x09 bLength Größe dieses Deskriptors
0x02 bDescriptorType Konfigurationsdeskriptor
0x0039 wTotalLength Gesamtlänge dieser Reihe von Deskriptoren
0x02 bNumInterfaces Anzahl der Schnittstellen
0x01 bConfigurationValue Configuration 1
0x00 iConfiguration Konfigurationsname (keine)
0b1010000 bmAttributes Selbstbetriebenes Gerät mit Remote-Aktivierung
0x32 bMaxPower Die maximale Leistung wird in 2-mA-Schritten angegeben.
Schnittstellendeskriptor
0x09 bLength Größe dieses Deskriptors
0x04 bDescriptorType Schnittstellendeskriptor
0x00 bInterfaceNumber Schnittstelle 0
0x00 bAlternateSetting Alternative Einstellung: 0 (Standardeinstellung)
0x01 bNumEndpoints 1 Endpunkt
0x03 bInterfaceClass HID-Schnittstellenklasse
0x01 bInterfaceSubClass Abgeleitete Bootschnittstellenklasse
0x01 bInterfaceProtocol Tastatur
0x00 iInterface Schnittstellenname (keine)
HID-Deskriptor
0x09 bLength Größe dieses Deskriptors
0x21 bDescriptorType HID-Deskriptor
0x0101 bcdHID HID-Version 1.1
0x00 bCountryCode Hardware-Zielland
0x01 bNumDescriptors Anzahl der HID-Klassendeskriptoren, denen gefolgt werden soll
0x22 bDescriptorType Art des Berichtsdeskriptors
0x003F wDescriptorLength Gesamtlänge des Berichtsdeskriptors
Endpunktdeskriptor
0x07 bLength Größe dieses Deskriptors
0x05 bDescriptorType Endpunktdeskriptor
0b10000001 bEndpointAddress Endpunkt 1 (IN)
0b00000011 bmAttributes Unterbrechen
0x0008 wMaxPacketSize 8-Byte-Pakete
0x0A bInterval Intervall von 10 ms
Schnittstellendeskriptor
0x09 bLength Größe dieses Deskriptors
0x04 bDescriptorType Schnittstellendeskriptor
0x01 bInterfaceNumber Schnittstelle 1
0x00 bAlternateSetting Alternative Einstellung: 0 (Standardeinstellung)
0x02 bNumEndpoints 2 Endpunkte
0xFF bInterfaceClass Anbieterspezifische Oberflächenklasse
0x00 bInterfaceSubClass
0x00 bInterfaceProtocol
0x00 iInterface Schnittstellenname (keine)
Endpunktdeskriptor
0x07 bLength Größe dieses Deskriptors
0x05 bDescriptorType Endpunktdeskriptor
0b10000010 bEndpointAddress Endpunkt 1 (IN)
0b00000010 bmAttributes Bulk
0x0040 wMaxPacketSize 64-Byte-Pakete
0x00 bInterval Nicht verfügbar für Bulk-Endpunkte
Endpunktdeskriptor
0x07 bLength Größe dieses Deskriptors
0x05 bDescriptorType Endpunktdeskriptor
0b00000011 bEndpointAddress Endpunkt 3 (OUT)
0b00000010 bmAttributes Bulk
0x0040 wMaxPacketSize 64-Byte-Pakete
0x00 bInterval Nicht verfügbar für Bulk-Endpunkte

Der Konfigurationsdeskriptor besteht aus mehreren verketteten Deskriptoren. miteinander verbinden. Jedes beginnt mit den Feldern bLength und bDescriptorType. identifiziert werden kann. Die erste Schnittstelle ist eine HID-Schnittstelle mit einem zugehörigen HID-Deskriptor und einem einzelnen Endpunkt, mit dem Eingabeereignisse an den Betriebssystem. Die zweite ist eine anbieterspezifische Schnittstelle mit zwei Endpunkte, über die Befehle an das Gerät gesendet und Antworten empfangen werden können im Gegenzug erhalten.

WebUSB-Deskriptoren

WebUSB funktioniert zwar mit vielen Geräten ohne Firmware-Änderungen, werden zusätzliche Funktionen aktiviert, indem das Gerät mit spezifischen Deskriptoren, die auf die Unterstützung von WebUSB hinweisen. Sie können beispielsweise einen Landingpage-URL, zu der der Nutzer im Browser weitergeleitet werden kann, wenn Ihr Gerät an die Stromversorgung angeschlossen ist.

<ph type="x-smartling-placeholder">
</ph> Screenshot der WebUSB-Benachrichtigung in Chrome
WebUSB-Benachrichtigung

Der Binary Device Object Store (BOS) ist ein Konzept, das mit USB 3.0 eingeführt wurde, im Rahmen von Version 2.1 auch auf USB 2.0-Geräte zurückportiert. Wird deklariert beginnt die Unterstützung für WebUSB mit den folgenden Plattformfunktionen Deskriptor im BOS-Deskriptor:

Wert Feld Beschreibung
Objektspeicher-Deskriptor des Binärgeräts
0x05 bLength Größe dieses Deskriptors
0x0F bDescriptorType Objektspeicher-Deskriptor des Binärgeräts
0x001D wTotalLength Gesamtlänge dieser Reihe von Deskriptoren
0x01 bNumDeviceCaps Anzahl der Gerätefunktionsdeskriptoren im BOS
Funktionsdeskriptor der WebUSB-Plattform
0x18 bLength Größe dieses Deskriptors
0x10 bDescriptorType Gerätefunktionsbeschreibung
0x05 bDevCapabilityType Beschreibung der Plattformfunktionen
0x00 bReserved
{0x38, 0xB6, 0x08, 0x34, 0xA9, 0x09, 0xA0, 0x47, 0x8B, 0xFD, 0xA0, 0x76, 0x88, 0x15, 0xB6, 0x65} PlatformCapablityUUID WebUSB-Plattform-Funktionsdeskriptor-GUID im Little-Endian-Format
0x0100 bcdVersion WebUSB-Deskriptor Version 1.0
0x01 bVendorCode bRequest-Wert für WebUSB
0x01 iLandingPage URL für Landingpage

Laut der UUID der Plattformfunktion ist dies ein WebUSB Platform Capability Deskriptor mit grundlegenden Informationen zum Gerät. Für den Browser , um weitere Informationen über das Gerät abzurufen, für das der Wert bVendorCode verwendet wird. zusätzliche Anfragen an das Gerät senden. Die einzige derzeit angegebene Anfrage ist GET_URL: gibt einen URL-Deskriptor zurück. Sie ähneln Zeichenfolgen verwenden. Sie sind jedoch darauf ausgelegt, URLs mit wenigen Byte zu codieren. Eine URL Deskriptor für "https://google.com" würde so aussehen:

Wert Feld Beschreibung
URL-Deskriptor
0x0D bLength Größe dieses Deskriptors
0x03 bDescriptorType URL-Deskriptor
0x01 bScheme https://
"google.com" URL UTF-8-codierter URL-Inhalt

Wenn Ihr Gerät zum ersten Mal angeschlossen wird, liest der Browser den BOS-Deskriptor, indem er Standardübertragung von GET_DESCRIPTOR-Kontrollen:

bmRequestType bRequest wValue wIndex wLength Daten (Antwort)
0b10000000 0x06 0x0F00 0x0000 * BOS-Deskriptor

Diese Anfrage wird normalerweise zweimal gestellt, das erste Mal mit einer ausreichend großen wLength damit der Host den Wert des Felds wTotalLength erfährt, Commit für eine große Übertragung und dann erneut, wenn die vollständige Deskriptorlänge gleich bekannt sind.

Wenn im Feld iLandingPage der WebUSB-Plattformfunktionsbeschreibung der Wert einen Wert ungleich null, der der Browser dann eine WebUSB-spezifische GET_URL-Anfrage ausführt durch Ausführen einer Kontrollübertragung mit bRequest auf den Wert bVendorCode aus dem Deskriptor der Plattformfunktionen und wValue auf iLandingPage festgelegt Wert. Der Anfragecode für GET_URL (0x02) lautet in wIndex:

bmRequestType bRequest wValue wIndex wLength Daten (Antwort)
0b11000000 0x01 0x0001 0x0002 * URL-Deskriptor

Auch dieser Antrag kann zweimal gestellt werden, des gelesenen Deskriptors.

Plattformspezifische Überlegungen

Die WebUSB API versucht, eine einheitliche Schnittstelle für den Zugriff Entwickler von USB-Geräten sollten sich dennoch über die Anforderungen wie z. B. Webbrowser-Anforderungen, um auf Geräte zugreifen zu können.

macOS

Für macOS ist nichts Besonderes erforderlich. Eine Website, die WebUSB verwendet, kann eine Verbindung zu und alle Schnittstellen beanspruchen, die nicht von einem Kernel-Treiber oder eine andere Anwendung nutzen.

Linux

Linux ist wie macOS, aber bei den meisten Distributionen wird standardmäßig Konten mit der Berechtigung zum Öffnen von USB-Geräten Ein System-Daemon namens udev ist ist für die Zuweisung des Nutzers und der Gruppe verantwortlich, die Zugriff auf ein Gerät haben. Eine Regel Dadurch wird die Eigentümerschaft eines Geräts zugewiesen, das dem angegebenen Anbieter entspricht. Produkt-IDs zur Gruppe plugdev, die eine gemeinsame Gruppe für Nutzer mit Zugriff ist an Peripheriegeräte:

SUBSYSTEM=="usb", ATTR{idVendor}=="XXXX", ATTR{idProduct}=="XXXX", GROUP="plugdev"

Ersetzen Sie XXXX durch die hexadezimale Anbieter- und Produkt-ID für Ihr Gerät. z.B. ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e11" würde einem Nexus One entsprechen Smartphone. Diese Werte müssen ohne das übliche "0x" geschrieben werden. Präfix und ausschließlich Kleinbuchstaben nicht richtig erkannt werden. Führen Sie die Befehlszeile aus, um die IDs für Ihr Gerät zu finden Tool lsusb.

Diese Regel sollte in einer Datei im Verzeichnis /etc/udev/rules.d abgelegt und wird wirksam, sobald das Gerät angeschlossen ist. Es ist kein Neustart erforderlich udev verwenden.

Android

Die Android-Plattform basiert auf Linux, erfordert jedoch keine Änderungen, Systemkonfiguration. Standardmäßig alle Geräte ohne Treiber Betriebssystem ist für den Browser verfügbar. Entwickelnde sollten wissen, dass beim Herstellen der Verbindung auf dem Gerät. Sobald ein Nutzer als Reaktion auf einen Aufruf der requestDevice() eingeben, werden Sie in Android gefragt, ob Sie dies zulassen möchten. Chrome, um darauf zuzugreifen. Diese Aufforderung erscheint auch wieder, wenn ein Nutzer zu einer Website zurückkehrt. die bereits die Berechtigung hat, sich mit einem Gerät zu verbinden, und die Website ruft auf open()

Außerdem wird es unter Android mehr Geräte geben als unter Linux Desktop. da standardmäßig weniger Treiber enthalten sind. Eine nennenswerte Auslassung ist beispielsweise ist die USB-CDC-ACM-Klasse, die häufig von USB-zu-Seriell-Adaptern implementiert wird, da ist keine API im Android SDK für die Kommunikation mit einem seriellen Gerät.

ChromeOS

ChromeOS basiert ebenfalls auf Linux und muss nicht geändert werden zur Systemkonfiguration. Der Dienst „permission_broker“ steuert den Zugriff auf USB Geräte und lässt den Browser darauf zugreifen, solange mindestens eine unbeanspruchte Schnittstelle.

Windows

Das Windows-Treibermodell stellt eine zusätzliche Anforderung dar. Im Gegensatz zur Plattformen über die Möglichkeit, ein USB-Gerät über eine Nutzeranwendung zu öffnen, auch wenn kein Treiber geladen ist. Stattdessen gibt es eine spezielle WinUSB-Treiber, der geladen werden muss, um die Schnittstelle Apps, mit denen auf das Gerät zugegriffen wird. Dies kann entweder mit einer benutzerdefinierten INF, die auf dem System installiert ist oder durch Ändern des Geräts für die Bereitstellung der Microsoft OS-Kompatibilitätsbeschreibungen Aufzählung.

Datei mit den Treiberinformationen (INF)

Eine Treiberinformationsdatei teilt Windows mit, was zu tun ist, wenn ein Gerät erkannt wird zum ersten Mal. Da das System des Nutzers bereits den WinUSB-Treiber enthält, Sie müssen lediglich die INF-Datei zur Verknüpfung mit Ihrem Anbieter und Ihrer Produkt-ID verwenden. mit dieser neuen Installationsregel. Die folgende Datei ist ein einfaches Beispiel. Speichern Sie es in einem mit der Erweiterung .inf, ändere die mit "X" gekennzeichneten Abschnitte und wähle dann nach rechts aus. klicke darauf und wähle „Installieren“ aus dem Kontextmenü.

[Version]
Signature   = "$Windows NT$"
Class       = USBDevice
ClassGUID   = {88BAE032-5A81-49f0-BC3D-A4FF138216D6}
Provider    = %ManufacturerName%
CatalogFile = WinUSBInstallation.cat
DriverVer   = 09/04/2012,13.54.20.543

; ========== Manufacturer/Models sections ===========

[Manufacturer]
%ManufacturerName% = Standard,NTx86,NTia64,NTamd64

[Standard.NTx86]
%USB\MyCustomDevice.DeviceDesc% = USB_Install,USB\VID_XXXX&PID_XXXX

[Standard.NTia64]
%USB\MyCustomDevice.DeviceDesc% = USB_Install,USB\VID_XXXX&PID_XXXX

[Standard.NTamd64]
%USB\MyCustomDevice.DeviceDesc% = USB_Install,USB\VID_XXXX&PID_XXXX

; ========== Class definition ===========

[ClassInstall32]
AddReg = ClassInstall_AddReg

[ClassInstall_AddReg]
HKR,,,,%ClassName%
HKR,,NoInstallClass,,1
HKR,,IconPath,%REG_MULTI_SZ%,"%systemroot%\system32\setupapi.dll,-20"
HKR,,LowerLogoVersion,,5.2

; =================== Installation ===================

[USB_Install]
Include = winusb.inf
Needs   = WINUSB.NT

[USB_Install.Services]
Include = winusb.inf
Needs   = WINUSB.NT.Services

[USB_Install.HW]
AddReg = Dev_AddReg

[Dev_AddReg]
HKR,,DeviceInterfaceGUIDs,0x10000,"{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}"

; =================== Strings ===================

[Strings]
ManufacturerName              = "Your Company Name Here"
ClassName                     = "Your Company Devices"
USB\MyCustomDevice.DeviceDesc = "Your Device Name Here"

Im Abschnitt [Dev_AddReg] werden die DeviceInterfaceGUIDs für die . Jede Geräteschnittstelle muss eine GUID haben, damit eine Anwendung und über die Windows API eine Verbindung herstellen. New-Guid-PowerShell verwenden Cmdlet oder einem Online-Tool, um eine zufällige GUID zu generieren.

Zu Entwicklungszwecken bietet das Zadig-Tool eine einfache Oberfläche für Ersetzen des für eine USB-Schnittstelle geladenen Treibers durch den WinUSB-Treiber

Kompatibilitätsdeskriptoren für Microsoft OS

Der obige Ansatz mit der INF-Datei ist umständlich, da er jedes Mal an das Gerät der Nutzer. Windows 8.1 und höher bietet eine Alternative mit benutzerdefinierten USB-Deskriptoren. Diese Schlagworte enthalten Informationen, an das Windows-Betriebssystem, wenn das Gerät zum ersten Mal angeschlossen wird, in der Regel in der INF-Datei enthalten.

Nachdem Sie die WebUSB-Deskriptoren eingerichtet haben, können Sie ganz einfach das Betriebssystem von Microsoft auch Kompatibilitätsdeskriptoren. Erweitern Sie zunächst den BOS-Deskriptor mit dieser Zusätzliche Beschreibung der Plattformfunktion. wTotalLength aktualisieren und bNumDeviceCaps, um dies zu berücksichtigen.

Wert Feld Beschreibung
Funktionsbeschreibung der Plattform für Microsoft OS 2.0
0x1C bLength Größe dieses Deskriptors
0x10 bDescriptorType Gerätefunktionsbeschreibung
0x05 bDevCapabilityType Beschreibung der Plattformfunktionen
0x00 bReserved
{0xDF, 0x60, 0xDD, 0xD8, 0x89, 0x45, 0xC7, 0x4C, 0x9C, 0xD2, 0x65, 0x9D, 0x9E, 0x64, 0x8A, 0x9F} PlatformCapablityUUID GUID des Microsoft OS 2.0-Plattformkompatibilitätsdeskriptors im Little-Endian-Format
0x06030000 dwWindowsVersion Mindestens kompatible Windows-Version (Windows 8.1)
0x00B2 wMSOSDescriptorSetTotalLength Gesamtlänge des Deskriptorsatzes
0x02 bMS_VendorCode bRequest-Wert zum Abrufen weiterer Microsoft-Deskriptoren
0x00 bAltEnumCode Gerät unterstützt keine alternative Aufzählung

Wie bei den WebUSB-Deskriptoren musst du einen bRequest-Wert auswählen, der von steuern die Übertragungen im Zusammenhang mit diesen Deskriptoren. In diesem Beispiel habe ich 0x02 0x07 (in wIndex) ist der Befehl zum Abrufen des Microsoft OS 2.0-Deskriptor-Set vom Gerät

bmRequestType bRequest wValue wIndex wLength Daten (Antwort)
0b11000000 0x02 0x0000 0x0007 * MS OS 2.0-Deskriptorsatz

USB-Geräte können mehrere Funktionen haben. Der erste Teil der Beschreibung Set beschreibt, welcher Funktion die folgenden Eigenschaften zugeordnet sind. Die Im folgenden Beispiel wird die Schnittstelle 1 eines zusammengesetzten Geräts konfiguriert. Die Beschreibung gibt Informationen zu den wichtigen Informationen des Betriebssystems. Das kompatible Die ID-Beschreibung teilt Windows mit, dass das Gerät mit WinUSB kompatibel ist. . Der Registry-Attributdeskriptor funktioniert ähnlich wie der [Dev_AddReg] des INF-Beispiels oben, wobei ein Registry-Attribut auf Weisen Sie dieser Funktion eine Geräteschnittstellen-GUID zu.

Wert Feld Beschreibung
Microsoft OS 2.0-Deskriptorsatz-Header
0x000A wLength Größe dieses Deskriptors
0x0000 wDescriptorType Header-Deskriptor für Deskriptorsatz
0x06030000 dwWindowsVersion Mindestens kompatible Windows-Version (Windows 8.1)
0x00B2 wTotalLength Gesamtlänge des Deskriptorsatzes
Header für Microsoft OS 2.0-Konfigurationsteil
0x0008 wLength Größe dieses Deskriptors
0x0001 wDescriptorType Headerbeschreibung für Teilbereich der Konfiguration.
0x00 bConfigurationValue Gilt für Konfiguration 1 (von 0 trotz Konfigurationen indexiert) normalerweise ab 1)
0x00 bReserved Muss auf 0 festgelegt sein
0x00A8 wTotalLength Gesamtlänge der Teilmenge, einschließlich dieses Headers
Header für Microsoft OS 2.0-Funktionsteilmenge
0x0008 wLength Größe dieses Deskriptors
0x0002 wDescriptorType Headerdeskriptor für Teilmenge der Funktion
0x01 bFirstInterface Erste Schnittstelle der Funktion
0x00 bReserved Muss auf 0 festgelegt sein
0x00A0 wSubsetLength Gesamtlänge der Teilmenge, einschließlich dieses Headers
Mit Microsoft OS 2.0 kompatibler ID-Deskriptor
0x0014 wLength Größe dieses Deskriptors
0x0003 wDescriptorType Kompatibler ID-Deskriptor
"WINUSB\0\0" CompatibileID ASCII-String auf 8 Byte aufgefüllt
"\0\0\0\0\0\0\0\0" SubCompatibleID ASCII-String auf 8 Byte aufgefüllt
Eigenschaftsdeskriptor der Microsoft OS 2.0-Registry
0x0084 wLength Größe dieses Deskriptors
0x0004 wDescriptorType Registry-Attributdeskriptor
0x0007 wPropertyDataType REG_MULTI_SZ
0x002A wPropertyNameLength Länge des Property-Namens
"DeviceInterfaceGUIDs\0" PropertyName Eigenschaftsname mit Null-Terminator in UTF-16LE codiert
0x0050 wPropertyDataLength Länge des Property-Werts
"{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}\0\0" PropertyData GUID plus zwei Nullterminatoren, codiert in UTF-16LE

Windows fragt das Gerät nur einmal nach diesen Informationen ab. Wenn das Gerät keine gültigen Beschreibungen enthält, wird beim nächsten Mal Gerät verbunden ist. Microsoft stellt eine Liste der Einträge, die die beim Auflisten eines Geräts erstellten Registrierungseinträge beschreiben Wann? Löschen der für ein Gerät erstellten Einträge, um Windows zum Lesen zu zwingen die Deskriptoren erneut.

Weitere Informationen zur Verwendung dieser Tools finden Sie im Blogpost von Microsoft. Beschreibungen.

Beispiele

Beispielcode für die Implementierung von WebUSB-fähigen Geräten, die sowohl WebUSB-fähige Geräte als auch und Microsoft OS-Deskriptoren finden Sie in diesen Projekten: