ユニバーサル シリアル バス (USB) を介してコンピューターに接続されているデバイスの場合、次のフローチャートは、コンテナー ID を USB デバイス ノード (devnode) に割り当てるために使用されるヒューリスティックを示しています。
このヒューリスティックでは、いくつかのソースからの情報を使用して、USB 開発ノードについて次のいずれかが当てはまるかどうかを判断します。
デバイスノードは USB バス上の新しいデバイスを表していますか? これが true の場合、devnode は新しいコンテナー ID を受け取ります。
devnode は既存デバイスの子デバイスですか? これが true の場合、devnode は親 devnode のコンテナー ID を継承します。
USB デバイスのコンテナー ID は、いくつかの方法で生成されます。 この決定は、デバイスに含まれる情報に基づいています。 この情報は、ACPI 設定、USB バス ドライバー、USB ハブから取得されます。
このヒューリスティックは、プラグ アンド プレイ (PnP) マネージャーが USB バスで列挙する開発ノードごとに、次の手順に従います。
USB バス ドライバーによって照会されると、USB デバイスは Microsoft オペレーティング システム (OS) ContainerID 記述子を介してコンテナー ID を報告できます。
Windows 7 以降、オペレーティング システムは Microsoft OS ContainerID 記述子をサポートしています。 この記述子を使用して、独立系ハードウェア ベンダー (IHV) は、デバイスのコンテナー ID を正確に指定できます。 そのため、デバイスのコンテナー ID は一意であり、デバイスがインストールされているすべてのコンピューターで変更されることはありません。 また、Microsoft OS ContainerID 記述子を報告する場合、列挙されたすべての開発ノードが同じ物理デバイスの一部であることをオペレーティング システムに示します。
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」を参照してください。