Hardware ID
A hardware ID is a vendor-defined identification string that Windows uses to match a device to a driver package. A hardware ID identifies a device and indicates that any driver package that declares it can work with a device that has that ID for some degree of functionality. In most cases, a device has more than one hardware ID associated with it. Typically, a list of hardware IDs is sorted from most to least suitable for a device. For example, the list of conceptual hardware IDs for a device might look like:
<Product X made by company Y with firmware revision Z>
<Product X made by company Y that is a device of type W>
Where the actual hardware IDs would represent those concepts using strings that follow the format requirements of a hardware ID.
Creating a hardware ID for a device
Hardware IDs are reported to the Plug and Play Manager (PnP) by a device's enumerator (its bus driver). Typically, when the author of a bus driver needs to create a new hardware ID for a device it reports to PnP, it uses one of the following generic formats:
<enumerator>\<enumerator-specific-device-ID>
This format is the most common for individual PnP devices reported to the Plug and Play (PnP) manager by a single enumerator.
\*<generic-device-ID>
The asterisk indicates that more than one enumerator supports the device, such as ISAPNP and the BIOS.
<device-class-specific-ID>
For more information, see Generic Identifiers.
An existing device class with its own established naming convention might use a custom format. For information about their hardware ID formats, see the hardware specification for such buses.
The number of characters of a hardware ID, excluding a NULL terminator, must be less than MAX_DEVICE_ID_LEN
. This constraint applies to the sum of the lengths of all the fields and any \\
field separators in a hardware ID. For more information, see the Operations section of IRP_MN_QUERY_ID.
Hardware IDs for root enumerated devices
Root enumerated devices are special in that they can be created using APIs where a hardware ID can be provided. Root enumerated devices with hardware IDs sharing generic namespaces such as ROOT\SYSTEM
might conflict and result in a yellow-bang error icon in Device Manager when updating Windows.
You can prevent this error by using a unique namespace for each driver that has a root enumerated device. For a USB or system device, instead of using ROOT\USB
or ROOT\SYSTEM"
use ROOT\[COMPANYNAME]\[DEVICENAME]
. Then, before installing, check to see if the devnode is already present.
Obtaining the list of hardware IDs for a device
To find the list of hardware IDs for a given device, follow these steps:
- Open Device Manager.
- Find the device in the tree.
- Right-select the device and select Properties.
- Select the Details tab.
- In the Property drop-down, select Hardware Ids or Compatible Ids.
The list of hardware IDs can also be obtained programmatically by retrieving the DEVPKEY_Device_HardwareIds property on a device. For example, that property can be retrieved with APIs such as IoGetDevicePropertyData, SetupDiGetDeviceProperty, or CM_Get_DevNode_Property.
The list of hardware IDs that this routine retrieves is a REG_MULTI_SZ value. The maximum number of characters in a hardware list, including a NULL terminator after each hardware ID and a final NULL terminator, is REGSTR_VAL_MAX_HCID_LEN
. The maximum possible number of IDs in a list of hardware IDs is 64.
Examples of Hardware IDs
Here's an example of a generic identifier for a PnP device:
root\*PNP0F08
Here's an example of an identifier for a PCI device:
PCI\VEN_1000&DEV_0001&SUBSYS_00000000&REV_02