この記事では、ユニバーサル シリアル バスの列挙プロセスについて説明します。
デバイスが Windows ベースのコンピューターに接続されている場合、Windows USB スタックはデバイスを列挙し、デバイスのインターフェイス記述子 (または記述子) を含む詳細をデバイスから抽出し、デバイスのハードウェア ID と互換性 ID のセットを生成します。
USB ハードウェア ID の完全な一覧については、「デバイスのインストール」の「デバイス識別文字列」セクションを参照してください。
次のセクションの例では、2 つのシナリオについて説明します。
- シングル インターフェイス USB デバイスの USB ID
- マルチ インターフェイス (複合) USB デバイスの USB ID
例 1: シングル インターフェイスの HID USB デバイス
この例では、Windows 2000 または Windows XP を実行しているシステム上のシングル インターフェイス USB デバイスに対して、ハードウェア ID と互換性 ID を生成する方法を示します。
デバイスが最初に USB スタックによって列挙されると、USBHUB ドライバーはデバイス記述子から idVendor、idProduct、および bcdDevice を抽出します。 これら 3 つのフィールドは、USB ハードウェア ID を生成するために組み込まれています。 ベンダー、デバイス、リビジョン番号は常に 16 進形式で格納されることに注意してください。
デバイスの互換性 ID の生成はより複雑になります。 クラス コード、サブクラス コード、およびプロトコル コードは、インターフェイス記述子の bInterfaceClass、bInterfaceSubClass、および bInterfaceProtocol によって決定されます。 これらの値は 2 桁の 16 進形式です。
注: INF を指定する場合、ハードウェア ID は、次の表の左側の列の太字の ID と一致する必要があります (右側の列に記載されている互換性 ID は使用しないでください)。
ハードウェア ID: 互換性 ID
USB\Vid_xxxx&Pid_yyyy&Rev_zzzz: USB\Class_aa&SubClass_bb&Prot_cc
USB\Vid_xxxx&Pid_yyyy: USB\Class_aa&SubClass_bb
****: USB\Class_aa
例 2: マルチ インターフェイス/機能の HID USB デバイス (複合デバイス)
複数の機能を持つ USB デバイスは複合デバイスと呼ばれます。 この例では、Windows 上の複合 USB デバイスに対してハードウェア ID と互換性 ID がどのように生成されるかを示します。 Windows を実行しているコンピューター システムに新しい USB 複合デバイスが接続されると、USBHUB ドライバーは物理デバイス オブジェクト (PDO) を作成し、その子デバイスのセットが変更されたことをオペレーティング システムに通知します。 システムは、新しい PDO に関連付けられているハードウェア ID をハブ ドライバーで照会した後で、適切な INF ファイルを検索して ID の一致を見つけます。 ベンダーがデバイス全体に対して 1 つのドライバーのみを読み込み (つまり複合デバイス ドライバーを使用しない)、そのドライバーを使用してソフトウェア内のすべてのインターフェイスを多重化する場合は、オペレーティング システムが下位ランクの一致 (USB\COMPOSITE) を取得しないようにハードウェア ID の一致を指定する必要があります。
注: INF を指定する場合、ハードウェア ID は、次の表の左側の列の太字の ID と一致する必要があります (右側の列に記載されている互換性 ID は使用しないでください)。
ハードウェア ID: 互換性 ID
USB\Vid_xxxx&Pid_yyyy&Rev_zzzz: USB\Class_aa&SubClass_bb&Prot_cc
USB\Vid_xxxx&Pid_yyyy: USB\Class_aa&SubClass_bb
****: USB\Class_aa
****: USB\COMPOSITE
ただし、ハードウェアの一致が見つからない場合、Windows プラグ アンド プレイは USB\COMPOSITE 識別子を使用して USB 汎用親ドライバー (USBCCGP) を読み込みます。 その後、汎用親ドライバーは、複合デバイスのインターフェイスごとに個別のハードウェア ID のセットを持つ個別の PDO のセット (インターフェイスごとに 1 つ) を作成します。 次のセクションでは、子 PDO のハードウェア ID の形式を示します。
各インターフェイスの PDO のハードウェア ID のセットを構築するために、USBCCGP ドライバーは、ハードウェア ID の末尾にインターフェイス番号 (0 から始まる 16 進数) を追加します。
クラス コード、サブクラス コード、およびプロトコル コードは、インターフェイス記述子の bInterfaceClass、bInterfaceSubClass、および bInterfaceProtocol フィールドによってそれぞれ決定されます。 これらの値は 2 桁の 16 進形式です。
注: ドライバーを読み込むため、またはわかりやすいデバイス名を指定するために INF を指定する場合、ハードウェア ID は、次の表の左側の列の太字の ID と一致する必要があります (右側の列に記載されている互換性 ID は使用しないでください)。
ハードウェア ID: 互換性 ID
USB\Vid_xxxx&Pid_yyyy&Rev_zzzz&MI_ww: USB\Class_aa&SubClass_bb&Prot_cc
USB\Vid_xxxx&Pid_yyyy&MI_ww: USB\Class_aa&SubClass_bb
****: USB\Class_aa