IRP_MN_QUERY_ID

Bustreiber müssen Anforderungen für BusQueryDeviceID für ihre untergeordneten Geräte (untergeordnete PDOs) verarbeiten. Bustreiber können Anforderungen für BusQueryHardwareIDs, BusQueryCompatibleIDs und BusQueryInstanceID für ihre untergeordneten Geräte verarbeiten.

Ab Windows 7 müssen Bustreiber auch Anforderungen für BusQueryContainerID für ihre untergeordneten PDOs verarbeiten.

Weitere Informationen zu diesen Bezeichnern (IDs) finden Sie unter Geräteidentifikationszeichenfolgen.

Hinweis Funktionstreiber und Filtertreiber verarbeiten diese IRP nicht.

Wert

0x13

Hauptcode

IRP_MJ_PNP

Sendebedingungen

Der PnP-Manager sendet diesen IRP, wenn ein Gerät aufgezählt wird. Ein Treiber kann diese IRP senden, um die instance-ID für eines seiner Geräte abzurufen.

Der PnP-Manager und die Treiber senden diese IRP an IRQL PASSIVE_LEVEL in einem beliebigen Threadkontext.

Eingabeparameter

Das Parameters.QueryId.IdType-Element der IO_STACK_LOCATION-Struktur gibt die Art der angeforderten ID(n) an. Mögliche Werte sind BusQueryDeviceID, BusQueryHardwareIDs, BusQueryCompatibleIDs, BusQueryInstanceID und BusQueryContainerID. Der folgende ID-Typ ist reserviert: BusQueryDeviceSerialNumber.

Ausgabeparameter

Wird im E/A-status-Block zurückgegeben.

E/A-Statusblock

Ein Treiber legt Irp-IoStatus.Status> auf STATUS_SUCCESS oder auf einen geeigneten Fehler status fest.

Bei Erfolg legt ein Treiber Irp-IoStatus.Information auf einen WCHAR-Zeiger> fest, der auf die angeforderten Informationen verweist. Bei Einem Fehler legt ein Treiber Irp-IoStatus.Information> auf Null fest.

Vorgang

Wenn ein Treiber als Reaktion auf diese IRP ID(en) zurückgibt, ordnet er eine WCHAR-Struktur aus einem ausgelagerten Pool zu, um die ID(n) zu enthalten. Der PnP-Manager gibt die Struktur frei, wenn sie nicht mehr benötigt wird.

Ein Treiber gibt eine der folgenden Rückgaben zurück:

  • Ein REG_SZ Zeichenfolge als Antwort auf eine BusQueryDeviceID-, BusQueryInstanceID- oder BusQueryContainerID-Anforderung.

  • Ein REG_MULTI_SZ Zeichenfolge als Antwort auf eine BusQueryHardwareIDs- oder BusQueryCompatibleIDs-Anforderung.

Wenn ein Treiber eine ID mit einem unzulässigen Zeichen zurückgibt, wird die Fehlerprüfung des Systems angezeigt. Zeichen mit den folgenden Werten sind in einer ID für dieses IRP unzulässig:

  • Kleiner als oder gleich 0x20 (' ')

  • Größer als 0x7F

  • Gleich 0x2C (',')

Ein Treiber muss den folgenden Längenbeschränkungen für IDs entsprechen:

  • Jede Hardware-ID oder kompatible ID, die ein Treiber in dieser IRP zurückgibt, muss weniger als MAX_DEVICE_ID_LEN Zeichen lang sein. Diese Konstante hat derzeit den Wert 200, wie in sdk\inc\cfgmgr32.h definiert.

  • Die Container-ID, die ein Treiber in diesem IRP zurückgibt, muss als GUID (Globally Unique Identifier) formatiert sein und MAX_GUID_STRING_LEN Zeichen enthalten, die das NULL-Abschlusszeichen enthalten.

  • Wenn ein Bustreiber global eindeutige instance IDs für seine untergeordneten Geräte bereitstellt (d. h. der Treiber legt DEVICE_CAPABILITIESfest. UniqueID für die Geräte), dann muss die Kombination aus Geräte-ID und instance-ID kleiner als (MAX_DEVICE_ID_LEN - 1) Zeichen sein. Das Betriebssystem benötigt das zusätzliche Zeichen für ein Pfadtrennzeichen.

  • Wenn ein Bustreiber keine global eindeutigen instance-IDs für seine untergeordneten Geräte liefert, muss die Kombination aus Geräte-ID und instance ID kleiner als (MAX_DEVICE_ID_LEN - 28) sein. Der Wert dieser Gleichung ist derzeit 172.

Bustreiber sollten darauf vorbereitet sein, diese IRP für ein untergeordnetes Gerät sofort nach dem Aufzählen des Geräts zu verarbeiten.

Angeben von BusQueryDeviceID und BusQueryInstanceID

Die Werte, die ein Bustreiber für BusQueryDeviceID und BusQueryInstanceID bereitstellt, ermöglichen es dem Betriebssystem, ein Gerät von anderen Geräten auf dem Computer zu unterscheiden. Das Betriebssystem verwendet die Geräte-ID und instance-ID, die in der IRP_MN_QUERY_ID IRP zurückgegeben werden, und das eindeutige ID-Feld, die im IRP_MN_QUERY_CAPABILITIES IRP zurückgegeben werden, um Registrierungsinformationen für das Gerät zu finden.

Für BusQueryDeviceID stellt ein Bustreiber die Geräte-ID des Geräts bereit. Eine Geräte-ID sollte die möglichst spezifische Beschreibung des Geräts enthalten, einschließlich des Namens des Enumerators und der Zeichenfolgen, die den Hersteller, das Gerät, die Revision, den Verpacker und das verpackte Produkt nach Möglichkeit identifizieren. Der PCI-Bustreiber antwortet beispielsweise mit Geräte-IDs im Format PCI\VEN_xxxx&DEV_xxxx&SUBSYS_xxxxxxxx&REV_xx und codiert alle fünf der oben genannten Elemente. Eine Geräte-ID sollte jedoch nicht genügend Informationen enthalten, um zwischen zwei identischen Geräten zu unterscheiden. Diese Informationen sollten in der instance-ID codiert werden.

Für BusQueryInstanceID sollte ein Bustreiber eine Zeichenfolge angeben, die die instance-ID für das Gerät enthält. Setup- und Bustreiber verwenden die instance-ID zusammen mit anderen Informationen, um zwischen zwei identischen Geräten auf dem Computer zu unterscheiden. Die instance-ID ist entweder auf dem gesamten Computer eindeutig oder nur im übergeordneten Bus des Geräts eindeutig.

Wenn eine instance-ID nur auf dem Bus eindeutig ist, gibt der Bustreiber diese Zeichenfolge für BusQueryInstanceID an, aber auch den UniqueID-WertFALSE als Reaktion auf eine IRP_MN_QUERY_CAPABILITIES Anforderung für das Gerät. Wenn UniqueIDFALSE ist, verbessert der PnP-Manager die instance-ID, indem er Informationen über das übergeordnete Gerät des Geräts hinzufügt und die ID somit auf dem Computer eindeutig macht. In diesem Fall sollte der Bustreiber keine zusätzlichen Schritte unternehmen, um die instance IDs seiner Geräte global eindeutig zu machen. Geben Sie einfach die entsprechenden Funktionsinformationen zurück, und das Betriebssystem kümmert sich darum.

Wenn ein Bustreiber eine global eindeutige ID für jedes untergeordnete Gerät angeben kann, z. B. eine Seriennummer, gibt der Bustreiber diese Zeichenfolgen für BusQueryInstanceID an und gibt als Antwort auf eine IRP_MN_QUERY_CAPABILITIES Anforderung für jedes Gerät den UniqueID-Wert TRUE an.

Angeben von BusQueryHardwareIDs und BusQueryCompatibleIDs

Die Werte, die ein Bustreiber für BusQueryHardwareIDs und BusQueryCompatibleIDs bereitstellt, ermöglichen Setup die Suche nach den entsprechenden Treibern für das untergeordnete Gerät des Busses.

Ein Bustreiber antwortet auf jede dieser Anforderungen mit einer REG_MULTI_SZ Liste von IDs, die das Gerät beschreiben. Die maximale Länge in Zeichen einer Liste von IDs, einschließlich der beiden NULL-Zeichen, die die Liste beenden, ist REGSTR_VAL_MAX_HCID_LEN.

Wenn mehr als eine Hardware-ID und/oder mehrere kompatible ID zurückgegeben werden, sollte ein Bustreiber die IDs in der Reihenfolge der spezifischsten bis allgemeinsten auflisten, um die Auswahl der besten Treiber für das Gerät zu erleichtern. Der erste Eintrag in der Liste der Hardware-IDs ist die spezifischste Beschreibung des Geräts und daher in der Regel mit der Geräte-ID identisch.

Setup überprüft die IDs anhand der in INF-Dateien aufgeführten IDs auf mögliche Übereinstimmungen. Setup überprüft zunächst die Liste der Hardware-IDs und dann die Liste der kompatiblen IDs. Frühere Einträge werden als spezifischere Beschreibungen des Geräts und spätere Einträge als allgemeinere (und somit weniger optimale) Übereinstimmungen für das Gerät behandelt. Wenn in der Liste der Hardware-IDs keine Übereinstimmung gefunden wird, fordert Setup den Benutzer möglicherweise zur Eingabe des Installationsmediums auf, bevor es zur Liste der kompatiblen IDs übergeht.

Unter Plug & Play finden Sie die allgemeinen Regeln für die Behandlung Plug & Play untergeordneten IRPs.

Angeben von BusQueryContainerIDs

Ab Windows 7 sollte ein Bustreiber eine Zeichenfolge für BusQueryContainerID bereitstellen, die die Container-ID für das Gerät enthält. Die Container-ID ermöglicht es dem Betriebssystem, alle funktionsfähigen Geräte von einem einzelnen wechselbaren physischen Gerät zu gruppieren. Beispielsweise verfügen alle funktionalen Geräte eines Wechselmediums über die gleiche Container-ID. Weitere Informationen zum Melden von Container-IDs in besonderen Fällen, z. B. ein Volumegerät, das mehrere Datenträger in mehreren Containern umfassen kann, aber zu keinem Container gehört, finden Sie unter Übersicht über Container-IDs.

Ein wechselbares physisches Gerät ist als untergeordnetes Gerät definiert, das der Bustreiber als Antwort auf eine IRP_MN_QUERY_CAPABILITIES-Anforderung die WechselmedienfunktionTRUE angibt. Weitere Informationen zum Wert "Wechselbar " finden Sie unter DEVICE_CAPABILITIES.

Der Bustreiber erstellt eine Container-ID basierend auf einer busspezifischen eindeutigen ID, die das Gerät bereitstellt. Weitere Informationen finden Sie unter Generieren von Container-IDs.

Der Treiber muss die IRP-Anforderung fehlschlagen und IoStatus.Status auf STATUS_NOT_SUPPORTED festlegen, wenn eine der folgenden Punkte zutrifft:

  • Das Gerät unterstützt keine busspezifische eindeutige ID, die der Bustreiber zum Generieren einer Container-ID verwenden kann.

  • Der Bustreiber hatte zuvor als Antwort auf eine IRP_MN_QUERY_CAPABILITIES-Anforderung für das Gerät die Funktion "Wechselmedien" (FALSE) angegeben.

Senden dieses IRP

In der Regel sendet nur der PnP-Manager diese IRP.

Um die Hardware-IDs oder kompatiblen IDs für ein Gerät abzurufen, rufen Sie IoGetDeviceProperty auf, anstatt diese IRP zu senden.

Ein Treiber kann diese IRP senden, um die instance-ID für eines seiner Geräte abzurufen. Betrachten Sie beispielsweise ein multifunktionsfähiges PnP-ISA-Gerät, dessen Funktionen nicht unabhängig funktionieren. Der PnP-Manager listet die Funktionen als separate Geräte auf, aber der Treiber für ein solches Gerät muss möglicherweise eine oder mehrere der Funktionen zuordnen. Da PnP ISA eine eindeutige instance-ID garantiert, kann der Treiber für ein solches Multifunktionsgerät die instance IDs verwenden, um Funktionen zu finden, die sich auf demselben Gerät befinden. Der Treiber für ein solches Gerät muss auch den Enumeratornamen des Geräts abrufen, indem Er IoGetDeviceProperty aufruft, um zu bestätigen, dass es sich um ein PnP-ISA-Gerät handelt.

Informationen zum Senden von IRPs finden Sie unter Behandeln von IRPs . Die folgenden Schritte gelten speziell für dieses IRP:

  • Legen Sie die Werte am nächsten E/A-Stapelspeicherort des IRP fest: Legen Sie MajorFunction auf IRP_MJ_PNP fest, legen Sie MinorFunction auf IRP_MN_QUERY_ID und Parameters.QueryId.IdType auf BusQueryInstanceID fest.

  • Legen Sie IoStatus.Status auf STATUS_NOT_SUPPORTED fest.

Zusätzlich zum Senden der Abfrage-ID IRP muss der Treiber IoGetDeviceProperty aufrufen, um devicePropertyEnumeratorName für das Gerät abzurufen.

Nachdem das IRP abgeschlossen ist und der Treiber mit der ID fertig ist, muss der Treiber die ID-Struktur freigeben, die von den Treibern zurückgegeben wird, die die Abfrage-IRP verarbeitet haben.

Anforderungen

Header

Wdm.h (einschließen Wdm.h, Ntddk.h oder Ntifs.h)

Weitere Informationen

Geräteidentifikationszeichenfolgen

IoGetDeviceProperty