IRP_MN_QUERY_CAPABILITIES

Der PnP-Manager sendet dieses IRP, um die Funktionen eines Geräts abzurufen, z. B. ob das Gerät gesperrt oder ausgeworfen werden kann.

Funktions- und Filtertreiber können diese Anforderung verarbeiten, wenn sie die vom Bustreiber unterstützten Funktionen ändern. Busfahrer müssen diese Anforderung für ihre untergeordneten Geräte verarbeiten.

Wert

0x09

Hauptcode

IRP_MJ_PNP

Sendeszenario

Der PnP-Manager sendet dieses IRP unmittelbar nach der Aufzählung des Geräts an den Bustreiber. Der PnP-Manager sendet dieses IRP erneut, nachdem alle Treiber für ein Gerät das Gerät gestartet haben. Ein Treiber kann dieses IRP senden, um die Funktionen für ein Gerät abzurufen.

Der PnP-Manager und treiber senden dieses IRP an IRQL-PASSIVE_LEVEL in einem beliebigen Threadkontext.

Eingabe-Parameter

Der Parameter.DeviceCapabilities.Capabilities-Member der IO_STACK_LOCATION-Struktur verweist auf eine DEVICE_CAPABILITIES Struktur, die Informationen zu den Funktionen des Geräts enthält.

Ausgabeparameter

Parameters.DeviceCapabilities.Capabilities verweist auf die DEVICE_CAPABILITIES Struktur, die änderungen an den Treibern widerspiegelt, die das IRP behandeln.

E/A-Statusblock

Ein Treiber legt "Irp-IoStatus.Status>" auf STATUS_SUCCESS oder auf einen entsprechenden Fehlerstatus fest, z. B. STATUS_UNSUCCESSFUL.

Wenn ein Funktions- oder Filtertreiber dieses IRP nicht verarbeitet, ruft er IoSkipCurrentIrpStackLocation auf und übergibt das IRP an den nächsten Treiber. Ein solcher Treiber darf Irp-IoStatus.Status> nicht ändern und darf das IRP nicht abschließen.

Ein Bustreiber legt Irp-IoStatus.Status> fest und schließt das IRP ab.

Vorgang

Wenn ein Gerät aufgezählt wird, aber bevor die Funktions- und Filtertreiber für das Gerät geladen werden, sendet der PnP-Manager eine IRP_MN_QUERY_CAPABILITIES Anforderung an den übergeordneten Bustreiber für das Gerät. Der Bustreiber muss alle relevanten Werte in der DEVICE_CAPABILITIES Struktur festlegen und an den PnP-Manager zurückgeben.

Nachdem der Gerätestapel erstellt wurde und Treiber das Gerät gestartet haben, sendet der PnP-Manager dieses IRP erneut, um zuerst vom Treiber am oberen Rand des Gerätestapels und dann von jedem niedrigeren Treiber im Stapel verarbeitet zu werden. Funktions- und Filtertreiber können eine IoCompletion-Routine festlegen und diese IRP auf dem Weg zur Sicherung des Gerätestapels verarbeiten.

Treiber sollten Funktionen hinzufügen, bevor sie das IRP an den nächsten niedrigeren Treiber übergeben.

Treiber sollten Funktionen entfernen, nachdem alle niedrigeren Treiber mit dem IRP fertig sind. Ein Treiber entfernt in der Regel keine Funktionen, die von anderen Treibern festgelegt wurden. Dies kann jedoch der Fall sein, wenn er spezielle Informationen zu den Funktionen des Geräts in einer bestimmten Konfiguration enthält. Informationen zum Verschieben der IRP-Verarbeitung finden Sie unter Plug & Play, bis niedrigere Treiber abgeschlossen sind.

Nachdem ein Gerät aufgezählt wurde und seine Treiber geladen werden, sollten sich seine Funktionen nicht ändern. Die Funktionen eines Geräts können sich ändern, wenn das Gerät entfernt und erneut aufgezählt wird.

Bei der Behandlung eines IRP_MN_QUERY_CAPABILITIES IRP sollte der Treiber, der der Energierichtlinien-Manager für das Gerät ist, eine IoCompletion-Routine festlegen und die Geräteleistungsfunktionen, z. B. die S-zu-D-Energiezustandszuordnungen, auf dem IRP-Weg zurück zum Gerätestapel kopieren. Um die Leistungsfunktionen eines untergeordneten Geräts zu ermitteln, erstellt der übergeordnete Bustreiber ein weiteres IRP mit Abfragefunktionen und sendet das IRP an seinen übergeordneten Treiber. Weitere Informationen finden Sie unter Berichterstellungsgeräte-Power-Funktionen .

Wenn ein Treiber dieses IRP behandelt, sollte der wert der DEVICE_CAPABILITIES Version überprüft werden. Wenn dieser Wert keine Version ist, die der Treiber unterstützt, sollte der Treiber das IRP nicht ausführen. Wenn die Version unterstützt wird, sollte der Treiber das Feld "Größe " überprüfen. Ein Treiber sollte nur die Felder festlegen, die sich innerhalb der Grenzen der Funktionenstruktur befinden, die er als Eingabe empfangen hat.

Treiber, die dieses IRP behandeln, können einige DEVICE_CAPABILITIES Felder festlegen, dürfen jedoch die Felder "Größe" und "Version" nicht festlegen. Diese Felder werden nur von der Komponente festgelegt, die das IRP gesendet hat.

Unter Plug & Play finden Sie allgemeine Regeln für die Behandlung Plug & Play kleinere IRPs.

Senden dieses IRP

Ein Bustreiber sendet dieses IRP an den übergeordneten Gerätestapel, wenn er eine IRP_MN_QUERY_CAPABILITIES Anforderung für eines seiner untergeordneten Geräte verarbeitet. Außerdem kann ein Treiber dieses IRP senden, um die Gerätefunktionen für eines seiner Geräte abzurufen. Ein einzelner Treiber im Stapel verfügt nur über einen Teil der Funktioneninformationen für das Gerät; Das Senden eines IRP an den Gerätestapel ermöglicht es, das vollständige Bild zu erfassen, einschließlich Änderungen durch alle Filtertreiber usw.

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

  • Weisen Sie eine DEVICE_CAPABILITIES Struktur aus dem seitenseitigen Pool zu, und initialisieren Sie sie auf Nullen, indem Sie RtlZeroMemory aufrufen. Initialisieren Sie die Größe in sizeof(DEVICE_CAPABILITIES), die Version in 1 und die Adress- und UINumber-Eigenschaft auf -1.

  • Legen Sie die Werte an der nächsten I/O-Stapelposition des IRP fest: Legen Sie "MajorFunction " auf IRP_MJ_PNP fest, legen Sie "MinorFunction " auf IRP_MN_QUERY_CAPABILITIES fest, und legen Sie "Parameters.DeviceCapabilities " auf einen Zeiger auf die zugeordnete DEVICE_CAPABILITIES Struktur fest.

  • Initialisieren Sie IoStatus.Status , um STATUS_NOT_SUPPORTED.

  • Verlagern Sie die IRP und die DEVICE_CAPABILITIES Struktur, wenn sie nicht mehr benötigt werden.

Anforderungen

Header

Wdm.h (enthalten Wdm.h, Ntddk.h oder Ntifs.h)

Weitere Informationen

DEVICE_CAPABILITIES