A hardware ID is a vendor-defined identification string that Windows uses to match a device to a driver package. A hardware ID identifies what a device is to some level of specificity and is indicating that any driver package that declares it can work with a device that has that ID can work with this device 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 will report to PnP, it will use one of the following generic formats:
This is the most common format for individual PnP devices reported to the Plug and Play (PnP) manager by a single enumerator.
The asterisk indicates that the device is supported by more than one enumerator, such as ISAPNP and the BIOS.
For more information, see Generic Identifiers.
An existing device class that has established its own 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 may conflict and result in an yellow-bang error icon in Device Manager when updating Windows.
You can prevent this by using a unique namespace for each driver that has a root enumerated device. For a USB or system device, instead of using
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-click 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 is an example of a generic identifier for a PnP device:
Here is an example of an identifier for a PCI device: