Windows 中的 USB ContainerID
本文提供 Windows 操作系統的 USB ContainerIDs 相關信息。 它包含裝置製造商規劃其多功能 USB 裝置的指導方針,讓 Windows 能夠正確偵測到它們。
使用者可以利用連線到電腦之裝置的所有功能。 這包括多功能裝置,例如組合印表機、掃描器裝置。 Windows 包含將單一實體裝置的所有功能合併到裝置容器的支援。 裝置容器是實體裝置的虛擬表示法。 藉由將 ContainerID 屬性指派給實體裝置列舉的每個裝置函式,可達成此匯總。 藉由將相同的 ContainerID 值指派給每個裝置函式,Windows 會辨識所有裝置功能都屬於相同的實體裝置。
透過不同總線類型連線到計算機的所有裝置類型都可以支援裝置容器。 不過,並非所有總線類型都使用相同的機制來產生 ContainerID。 針對USB裝置,裝置廠商可以使用 ContainerID 描述元來描述實體裝置的 ContainerID 。 ContainerID 描述元是Microsoft OS 功能描述元,可儲存在 USB 裝置的韌體中。 USB 裝置製造商必須在其裝置中正確實作這些 ContainerID 描述元,才能利用 Windows 中可用的新裝置功能。 不論裝置支援多少個裝置功能,USB 裝置製造商只需要為每個實體裝置實作單 一 ContainerID 。
如需將單一裝置的所有功能合併到裝置容器的詳細資訊,請參閱 容器標識碼的產生方式。
如需USB裝置Microsoft OS描述元的詳細資訊,請參閱 Microsoft USB 裝置的OS描述元。
如何產生USB ContainerID
以下是為 USB 裝置產生 ContainerID 的兩種方式:
- USB 裝置的製造商會使用Microsoft OS ContainerID 描述元,指定裝置韌體中的 ContainerID。
- Microsoft USB 中樞驅動程式會自動從裝置的產品標識碼(PID)、廠商標識碼(VID)、修訂編號和序號的組合,為裝置建立 ContainerID 。 在此情況下,Microsoft USB 中樞驅動程式會 建立具有最少功能的 ContainerID 。 這個方法僅適用於具有唯一序號的裝置。
USB ContainerID 內容
USB ContainerID 會以通用唯一標識碼 (UUID) 字串的形式呈現給操作系統。 ContainerID UUID 包含在 ContainerID 描述元內。 ContainerID 描述元是裝置層級Microsoft OS 功能描述元。 因此,當操作系統要求USB ContainerID時,描述元要求的 wValue 欄位必須一律設定為零。 如需Microsoft OS 功能描述項和描述元要求的詳細資訊,請參閱 Microsoft OS 1.0 描述項規格。
ContainerID 描述元是由標頭區段所組成。
Offset | 欄位 | 大小 | 類型 | 描述 |
---|---|---|---|---|
0 | dwLength | 4 | 未簽署的 DWord | 整個 ContainerID 描述元的長度,以位元組為單位。 此欄位必須一律設定為 0x18 的值。 |
4 | bcdVersion | 2 | BCD | ContainerID 描述元的版本號碼,以二進位編碼十進位 (BCD),其中每個小數字數對應到一個數位。 最重要的位元組 (MSB) 包含小數點之前的兩位數,而最小有效位元組 (LSB) 則包含小數點後面的兩位數。 例如,1.00 版會以0x0100表示。 此欄位必須一律設定為 0x0100。 |
6 | wIndex | 2 | Word | 此欄位一律會針對 USB ContainerID 描述項設定為 6。 |
ContainerID 描述元是由 ContainerID 區段所組成。
Offset | 欄位 | 大小 | 類型 | 描述 |
---|---|---|---|---|
0 | bContainerID | 16 | 未簽署的 DWord | ContainerID 數據。 |
裝置製造商負責確保裝置的每個實例都有 ContainerID 的通用唯一 16 位元組值。 此外,裝置必須在每次開啟電源時報告相同的 ContainerID 值。 有數個已建立的演算法可用來產生幾乎零重複的 UUID。 裝置製造商可以選取最符合其需求的 UUID 產生演算法。 只要結果是唯一的,就不會使用哪一種 UUID 產生演算法。
USB ContainerID 語法
容器標識符是以 {xxxxxxxx-xxxx-xxxx-xxxx-xxx} 的標準 UUID 字串格式回報。 以下是 0C B4 A7 2C D1 7B 25 4F B5 73 A1 3A 97 5D DC 07 USB ContainerID 的範例表示法,格式為 {2CA7B40C-7BD1-4F25-B573-A13A975DDC07} UUID 字符串。
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 //
}
請注意,當前8個字節格式化為 UUID 字串時,其位元組順序變更。
Microsoft OS 描述元變更
為了保留舊版 ContainerID 功能,Microsoft OS 字串描述元包含旗標字段,可用來指出 ContainerID 描述元的支援。
Microsoft OS 字串描述元的目前定義包含 1 位元組板欄位 bPad,通常設定為零的描述項結尾。 對於支援新 ContainerID 的 USB 裝置, bPad 欄位會重新定義為旗標欄位 bFlags。 此欄位的位 1 用來表示對 ContainerID 描述元的支援。 表 3 描述 USB 裝置Microsoft OS 字串描述元的欄位。
欄位 | 長度(位元組) | 值 | Description |
---|---|---|---|
bLength | 1 | 0x12 | 描述項的長度。 |
bDescriptorType | 1 | 0x03 | 描述項類型。 0x03 的值表示Microsoft OS 字串描述元。 |
qwSignature | 14 | 'MSFT100' | 簽章欄位。 |
bMS_VendorCode | 1 | 廠商程序代碼 | 廠商程序代碼。 |
bFlags | 1 | 0x02 | 位 0:保留 位 1: ContainerID 支援 0:不支援 ContainerID 1:支援 ContainerID 位 2–7:保留 |
目前寄送的 USB 裝置支援Microsoft OS 描述元,但不支援 ContainerID 描述元,其 bPad 字段已設定為 0x00。 USB 中樞驅動程式不會查詢這類裝置的USB ContainerID 描述元。
USB 多功能裝置的容器檢視
ContainerID 提供資訊來合併多功能 USB 裝置的裝置。 圖 1 顯示當產品中的所有個別裝置使用相同的 ContainerID 時,多功能印表機中的所有裝置如何合併成單一裝置容器的範例。
USB ContainerID HCK 需求
裝置製造商必須確保其產生的每一個裝置實例都有全域唯 一的 ContainerID 值,讓 Windows 可以成功合併每個 USB 多功能裝置的功能。 Windows 硬體認證Windows 硬體認證套件包含在裝置中實作 USB ContainerID 的需求 DEVFUND-0034。 如果裝置實作 USB ContainerID,Windows 硬體認證會測試 ContainerID 作為Microsoft OS 描述元測試的一部分,並檢查 ContainerID 值是否全域是唯一的。 如需這些 Windows 硬體認證需求的詳細資訊,請參閱 Windows 硬體認證網站。
實作 USB ContainerID 的建議:以下是設計、製造及運送 USB 裝置的裝置廠商的建議:
瞭解 Windows 如何使用 ContainerID 改善多功能和多個傳輸 USB 裝置的支援。 建議您從閱讀「Windows 中的多功能裝置支援和裝置容器群組」開始。
請確定每個 USB 裝置上的序號是唯一的。 Windows 硬體認證需求指出,如果您的裝置包含序號,則每個裝置實例的序號都必須是唯一的。
請勿為內嵌在系統中的USB裝置提供 ContainerID 。 整合式 USB 裝置應該依賴 ACPI BIOS 設定或埠的 USB 中樞描述元 DeviceRemovable 位。
確定連接至系統的所有 USB 裝置都有唯 一的 ContainerID 值。 請勿在產品線之間共用 ContainerID 值或 USB 序號。
請務必為裝置正確設定抽取式裝置功能。
注意
將USB ContainerID描述元新增至先前寄送USB裝置的裝置廠商,必須在裝置的裝置描述元中遞增裝置發行編號(bcdDevice)。 這是必要的,因為 USB 中樞驅動程式會根據裝置的廠商標識碼、產品標識碼和裝置發行號碼,快取Microsoft OS 字串描述元(或缺少一個標識符)。 如果您未遞增裝置發行號碼,如果中樞驅動程式先前列舉了具有相同廠商標識碼、產品標識碼及不支援 USB ContainerID 描述元的裝置實例,中樞驅動程式就不會查詢新裝置的 USB ContainerID。