硬件 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>

此格式是单个枚举器向即插即用管理器报告的单个 PnP 设备最常见的格式。

\*<generic-device-ID>

星号指示多个枚举器支持设备,例如 ISAPNP 和 BIOS。

<device-class-specific-ID>

有关详细信息,请参阅 泛型标识符

具有自己的已建立命名约定的现有设备类可能使用自定义格式。 有关其硬件 ID 格式的信息,请参阅此类总线的硬件规范。

硬件 ID(不包括 NULL 终止符)的字符数必须小于 MAX_DEVICE_ID_LEN。 此约束适用于硬件 ID 中所有字段的长度和任何 \\ 字段分隔符的总和。 有关详细信息,请参阅IRP_MN_QUERY_ID操作部分。

根枚举设备的硬件 ID

根枚举设备很特别,因为可以使用提供硬件 ID 的 API 创建这些设备。 具有共享泛型命名空间(例如 ROOT\SYSTEM)的硬件 ID 的根级枚举设备可能会发生冲突。 更新 Windows 时,结果是在设备管理器中出现黄色感叹号错误图标。

对于具有根枚举设备的每个驱动程序,可以使用唯一的命名空间来防止此错误。 对于 USB 或系统设备,不要使用ROOT\USBROOT\SYSTEM,而要使用ROOT\[COMPANYNAME]\[DEVICENAME]。 然后,在安装之前,检查 devnode 是否已存在。

获取设备的硬件 ID 列表

若要查找设备的硬件 ID 列表,请执行以下步骤:

  1. 在 Windows 搜索中,输入并选择 “设备管理器”。
  2. 在设备管理器中,在树中查找设备。
  3. 右键单击该设备并选择“属性”
  4. 选择“详细信息”选项卡
  5. 对于 “属性”,请选择 “硬件 ID ”或 “兼容 ID”。

还可以通过检索设备上的 DEVPKEY_Device_HardwareIds 属性,以编程方式获取硬件 ID 列表。 例如,可以使用 IoGetDevicePropertyDataSetupDiGetDevicePropertyCM_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