USB-ContainerIDs in Windows
Dieser Artikel enthält Informationen zu USB-ContainerIDs für das Windows-Betriebssystem. Er enthält Richtlinien für Gerätehersteller zum Programmieren ihrer Multifunktions-USB-Geräte, damit diese von Windows richtig erkannt werden.
Benutzer können alle Funktionen der Geräte nutzen, die an ihren Computer angeschlossen sind. Dazu gehören Multifunktionsgeräte, z. B. ein Kombinationsdrucker, Scanner und Kopiergerät. Windows bietet Unterstützung für die Konsolidierung aller Funktionen eines einzelnen physischen Geräts in einem Gerätecontainer. Ein Gerätecontainer ist eine virtuelle Darstellung des physischen Geräts. Diese Konsolidierung wird durch Zuweisen einer ContainerID-Eigenschaft zu jeder Gerätefunktion erreicht, die für das physische Gerät aufgezählt wird. Durch Zuweisen desselben ContainerID-Werts zu jeder Gerätefunktion erkennt Windows, dass alle Gerätefunktionen zum gleichen physischen Gerät gehören.
Alle Gerätetypen, die über verschiedene Bustypen eine Verbindung mit einem Computer herstellen, können Gerätecontainer unterstützen. Nicht alle Bustypen verwenden jedoch denselben Mechanismus zum Generieren einer ContainerID. Für USB-Geräte können Gerätehersteller einen ContainerID-Deskriptor verwenden, um die ContainerID für ein physisches Gerät zu beschreiben. Ein ContainerID-Deskriptor ist ein Microsoft OS-Featuredeskriptor, der in der Firmware des USB-Geräts gespeichert werden kann. USB-Gerätehersteller müssen diese ContainerID-Deskriptoren ordnungsgemäß auf ihren Geräten implementieren, um die neuen Gerätefunktionen zu nutzen, die in Windows verfügbar sind. USB-Gerätehersteller müssen nur eine einzelne ContainerID für jedes physische Gerät implementieren, unabhängig davon, wie viele Gerätefunktionen vom Gerät unterstützt werden.
Weitere Informationen zum Konsolidieren aller Funktionen eines einzelnen Geräts in einem Gerätecontainer finden Sie unter So werden Container-IDs generiert.
Weitere Informationen zu Microsoft-Betriebssystemdeskriptoren für USB-Geräte finden Sie unter Microsoft-Betriebssystemdeskriptoren für USB-Geräte.
So wird eine USB-ContainerID generiert
Im Folgenden finden Sie zwei Möglichkeiten zum Generieren einer ContainerID für ein USB-Gerät:
- Der Hersteller des USB-Geräts gibt die ContainerID in der Firmware des Geräts mithilfe eines Microsoft-Betriebssystem-ContainerID-Deskriptors an.
- Der Microsoft USB-Hubtreiber erstellt automatisch eine ContainerID für das Gerät aus der Kombination der Produkt-ID (PID), der Hersteller-ID (VID), der Revisionsnummer und der Seriennummer des Geräts. In diesem Fall erstellt der Microsoft USB-Hubtreiber eine ContainerID mit minimaler Funktionalität. Diese Methode gilt nur für Geräte mit einer eindeutigen Seriennummer.
USB-ContainerID-Inhalt
Dem Betriebssystem wird eine USB-ContainerID in Form einer UUID-Zeichenfolge (Universally Unique Identifier) angezeigt. Die ContainerID UUID ist in einem ContainerID-Deskriptor enthalten. Ein ContainerID-Deskriptor ist ein Funktionsdeskriptor des Microsoft-Betriebssystems auf Geräteebene. Wenn das Betriebssystem eine USB-ContainerID anfordert, muss das wValue-Feld der Deskriptoranforderung immer auf Null festgelegt werden. Weitere Informationen zu Microsoft OS-Funktionsdeskriptoren und Deskriptoranforderungen finden Sie unter Microsoft OS 1.0-Deskriptorspezifikation.
Ein ContainerID-Deskriptor besteht aus einem Headerabschnitt.
Abweichung | Feld | Größe | Typ | Beschreibung |
---|---|---|---|---|
0 | dwLength | 4 | Nicht signiertes DWord | Die Länge des gesamten ContainerID-Deskriptors (in Bytes). Dieses Feld muss immer auf einen Wert von 0x18 festgelegt werden. |
4 | bcdVersion | 2 | BCD | Die Versionsnummer des ContainerID-Deskriptors in binärcodierter Dezimalzahl (BCD), wobei jedes Halbbyte einer Ziffer entspricht. Das höchstwertige Byte (MSB) enthält die beiden Ziffern vor dem Dezimalpunkt und das niedrigstwertige Byte (LSB) enthält die beiden Ziffern nach dem Dezimalpunkt. Als Beispiel wird Version 1.00 als 0x0100 dargestellt. Dieses Feld muss immer auf 0x0100 gesetzt werden. |
6 | wIndex | 2 | Word | Dieses Feld ist immer auf 6 für USB-ContainerID-Deskriptoren festgelegt. |
Ein ContainerID-Deskriptor besteht aus einem ContainerID-Abschnitt.
Abweichung | Feld | Größe | Typ | Beschreibung |
---|---|---|---|---|
0 | bContainerID | 16 | Nicht signiertes DWord | ContainerID-Daten. |
Gerätehersteller sind dafür verantwortlich, dass jede Instanz eines Gerätes einen universell eindeutigen 16-Byte-Wert für die ContainerID aufweist. Außerdem muss ein Gerät den gleichen ContainerID-Wert bei jedem Einschalten verwenden. Es gibt mehrere etablierte Algorithmen zum Generieren von UUIDs mit nahezu null Wahrscheinlichkeit einer Duplizierung. Gerätehersteller können den UUID-Generierungsalgorithmus auswählen, der ihren Anforderungen am besten entspricht. Es spielt keine Rolle, welcher UUID-Generierungsalgorithmus verwendet wird, solange das Ergebnis eindeutig ist.
USB-ContainerID-Syntax
Eine ContainerID wird im standardmäßigen UUID-Zeichenfolgenformat von {xx-xxxx-xxxx-xxxx-xxxx} gemeldet. Es folgt eine Beispieldarstellung in der Firmware für eine 0C B4 A7 2C D1 7B 25 4F B5 73 A1 3A 97 5D DC 07 USB-ContainerID, die als UUID-Zeichenfolge {2CA7B40C-7BD1-4F25-B573-A13A975DDC07} formatiert ist.
UCHAR ExampleContainerIDDescriptor[24] =
{
0x18, 0x00, 0x00, 0x00, // dwLength - 24 bytes
0x00, 0x01, // bcdVersion - 1.00
0x06, 0x00, // wIndex – 6 for a ContainerID
0x0C, 0xB4, 0xA7, 0x2C, // bContainerID -
0xD1, 0x7B, 0x25, 0x4F, // {2CA7B40C-7BD1-4F25-B573-A13A975DDC07}
0xB5, 0x73, 0xA1, 0x3A, // 0C B4 A7 2C D1 7B 25 4F B5 73 A1 3A 97 5D DC 07
0x97, 0x5D, 0xDC, 0x07 //
}
Beachten Sie die Änderung in der Bytereihenfolge der ersten 8 Bytes, wenn es als UUID-Zeichenfolge formatiert ist.
Änderungen am Microsoft-Betriebssystemdeskriptor
Um die ContainerID-Legacy-Funktionalität beizubehalten, enthält der Microsoft-Betriebssystem-Zeichenfolgendeskriptor ein Flags-Feld, das verwendet werden kann, um die Unterstützung für den ContainerID-Deskriptor anzugeben.
Die aktuelle Definition des Microsoft-Betriebssystem-Zeichenfolgendeskriptors enthält ein 1-Byte-Pad-Feld (bPad) am Ende des Deskriptors, das normalerweise auf Null festgelegt ist. Für USB-Geräte, die die neue ContainerID unterstützen, wird das bPad-Feld als Flags-Feld bFlags neu definiert. Bit 1 dieses Felds wird verwendet, um die Unterstützung für den ContainerID-Deskriptor anzugeben. Tabelle 3 beschreibt die Felder des Microsoft-Betriebssystem-Zeichenfolgendeskriptors für USB-Geräte.
Feld | Länge (@bytes) | Wert | Beschreibung |
---|---|---|---|
bLength | 1 | 0x12 | Länge des Deskriptors. |
bDescriptorType | 1 | 0x03 | Deskriptortyp. Ein Wert von 0x03 gibt einen Microsoft-Betriebssystem-Zeichenfolgendeskriptor an. |
qwSignature | 14 | „MSFT100“ | Signaturfeld. |
bMS_VendorCode | 1 | Lieferanten-Code | Lieferanten-Code. |
bFlags | 1 | 0x02 | Bit 0: Reserviert Bit 1: ContainerID-Unterstützung 0: Unterstützt ContainerID nicht 1: Unterstützt ContainerID Bits 2–7: Reserviert |
Derzeit ist bei USB-Geräten, die den Microsoft-Betriebssystem-Deskriptor unterstützen, jedoch nicht den ContainerID-Deskriptor, das bPad-Feld auf 0x00 festgelegt. Der USB-Hubtreiber fragt solche Geräte nicht für den USB-ContainerID ab.
Containeransicht eines USB-Multifunktionsgeräts
Die ContainerID enthält Informationen zum Konsolidieren von Geräten für Multifunktions-USB-Geräte. Abbildung 1 zeigt ein Beispiel, wie alle Geräte in einem Multifunktionsdrucker in einem einzigen Gerätecontainer konsolidiert werden, wenn alle einzelnen Geräte innerhalb des Produkts dieselbe ContainerID verwenden.
USB ContainerID HCK-Anforderungen
Gerätehersteller müssen sicherstellen, dass jede Instanz eines Geräts, das sie produzieren, über einen global eindeutigen ContainerID-Wert verfügt, damit Windows die Funktionalität jedes USB-Multifunktionsgeräts erfolgreich konsolidieren kann. Das Hardware-Zertifizierungskit für Windows-Hardware umfasst eine Anforderung DEVFUND-0034 für eine USB-ContainerID, wenn sie auf einem Gerät implementiert ist. Wenn ein Gerät eine USB-ContainerID implementiert, testet die Windows-Hardwarezertifizerung die ContainerID als Teil der Microsoft-Betriebssystem-Deskriptor-Tests und prüft, ob der ContainerID-Wert global eindeutig ist. Weitere Informationen zu diesen Windows-Hardwarezertifizierungsanforderungen finden Sie auf der Website zur Windows-Hardwarezertifizierung.
Empfehlungen für die Implementierung einer USB-ContainerID. Im Folgenden finden Sie Empfehlungen für Gerätehersteller, die USB-Geräte entwickeln, herstellen und ausliefern:
Erfahren Sie, wie Windows die Unterstützung für Multifunktions- und Mehrfachtransport-USB-Geräte verbessert, indem eine ContainerID verwendet wird. Wir empfehlen Ihnen, zunächst „Multifunktionsgeräte-Unterstützung und Gerätecontainer-Gruppierungen in Windows“ zu lesen.
Stellen Sie sicher, dass die Seriennummer auf jedem USB-Gerät eindeutig ist. Eine Anforderung der Windows-Hardwarezertifizierung besagt, dass (sofern Ihr Gerät eine Seriennummer hat) die Seriennummer für jede Instanz Ihres Geräts eindeutig sein muss.
Stellen Sie keine ContainerID für ein USB-Gerät bereit, das in ein System eingebettet ist. Integrierte USB-Geräte sollten sich auf ACPI-BIOS-Einstellungen oder das DeviceRemovable-Bit des USB-Hubdeskriptors für den Port verlassen.
Stellen Sie sicher, dass alle USB-Geräte, die an ein System angeschlossen sind, eindeutige ContainerID-Werte aufweisen. Teilen Sie keine ContainerID-Werte oder USB-Seriennummern über Ihre Produktlinien hinweg.
Stellen Sie sicher, dass Sie die Wechselgerätefunktion für Ihr Gerät ordnungsgemäß festlegen.
Hinweis
Gerätehersteller, die einem zuvor ausgelieferten USB-Gerät einen ContainerID-Deskriptor hinzufügen, müssen die Gerätefreigabenummer (bcdDevice) im Gerätedeskriptor erhöhen. Dies ist erforderlich, da der USB-Hub-Treiber den Zeichenfolgendeskriptor des Microsoft-Betriebssystems (oder das Fehlen eines solchen) basierend auf der Hersteller-ID, der Produkt-ID und der Geräteversionsnummer eines Geräts zwischenspeichert. Wenn Sie die Geräteversionsnummer nicht erhöhen, fragt der Hubtreiber nicht die USB-ContainerID eines neuen Geräts ab, wenn er zuvor eine Instanz des Geräts mit derselben Hersteller-ID, Produkt-ID und Geräteversionsnummer aufgezählt hat, die den USB-ContainerID-Deskriptor nicht unterstützt hat.