Share via


コンテナー ID の概要

オペレーティング システムの Windows ファミリでは、デバイスは基本的に機能デバイス インスタンスのコレクションであり、それぞれがデバイスへの何らかの形式の通信を可能にする機能エンドポイントを表します。

デバイス ノード (devnode) という用語は、エンドポイントとそれに関連付けられている状態を記述するプロパティに加えて、このような機能エンドポイントのドライバー スタックを指します。 たとえば、プリンター、スキャナー、FAX の機能をサポートする多機能デバイスには、デバイスの機能エンドポイントごとに 1 つずつ、複数の devnode を含めることができます。

Windows 7 以前の各機能エンドポイントには、それに関連付けられた devnode がありました。 Windows プラットフォーム コンポーネントとサード パーティ製アプリケーションは、デバイスの状態と情報について devnode に対してクエリを実行でき、機能エンドポイントが公開するインターフェイスを使用してデバイス ハードウェアと通信できます。

単一機能デバイスの場合、1 つの devnode には、デバイスの機能エンドポイントに関連するすべての情報が含まれます。 同様に、多機能デバイスには、各デバイスの機能エンドポイントに関連付けられている複数の devnode があります。 ただし、Windows では、debnode のグループが同じ物理デバイスから発生したことを認識できません。 同じ多機能デバイスに属する各 devnode には、プラグ アンド プレイ (PnP) マネージャーが複数の devnode を 1 つのデバイスとしてグループ化できるようにする識別情報は含まれません。 そのため、1 つの物理デバイスが提供するデバイスと機能の全体像を把握することはできません。

Windows 7 以降では、オペレーティング システムは新しい ID (コンテナー ID) を使用して、特定の物理デバイスの各インスタンスから生成され、各インスタンスに属する 1 つ以上の devnode をグループ化します。 コンテナー ID は、すべての devnode のプロパティであり、グローバル一意識別子 (GUID) 値を使用して指定されます。

コンピューターにインストールされている物理デバイスの各インスタンスには、一意のコンテナー ID があります。 物理デバイスのそのインスタンス上の関数を表すすべての devnode は、同じコンテナー ID を共有します。 その関係の例を次に示します。

diagram illustrating container ids for a multifunction device's devnodes.

バス ドライバーには特別な意味を持つコンテナー ID が 1 つあります。NULL_GUID は次のように定義されています {00000000-0000-0000-0000-000000000000}。

一般に、コンテナー ID を報告するときに、NULL_GUIDを既定のケースとして返さないでください。 代わりに、BusQueryContainerIDs ケースのIRP_MN_QUERY_IDを処理せず、PnP に既定のロジックを適用します。

NULL_GUIDをコンテナー ID として返す場合、バス ドライバーは PnP に対して、デバイスがコンテナーの一部となってはならないことを宣言するため、非常に特殊な場合にのみ NULL_GUID を返します。 たとえば、 ボリューム デバイスなどの devnode は、複数のコンテナー内の複数のディスクにまたがる場合がありますが、どのコンテナーにも属していません。 このようなデバイスには、NULL_GUIDと等しいDEVPKEY_Device_BaseContainerIdがあり、DEVPKEY_Device_ContainerIdはまったくありません

非常に特殊なケースを除いて、バス ドライバーは、ハードウェア デバイスを報告するときにNULL_GUIDを返すべきではありません。バス ドライバーは、バスからNULL_GUID値を報告する障害のあるハードウェアから保護する必要があります。 このような場合、バス ドライバーは、これをデバイス エラーとして扱うか、デバイスが値を報告しなかったかのように扱う必要があります。