ハードウェア 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>
この形式は、単一の列挙子によってプラグ アンド プレイ マネージャーに報告される個々の 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 の一覧を見つけるには、次の手順に従います。
- Windows 検索で、「 デバイス マネージャー」と入力して選択します。
- デバイス マネージャーで、ツリーでデバイスを見つけます。
- デバイスを右クリックし、[プロパティ]
選択します。 - [詳細] タブを選択します。
- [プロパティ] で、[ハードウェア ID] または [互換性のある ID] を選択します。
デバイスの DEVPKEY_Device_HardwareIds プロパティを取得することで、ハードウェア ID の一覧をプログラムで取得することもできます。 たとえば、そのプロパティは、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