Hardware-ID
Eine Hardware-ID ist eine vom Hersteller definierte Identifikationszeichenfolge, die Windows verwendet, um ein Gerät einem Treiberpaket zuzuordnen. Eine Hardware-ID identifiziert ein Gerät und gibt an, dass jedes Treiberpaket, das es deklariert, mit einem Gerät funktionieren kann, das über diese ID für einen bestimmten Grad an Funktionalität verfügt. In den meisten Fällen ist einem Gerät mehr als eine Hardware-ID zugeordnet. In der Regel wird eine Liste der Hardware-IDs von den am wenigsten geeigneten Hardware-IDs für ein Gerät sortiert. Die Liste der konzeptionellen Hardware-IDs für ein Gerät könnte beispielsweise wie folgt aussehen:
<Product X made by company Y with firmware revision Z>
<Product X made by company Y that is a device of type W>
Wobei die tatsächlichen Hardware-IDs diese Konzepte mit Zeichenfolgen darstellen würden, die den Formatanforderungen einer Hardware-ID entsprechen.
Erstellen einer Hardware-ID für ein Gerät
Hardware-IDs werden vom Enumerator eines Geräts (dessen Bustreiber) an den Plug & Play Manager (PnP) gemeldet. Wenn der Autor eines Bustreibers eine neue Hardware-ID für ein Gerät erstellen muss, das an PnP gemeldet wird, verwendet er in der Regel eines der folgenden generischen Formate:
<enumerator>\<enumerator-specific-device-ID>
Dies ist das am häufigsten verwendete Format für einzelne PnP-Geräte, die dem Plug & Play-Manager (PnP) von einem einzelnen Enumerator gemeldet werden.
\*<generic-device-ID>
Das Sternchen gibt an, dass das Gerät von mehr als einem Enumerator unterstützt wird, z. B. ISAPNP und das BIOS.
<device-class-specific-ID>
Weitere Informationen finden Sie unter Generische Bezeichner.
Eine vorhandene Geräteklasse, die eine eigene Benennungskonvention eingerichtet hat, kann ein benutzerdefiniertes Format verwenden. Informationen zu den Hardware-ID-Formaten finden Sie in der Hardwarespezifikation für solche Busse.
Die Anzahl der Zeichen einer Hardware-ID mit Ausnahme eines NULL-Abschlussators muss kleiner als MAX_DEVICE_ID_LEN
sein. Diese Einschränkung gilt für die Summe der Längen aller Felder und aller \\
Feldtrennzeichen in einer Hardware-ID. Weitere Informationen finden Sie im Abschnitt Vorgänge von IRP_MN_QUERY_ID.
Hardware-IDs für stammumerierte Geräte
Root enumerierte Geräte sind besonders, da sie mithilfe von APIs erstellt werden können, in denen eine Hardware-ID bereitgestellt werden kann. Stammgeräte mit Hardware-IDs, die generische Namespaces gemeinsam nutzen, können ROOT\SYSTEM
Konflikte verursachen und beim Aktualisieren von Windows zu einem Gelbknallfehlersymbol in Geräte-Manager führen.
Sie können dies verhindern, indem Sie einen eindeutigen Namespace für jeden Treiber verwenden, der über ein stammumeriertes Gerät verfügt. Für ein USB- oder Systemgerät, anstatt zu verwenden ROOT\USB
oder ROOT\SYSTEM"
zu verwenden ROOT\[COMPANYNAME]\[DEVICENAME]
. Überprüfen Sie dann vor der Installation, ob der Devnode bereits vorhanden ist.
Abrufen der Liste der Hardware-IDs für ein Gerät
Führen Sie die folgenden Schritte aus, um die Liste der Hardware-IDs für ein bestimmtes Gerät zu finden:
Öffnen Sie den Geräte-Manager.
Suchen Sie das Gerät in der Struktur.
Wählen Sie das Gerät mit der rechten Maustaste aus, und wählen Sie Eigenschaften aus.
Wählen Sie die Registerkarte Details aus.
Wählen Sie in der Dropdownliste Eigenschaftdie Option Hardware-IDs oder Kompatible IDs aus.
Die Liste der Hardware-IDs kann auch programmgesteuert abgerufen werden, indem die eigenschaft DEVPKEY_Device_HardwareIds auf einem Gerät abgerufen wird. Diese Eigenschaft kann beispielsweise mit APIs wie IoGetDevicePropertyData, SetupDiGetDeviceProperty oder CM_Get_DevNode_Property abgerufen werden.
Die Liste der Hardware-IDs, die diese Routine abruft, ist ein REG_MULTI_SZ Wert. Die maximale Anzahl von Zeichen in einer Hardwareliste, einschließlich eines NULL-Abschlussators nach jeder Hardware-ID und eines endgültigen NULL-Abschlusszeichens, ist REGSTR_VAL_MAX_HCID_LEN
. Die maximal mögliche Anzahl von IDs in einer Liste von Hardware-IDs ist 64.
Beispiele für Hardware-IDs
Hier sehen Sie ein Beispiel für einen generischen Bezeichner für ein PnP-Gerät:
root\*PNP0F08
Hier sehen Sie ein Beispiel für einen Bezeichner für ein PCI-Gerät:
PCI\VEN_1000&DEV_0001&SUBSYS_00000000&REV_02