ハードウェアID
ハードウェア ID は、Windows がデバイスをドライバー パッケージと照合するために使用するベンダー定義の識別文字列です。 ハードウェア ID は、デバイスを識別し、それを宣言するすべてのドライバー パッケージが、ある程度の機能性をもってその ID を持つデバイスで動作できることを示します。 多くの場合、デバイスには複数のハードウェア ID が関連付けられています。 通常、ハードウェア ID の一覧は、デバイスに最も適しているものから最も適していないものの順に並べ替えられています。 たとえば、デバイスの概念的なハードウェア ID の一覧は次のようになります。
<Product X made by company Y with firmware revision Z>
<Product X made by company Y that is a device of type W>
実際のハードウェア ID は、ハードウェア ID の形式要件に従う文字列を使用して、これらの概念を表します。
デバイスのハードウェア ID を作成する
ハードウェア ID は、デバイスの列挙子 (そのバス ドライバー) によってプラグ アンド プレイ マネージャー (PnP) に報告されます。 通常、バス ドライバーの作成者が PnP に報告するデバイスの新しいハードウェア ID を作成する必要がある場合は、次のいずれかの汎用形式を使用します。
<enumerator>\<enumerator-specific-device-ID>
これは、1 つの列挙子でプラグ アンド プレイ (PnP) マネージャーに報告される個々の PnP デバイスの最も一般的な形式です。
\*<generic-device-ID>
アスタリスクは、デバイスが複数の列挙子 (ISAPNP や BIOS など) によってサポートされていることを示します。
<device-class-specific-ID>
詳細については、「汎用識別子」を参照してください。
独自の名前付け規則が確立している既存のデバイス クラスの場合、カスタムの形式が使用されることがあります。 ハードウェア ID の形式の詳細については、そのようなバスのハードウェア仕様を参照してください。
NULL 終端文字を除くハードウェア ID の文字数は、MAX_DEVICE_ID_LEN
未満にする必要があります。 この制約は、ハードウェア ID 内のすべてのフィールドの長さと \\
フィールド区切り記号の合計に適用されます。 詳細については、「IRP_MN_QUERY_ID」の「操作」セクションを参照してください。
ルート列挙デバイスのハードウェア ID
ルート列挙デバイスは、ハードウェア ID を指定できる API を使用して作成できる点で特別です。 ROOT\SYSTEM
などの汎用名前空間を共有するハードウェア ID を持つルート列挙デバイスは、競合し、Windows の更新時にデバイス マネージャーに黄色の警告色のエラー アイコンが表示される可能性があります。
これを回避するには、ルート列挙デバイスを持つドライバーごとに一意の名前空間を使用します。 USB またはシステム デバイスの場合は、ROOT\USB
または ROOT\SYSTEM"
を使用する代わりに ROOT\[COMPANYNAME]\[DEVICENAME]
を使用します。 次に、インストールする前に、devnode が既に存在しているかどうかを確認します。
デバイスのハードウェア ID の一覧を取得する
特定のデバイスのハードウェア ID の一覧を検索するには、次の手順を実行します。
デバイス マネージャーを開きます。
ツリー内のデバイスを見つけます。
デバイスを右クリックし、[プロパティ] を選択します。
詳細タブを選択します。
[プロパティ] ドロップダウンで、[ハードウェア ID] または [互換性 ID] を選択します。
ハードウェア ID の一覧は、デバイスの DEVPKEY_Device_HardwareIds プロパティを取得することによってプログラムで取得することもできます。 たとえば、そのプロパティは、IoGetDevicePropertyData、SetupDiGetDeviceProperty、CM_Get_DevNode_Property などの API で取得できます。
このルーチンが取得するハードウェア ID の一覧は REG_MULTI_SZ 値です。 ハードウェア一覧の最大文字数は、各ハードウェア ID の後の NULL 終端文字と最後の NULL 終端文字を含め、REGSTR_VAL_MAX_HCID_LEN
です。 ハードウェア ID の一覧に表示される ID の最大数は 64 です。
ハードウェア ID の例
PnP デバイスの汎用識別子の例を次に示します。
root\*PNP0F08
PCI デバイスの識別子の例を次に示します。
PCI\VEN_1000&DEV_0001&SUBSYS_00000000&REV_02