IRP_MN_QUERY_ALL_DATA

Alle Treiber, die WMI unterstützen, müssen diese IRP verarbeiten. Ein Treiber kann WMI-IRPs entweder durch Aufrufen von WmiSystemControl oder durch Behandeln des IRP selbst verarbeiten, wie unter Behandeln 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

Sendebedingungen

WMI sendet diesen IRP, um alle Instanzen eines angegebenen Datenblocks abzufragen.

WMI sendet diesen IRP an IRQL = PASSIVE_LEVEL in einem beliebigen Threadkontext.

Eingabeparameter

Parameters.WMI.ProviderId am E/A-Stapelspeicherort des Treibers im IRP verweist auf das Geräteobjekt des Treibers, der 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 auslagerten Puffers unter Parameters.WMI.Buffer an, der Ausgabedaten aus der Anforderung empfängt. Die Puffergröße muss größer oder gleich sizeof(WNODE_ALL_DATA) plus den Größen instance Namen 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 der gesamten zurückzugebenden WNODE_ALL_DATA fest, legt WnodeHeader.Timestamp auf den von KeQuerySystemTime zurückgegebenen Wert fest und legt WnodeHeader.Flags entsprechend den zurückzugebenden Daten fest.

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

  • Wenn der Block dynamische instance Namen verwendet, legt OffsetInstanceNameOffsets auf den Offset in Bytes vom Anfang der WNODE_ALL_DATA bis zum Beginn eines Arrays von ULONG-Offsets fest. Jedes Element in diesem Array ist der Offset von der WNODE_ALL_DATA bis zum Speicherort der einzelnen dynamischen instance Namen. Jeder dynamische instance Name wird als gezählte Unicode-Zeichenfolge gespeichert, wobei die Anzahl eine USHORT gefolgt von der Unicode-Zeichenfolge ist. Die Anzahl enthält kein abschließendes NULL-Zeichen, das Teil der Unicode-Zeichenfolge sein kann. Wenn die Unicode-Zeichenfolge ein abschließendes NULL-Zeichen enthält, muss dieses NULL-Zeichen weiterhin innerhalb der in WNodeHeader.BufferSize festgelegten Größe passen.

  • Wenn alle Instanzen die gleiche Größe haben:

    • Legt WNODE_FLAG_FIXED_INSTANCE_SIZE in WnodeHeader.Flags und FixedInstanceSize auf diese Größe in Bytes fest.
    • Schreibt instance Daten, die bei DataBlockOffset beginnen, mit Auffüllung, sodass jede instance an einer 8-Byte-Grenze ausgerichtet ist. Wenn FixedInstanceSize beispielsweise den Wert 6 aufweist, fügt der Treiber 2 Byte Abstand zwischen Instanzen hinzu.
  • Wenn instanzen in ihrer Größe variieren:

    • Löscht WNODE_FLAG_FIXED_INSTANCE_SIZE in WnodeHeader.Flags und schreibt ein Array von InstanceCountOFFSETINSTANCEDATAANDLENGTH-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 instance und die Länge der Daten an. DataBlockOffset wird nicht verwendet.

    • Schreibt instance Daten, die auf das letzte Element des OffsetInstanceDataAndLength-Arrays folgen, plus Auffüllung, sodass jede instance an einer 8-Byte-Grenze 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 die 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-status-Block fest.

Andernfalls legt der Treiber Irp-IoStatus.Status> auf STATUS_SUCCESS oder auf einen geeigneten Fehler fest, status z. B.:

STATUS_BUFFER_TOO_SMALL

STATUS_WMI_GUID_NOT_FOUND

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

Vorgang

Ein Treiber kann WMI-IRPs entweder durch Aufrufen von WmiSystemControl oder durch Behandeln des IRP selbst verarbeiten, wie unter Behandeln 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 er dies nur tun, 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ächstniedrigen Treiber weiterleiten.

Vor der Verarbeitung der Anforderung muss der Treiber bestimmen, ob Parameters.WMI.DataPath auf eine GUID verweist, die vom Treiber unterstützt wird. Wenn dies nicht der Fall ist, muss der Treiber das IRP nicht ausführen 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 Daten zu empfangen, die vom Treiber zurückgegeben werden.

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

Anforderungen

Header

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

Weitere Informationen

DpWmiQueryDataBlock

IoWMIRegistrationControl

KeQuerySystemTime

WMILIB_CONTEXT

WmiSystemControl

WNODE_ALL_DATA