Windows 中的 USB ContainerID
本檔提供適用于 Windows 作業系統的 USB ContainerID的相關資訊。 它包含裝置製造商規劃其多功能 USB 裝置的指導方針,讓 Windows 可以正確偵測它們。
從 Windows 7 開始,使用者可以利用連線到其電腦之裝置的所有功能。 這包括多功能裝置,例如組合印表機、掃描器和複製器裝置。 Windows 7 支援將單一實體裝置的所有功能合併到裝置容器。 裝置容器是實體裝置的虛擬標記法。 將 ContainerID 屬性指派給實體裝置列舉的每個裝置函式,可達成此匯總。 藉由將相同的 ContainerID 值指派給每個裝置函式,Windows 7 會辨識所有裝置函式都屬於相同的實體裝置。
透過不同匯流排類型連線到電腦的所有裝置類型都可以支援裝置容器。 不過,並非所有匯流排類型都使用相同的機制來產生 ContainerID。 針對 USB 裝置,裝置廠商可以使用 ContainerID 描述元來描述實體裝置的 ContainerID 。 ContainerID描述元是 Microsoft OS 功能描述元,可儲存在 USB 裝置的韌體中。 USB 裝置製造商必須在其裝置中正確實作這些 ContainerID 描述元,以利用 Windows 7 中可用的新裝置功能。 不論裝置支援多少裝置功能,USB 裝置製造商只需要為每個實體裝置實作單一 ContainerID 。
如需將單一裝置的所有功能合併到裝置容器的詳細資訊,請參閱 如何產生容器識別碼。
如需適用于 USB 裝置的 Microsoft OS 描述項的詳細資訊,請參閱 適用于 USB 裝置的 Microsoft 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) ,其中每個 Nibble 都會對應至數位。 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-xxxxxx} 的標準 UUID 字串格式報告 ContainerID 。 以下是 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 //
}
請注意,格式化為 UUID 字串時,前 8 個位元組的位元組順序變更。
Microsoft OS 描述元變更
為了保留舊版 ContainerID 功能,新的旗標欄位已新增至 Microsoft OS 字串描述元,可用來指出 ContainerID 描述元的支援。
Microsoft OS 字串描述元目前的定義包含一個 1 位元組板欄位 bPad,其描述項的結尾通常會設定為零。 對於支援新 ContainerID的 USB 裝置, bPad 欄位會重新定義為旗標欄位 bFlags。 此欄位的位 1 用來指出 ContainerID 描述元的支援。 表 3 描述 USB 裝置的 Microsoft OS 字串描述項欄位。
欄位 | ) 長度 (位元組 | 值 | 描述 |
---|---|---|---|
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:保留 |
目前寄送支援 Microsoft OS 描述元但不支援 ContainerID 描述元的 USB 裝置,其 bPad 欄位已設定為 0x00。 USB 中樞驅動程式不會查詢這類裝置是否有 USB ContainerID 描述元。
USB 多重功能裝置的容器檢視
ContainerID提供資訊來合併多功能 USB 裝置的裝置。 圖 1 顯示當產品內的所有個別裝置使用相同的 ContainerID時,多重功能印表機中的所有裝置如何合併成單一裝置容器的範例。
藉由合併多功能 USB 裝置的所有裝置,實體產品可以在 Windows 7 的裝置和印表機中顯示為單一裝置。 圖 2 顯示 USB 多重功能鍵盤和滑鼠裝置的範例,該裝置在裝置和印表機中顯示為單一裝置。
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 7 如何透過 使用 ContainerID來改善多重功能和多個傳輸 USB 裝置的支援。 建議您從閱讀 Windows 7 中的「多重功能裝置支援與裝置容器群組」開始。
- 請確定每個 USB 裝置上的序號是唯一的。 Windows 硬體認證需求指出,如果您的裝置包含序號,則每個裝置實例的序號都必須是唯一的。
- 請勿為內嵌在系統中的 USB 裝置提供 ContainerID 。 整合式 USB 裝置應該依賴 ACPI BIOS 設定或埠的 USB 中樞描述元 DeviceRemovable 位。
- 確定連接至系統的所有 USB 裝置都有唯一的 ContainerID 值。 請勿在產品行之間共用 ContainerID 值或 USB 序號。
- 請務必為您的裝置正確設定抽取式裝置功能。 注意 將 USB ContainerID 描述元新增至先前寄送 USB 裝置的裝置廠商必須遞增裝置發行號碼, (bcdDevice) 裝置的裝置描述元。 這是必要的,因為 USB 中樞驅動程式會根據裝置的廠商識別碼、產品識別碼和裝置版本號碼,快取 Microsoft OS 字串描述元 (或缺少一個) 。 如果您未遞增裝置發行號碼,如果中樞驅動程式先前列舉了相同廠商識別碼、產品識別碼和不支援 USB ContainerID 描述元的裝置實例,中樞驅動程式就不會查詢新裝置的 USB ContainerID 。