Freigeben über


IRP_MN_QUERY_ALL_DATA

Alle Treiber, die WMI unterstützen, müssen dieses IRP verarbeiten. Ein Treiber kann WMI-IRPs entweder durch Aufrufen von WmiSystemControl oder durch Behandeln des IRP selbst verarbeiten, wie in der Behandlung von WMI-Anforderungen beschrieben.

Wenn ein Treiber WmiSystemControl aufruft, um eine IRP_MN_QUERY_ALL_DATA Anforderung zu verarbeiten, ruft WMI wiederum die DpWmiQueryDataBlock-Routine dieses Treibers auf.

Hauptcode

IRP_MJ_SYSTEM_CONTROL

Sendeszenario

WMI sendet dieses IRP, um alle Instanzen eines bestimmten Datenblocks abzufragen.

WMI sendet dieses IRP bei IRQL = PASSIVE_LEVEL in einem beliebigen Threadkontext.

Eingabe-Parameter

Parameters.WMI.ProviderId im I/O-Stapel des Treibers verweist auf das Geräteobjekt des Treibers, das auf die Anforderung reagieren soll.

Parameters.WMI.DataPath verweist auf eine GUID, die den Datenblock identifiziert.

Parameters.WMI.BufferSize gibt die maximale Größe des nicht ausgelagerten Puffers bei Parameters.WMI.Buffer an, der Ausgabedaten aus der Anforderung empfängt. Die Puffergröße muss größer oder gleich "sizeof(WNODE_ALL_DATA)" und die Größen von Instanznamen und -daten sein, damit alle Instanzen zurückgegeben werden.

Ausgabeparameter

Wenn der Treiber WMI-IRPs durch Aufrufen von WmiSystemControl verarbeitet, füllt WMI eine WNODE_ALL_DATA aus, indem die DpWmiQueryDataBlock-Routine des Treibers einmal für jeden vom Treiber registrierten Block aufgerufen wird.

Andernfalls füllt der Treiber eine WNODE_ALL_DATA Struktur unter Parameters.WMI.Buffer wie folgt aus:

  • Legt WnodeHeader.BufferSize auf die Anzahl der Bytes des gesamten zurückzugebenden WNODE_ALL_DATA fest, legt WnodeHeader.Timestamp auf den von KeQuerySystemTime zurückgegebenen Wert fest und legt WnodeHeader.Flags entsprechend für die zurückgegebenen Daten fest.

  • Legt " InstanceCount " auf die Anzahl der zurückzugebenden Instanzen fest.

  • Wenn der Block dynamische Instanznamen verwendet, wird OffsetInstanceNameOffsets vom Anfang des WNODE_ALL_DATA auf den Offset in Bytes festgelegt, auf den ein Array von ULONG-Offsets beginnt. Jedes Element in diesem Array ist der Offset von der WNODE_ALL_DATA zu dem Ort, an dem jeder Name der dynamischen Instanz gespeichert wird. Jeder Name der dynamischen Instanz wird als gezählte Unicode-Zeichenfolge gespeichert, wobei die Anzahl eine USHORT gefolgt von der Unicode-Zeichenfolge ist. Die Anzahl enthält kein endendes NULL-Zeichen, das Teil der Unicode-Zeichenfolge sein kann. Wenn die Unicode-Zeichenfolge ein endendes NULL-Zeichen enthält, muss dieses Nullzeichen weiterhin in die Größe passen, die in WNodeHeader.BufferSize festgelegt ist.

  • Wenn alle Instanzen dieselbe Größe haben:

    • Legt WNODE_FLAG_FIXED_INSTANCE_SIZE in WnodeHeader.Flags fest und legt FixedInstanceSize auf diese Größe in Byte fest.
    • Schreibt Instanzdaten ab DataBlockOffset mit Abstand, sodass jede Instanz an einer Grenze von 8 Byte ausgerichtet wird. Wenn fixedInstanceSize beispielsweise 6 ist, fügt der Treiber 2 Byte Abstand zwischen Instanzen hinzu.
  • Wenn Instanzen in der Größe variieren:

    • Löscht WNODE_FLAG_FIXED_INSTANCE_SIZE in WnodeHeader.Flags und schreibt ein Array von InstanceCount OFFSETINSTANCEDATAANDLENGTH-Strukturen ab OffsetInstanceDataAndLength. Jede OFFSETINSTANCEDATAANDLENGTH-Struktur gibt den Offset in Bytes vom Anfang der WNODE_ALL_DATA Struktur bis zum Anfang der Daten für jede Instanz und die Länge der Daten an. DataBlockOffset wird nicht verwendet.

    • Schreibt Instanzdaten nach dem letzten Element des OffsetInstanceDataAndLength-Arrays sowie Abstand, sodass jede Instanz an einer Grenze von 8 Byte ausgerichtet wird.

Wenn der Puffer bei Parameters.WMI.Buffer zu klein ist, um alle Daten zu empfangen, füllt ein Treiber die erforderliche Größe in einer WNODE_TOO_SMALL Struktur unter Parameters.WMI.Buffer aus. Wenn der Puffer kleiner als sizeof(WNODE_TOO_SMALL) ist, schlägt der Treiber das IRP fehl und gibt STATUS_BUFFER_TOO_SMALL zurück.

E/A-Statusblock

Wenn der Treiber das IRP durch Aufrufen von WmiSystemControl verarbeitet, legt WMI Irp-IoStatus.Status> und Irp-IoStatus.Information> im E/A-Statusblock fest.

Andernfalls legt der Treiber "Irp-IoStatus.Status>" auf STATUS_SUCCESS oder auf einen entsprechenden Fehlerstatus fest, z. B. folgendes:

STATUS_BUFFER_TOO_SMALL

STATUS_WMI_GUID_NOT_FOUND

Bei Erfolg legt ein Treiber "Irp-IoStatus.Information>" auf die Anzahl der Bytes fest, die in den Puffer unter Parameters.WMI.Buffer geschrieben wurden.

Vorgang

Ein Treiber kann WMI-IRPs entweder durch Aufrufen von WmiSystemControl oder durch Behandeln des IRP selbst verarbeiten, wie in der Behandlung von WMI-Anforderungen beschrieben.

Wenn ein Treiber WMI-IRPs durch Aufrufen von WmiSystemControl verarbeitet, ruft diese Routine die DpWmiQueryDataBlock-Routine des Treibers auf.

Wenn ein Treiber eine IRP_MN_QUERY_ALL_DATA-Anforderung verarbeitet, sollte dies nur ausgeführt werden, wenn Parameters.WMI.ProviderId auf dasselbe Geräteobjekt verweist, das der Treiber an IoWMIRegistrationControl übergeben hat. Andernfalls muss der Treiber die Anforderung an den nächsten niedrigeren Treiber weiterleiten.

Vor der Verarbeitung der Anforderung muss der Treiber bestimmen, ob Parameters.WMI.DataPath auf eine GUID verweist, die der Treiber unterstützt. Andernfalls muss der Treiber das IRP nicht bestehen und STATUS_WMI_GUID_NOT_FOUND zurückgeben.

Wenn der Treiber den Datenblock unterstützt, muss er die folgenden Schritte ausführen:

  • Stellen Sie sicher, dass Parameters.WMI.BufferSize einen Puffer angibt, der groß genug ist, um alle Vom Treiber zurückgegebenen Daten zu empfangen.

  • Füllen Sie eine WNODE_ALL_DATA Struktur bei Parameters.WMI.Buffer mit Daten für alle Instanzen dieses Datenblocks aus.

Anforderungen

Header

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

Weitere Informationen

DpWmiQueryDataBlock

IoWMIRegistrationControl

KeQuerySystemTime

WMILIB_CONTEXT

WmiSystemControl

WNODE_ALL_DATA