Windows における USB ContainerID

この記事では、Windows オペレーティング システムの USB ContainerID に関する情報を提供します。 これには、デバイス メーカーが Windows で正しく検出できるように多機能 USB デバイスをプログラムするためのガイドラインが含まれています。

ユーザーは、自分のコンピューターに接続されているデバイスのすべての機能を利用できます。 これには、プリンター、スキャナー、コピー機の組み合わせなどの多機能デバイスが含まれます。 Windows には、1 つの物理デバイスのすべての機能をデバイス コンテナーに統合するためのサポートが含まれています。 デバイス コンテナーは、物理デバイスの仮想表現です。 この統合は、物理デバイスに列挙される各デバイス関数に ContainerID プロパティを割り当てることで実現されます。 Windows では、各デバイス機能に同じ ContainerID 値を割り当てることで、すべてのデバイス機能が同じ物理デバイスに属していることを認識します。

さまざまな種類のバスを介してコンピューターに接続するすべての種類のデバイスで、デバイス コンテナーをサポートできます。 ただし、すべてのバスの種類で ContainerID を生成するために同じメカニズムが使用されるわけではありません。 USB デバイスの場合、デバイス ベンダーは ContainerID 記述子を使用して、物理デバイスの ContainerID を記述できます。 ContainerID 記述子は、USB デバイスのファームウェアに格納できる Microsoft OS 機能記述子です。 USB デバイスの製造元は、Windows で使用できる新しいデバイス機能を利用するために、これらの ContainerID 記述子をデバイスに正しく実装する必要があります。 USB デバイスの製造元は、デバイスでサポートされているデバイス機能の数に関係なく、物理デバイスごとに 1 つの ContainerID のみを実装する必要があります。

1 つのデバイスのすべての機能をデバイス コンテナーに統合する方法の詳細については、「コンテナー ID の生成方法」を参照してください。

USB デバイスの Microsoft OS 記述子の詳細については、「USBデバイスの Microsoft OS記述子」を参照してください。

USB ContainerID の生成方法

USB デバイスの ContainerID を生成するには、次の 2 つの方法があります。

  • USB デバイスの製造元は、Microsoft OS ContainerID 記述子を使用して、デバイスのファームウェアで ContainerID を指定します。
  • Microsoft USB ハブ ドライバーは、デバイスの製品 ID (PID)、ベンダー ID (VID)、リビジョン番号、シリアル番号の組み合わせから、デバイスの ContainerID を自動的に作成します。 このような状況では、Microsoft USB ハブ ドライバーは最小限の機能で ContainerID を作成します。 この方法は、一意のシリアル番号を持つデバイスにのみ適用されます。

USB ContainerID の内容

USB ContainerID は、ユニバーサル一意識別子 (UUID) 文字列の形式でオペレーティング システムに提示されます。 ContainerID UUID は、ContainerID 記述子内に含まれています。 ContainerID 記述子は、デバイス レベルの Microsoft OS 機能記述子です。 そのため、オペレーティング システムが USB ContainerID を要求する場合、記述子要求の wValue フィールドは常に 0 に設定する必要があります。 Microsoft OS 機能記述子と記述子要求の詳細については、「Microsoft OS 1.0 記述子の仕様」を参照してください。

ContainerID 記述子はヘッダー セクションで構成されます。

オフセット フィールド サイズ 説明
0 dwLength 4 符号なし DWord ContainerID 記述子全体の長さ (バイト単位)。 このフィールドは常に 0x18 の値に設定する必要があります。
4 bcdVersion 2 BCD ContainerID 記述子のバージョン番号 (バイナリ コード 10 進数 (BCD) 単位)。各ニブルは 1 桁に対応します。 最上位バイト (MSB) には小数点の前の 2 桁が含まれ、最下位バイト (LSB) には小数点の後の 2 桁が含まれます。 たとえば、バージョン 1.00 は 0x0100 として表されます。 このフィールドは常に 0x0100 に設定する必要があります。
6 wIndex 2 Word USB ContainerID 記述子の場合、このフィールドは常に 6 に設定されます。

ContainerID 記述子は ContainerID セクションで構成されます。

オフセット フィールド サイズ 説明
0 bContainerID 16 符号なし DWord ContainerID データ。

デバイスの製造元は、デバイスの各インスタンスが ContainerID に対してユニバーサルに一意の 16 バイト値を持っていることを確認する責任があります。 また、デバイスは、電源が入るたびに同じ ContainerID 値を報告する必要があります。 重複の可能性がほぼゼロで UUID を生成するための確立されたアルゴリズムがいくつかあります。 デバイスの製造元は、ニーズに最も適した UUID 生成アルゴリズムを選択できます。 結果が一意であれば、どの UUID 生成アルゴリズムが使用されても問題ありません。

USB ContainerID 構文

ContainerID は、{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx} の標準 UUID 文字列形式で報告されます。 {2CA7B40C-7BD1-4F25-B573-A13A975DDC07} UUID 文字列として書式設定された、0C B4 A7 2C D1 7B 25 4F B5 73 A1 3A 97 5D DC 07 USB ContainerID のファームウェア表現の例を次に示します。

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 文字列記述子の現在の定義には、通常 0 に設定されている記述子の末尾に 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 を使用する場合に、多機能プリンター内のすべてのデバイスを 1 つのデバイス コンテナーに統合する方法の例を示しています。

多機能プリンター内のすべてのデバイスの統合を示すデバイス マネージャーのスクリーンショット。

USB ContainerID HCK の要件

デバイスの製造元は、Windows が各 USB 多機能デバイスの機能を正常に統合できるように、生成するデバイスの各インスタンスにグローバルに一意の ContainerID 値があることを確認する必要があります。 Windows ハードウェア認定 Windows ハードウェア認定キットには、デバイスに実装されている場合、USB ContainerID の要件である DEVFUND-0034 が含まれています。 デバイスが USB ContainerID を実装している場合、Windows ハードウェア認定は、Microsoft OS 記述子テストの一部として ContainerID をテストし、ContainerID 値がグローバルに一意であるかどうかをチェックします。 これらの Windows ハードウェア認定要件の詳細については、Windows ハードウェア認定 Web サイトを参照してください。

USB ContainerID を実装するための推奨 USB デバイスを設計、製造、出荷するデバイス ベンダーに対する推奨事項は次のとおりです。

  • Windows で ContainerID を使用して多機能および複数のトランスポート USB デバイスのサポートを強化する方法について説明します。 最初に、「Windows の多機能デバイスのサポートとデバイス コンテナーのグループ化」を参照することをお勧めします。

  • 各 USB デバイスのシリアル番号が一意であることを確認します。 Windows ハードウェア認定要件では、デバイスにシリアル番号が含まれている場合、そのシリアル番号はデバイスのインスタンスごとに一意である必要があると規定されています。

  • システムに埋め込まれている USB デバイスの ContainerID を指定しないでください。 統合 USB デバイスは、ACPI BIOS 設定またはポートの USB ハブ記述子 DeviceRemovable ビットに依存する必要があります。

  • システムに接続されているすべての USB デバイスに一意の ContainerID 値があることを確認します。 製品ライン間で ContainerID 値または USB シリアル番号を共有しないでください。

  • デバイスのリムーバブル デバイス機能を正しく設定してください。

    Note

    USB ContainerID 記述子を以前に出荷された USB デバイスに追加するデバイス ベンダーは、デバイスのデバイス記述子のデバイス リリース番号 (bcdDevice) をインクリメントする必要があります。 これが必要なのは、USB ハブ ドライバーがデバイスのベンダー ID、製品 ID、およびデバイス リリース番号に基づいて Microsoft OS 文字列記述子 (または欠落している記述子) をキャッシュするためです。 デバイスのリリース番号をインクリメントしない場合、ハブ ドライバーは、以前に USB ContainerID 記述子をサポートしていない同じベンダー ID、製品 ID、デバイスリリース番号を持つデバイスのインスタンスを列挙した場合、新しいデバイスの USB ContainerID のクエリを実行しません。