USB デバイスへのコンテナー ID の割り当て方法
ユニバーサル シリアル バス (USB) を介してコンピューターに接続されているデバイスの場合、次のフローチャートは、コンテナー ID を USB デバイス ノード (devnode) に割り当てるために使用されるヒューリスティックを示しています。
このヒューリスティックでは、いくつかのソースからの情報を使用して、USB 開発ノードについて次のいずれかが当てはまるかどうかを判断します。
開発ノードは USB バス上の新しいデバイスを表していますか? これが true の場合、devnode は新しいコンテナー ID を受け取ります。
devnode は既存のデバイスの子 devnode ですか? これが true の場合、devnode は親 devnode のコンテナー ID を継承します。
USB デバイスのコンテナー ID は、いくつかの方法で生成されます。 この決定は、デバイスに含まれる情報に基づいています。 この情報は、ACPI 設定、USB バス ドライバー、USB ハブから取得されます。
このヒューリスティックは、プラグ アンド プレイ (PnP) マネージャーが USB バス上で列挙する各 devnode の手順に従います。
USB バス ドライバーによって照会されると、USB デバイスは Microsoft オペレーティング システム (OS) ContainerID 記述子を介してコンテナー ID を報告できます。
Windows 7 以降、オペレーティング システムは Microsoft OS ContainerID 記述子をサポートしています。 この記述子を使用して、独立系ハードウェア ベンダー (IHV) は、デバイスのコンテナー ID を正確に指定できます。 そのため、デバイスのコンテナー ID は一意であり、デバイスがインストールされているすべてのコンピューターで変更されることはありません。 また、Microsoft OS ContainerID 記述子を報告する場合、デバイスは、列挙されたすべての devnode が同じ物理デバイスの一部であることをオペレーティング システムに示します。
Microsoft OS ContainerID 記述子は、複数のシステム バスを介したデバイスの同時接続をサポートするデバイスで使用することを目的としています。 たとえば、プリンターは、プラグ アンド プレイ拡張機能 (PnP-X) を使用して同時 USB および IP ネットワーク接続をサポートできます。 1 つの Microsoft OS ContainerID 記述子を使用すると、両方のトランスポートで同じコンテナー ID が報告されます。 そのため、PnP マネージャーは、各バスによって列挙された devnode が同じ物理デバイスの一部であると判断します。
Microsoft OS ContainerID 記述子の詳細については、Microsoft OS 記述子を参照してください。
USB デバイスが Microsoft OS ContainerID 記述子を報告しない場合、USB ハブ ドライバーは ACPI を照会して、デバイスが外部接続ポートに接続されているかどうかを判断します。
オペレーティング システムは、デバイスが接続されている USB ポートのアドレスと一致する ACPI アドレス (_ADR) オブジェクトの検索を試みます。 一致するアドレス オブジェクトが見つかった場合、オペレーティング システムは次の手順を実行します。
USB ポート機能 (_UPC) オブジェクトに対してクエリが実行され、PortIsConnectable 値がチェックされます。 PortIsConnectable の値が 0 以外の0xFFの場合は、ポートを使用して外部デバイスを接続できます。 したがって、このポートに接続されているすべてのデバイスは、コンピューターの外部にある必要があります。
コンピューターが ACPI 3.0 を実装し、PortIsConnectable バイトが 0 以外の場合、オペレーティング システムは物理場所の説明 (_PLD) オブジェクトに対してさらにクエリを実行します。 オペレーティング システムは、userVisible ビット (ビット 64) が _PLD オブジェクトに設定されているかどうかを確認します。 これは追加のチェックとして行われ、ポートが接続可能で外部からユーザーに表示されるようにします。
ACPI から収集された情報がデバイスが外部にあることを示している場合、PnP マネージャーはデバイスのコンテナー ID を生成します。 ContainedID 値は、デバイスの USB シリアル番号のハッシュか、ランダムに生成された値のいずれかです。 devnode には、このコンテナー ID が割り当てられます。
メモ: オペレーティング システムがデバイスがコンピューターの内部にあると判断した場合、devnode は親 devnode のコンテナー ID を継承します。この場合、これはコンピューター自体のコンテナー ID です。
ACPI から、デバイスが接続されている USB ポート アドレスと一致する _ADR オブジェクトが返されない場合、PnP マネージャーは devnode のリムーバブル状態に基づいてコンテナー ID を生成します。
USB ハブ ドライバーは、ハブから USB RemoveAndPowerMask 記述子に対してクエリを実行し、デバイスが接続されているポートに DeviceRemovable ビットが設定されているかどうかを確認します。 DeviceRemovable ビットが設定されている場合、ポートに接続されているデバイスはハブからリムーバブルになります。 DeviceRemovable ビットが設定されていない場合、ポートに接続されているデバイスはハブから取り外しできません。
USB バス ドライバーは、ポートのリムーバブル/リムーバブルではない状態を PnP マネージャーに報告します。これにより、次の手順で devnode の ContainerId が生成されます。
ハブが特定のポートに接続されているデバイスがハブからリムーバブルであることを示す場合、PnP マネージャーは、このポートに接続されているデバイスがコンピューターの外部にあると判断します。 devnode 用に生成されるコンテナー ID は、デバイスの USB シリアル番号のハッシュであるか、ランダムに生成された値です。
ハブが特定のポートに接続されているデバイスがハブからリムーバブルではないことを示す場合、PnP マネージャーは、このポートに接続されているデバイスが多機能デバイスのサブ機能であると判断します。 この場合、devnode は親 devnode のコンテナー ID を継承します。
ACPI 3.0 インターフェイスの詳細については、Advanced Configuration and Power Interface Specification Revision 3.0b を参照してください。