Freigeben über


WMI-WNODE_XXX Strukturen

WMI verwendet eine Reihe von Standarddatenstrukturen, die WNODE_XXX- genannt werden, um Daten zwischen Consumern im Benutzermodus und Kernelmodusdatenanbietern wie Treibern zu übergeben. Wenn ein Treiber WMI-Anforderungen durch Aufrufen WmiSystemControlverarbeitet, ist der Treiber nicht erforderlich, um WNODE_XXX- Strukturen zu lesen oder zu schreiben. Andernfalls muss der Treiber die Eingabe WNODE_XXX- an Parameters.WMI.Buffer- interpretieren und/oder eine Ausgabe WNODE_XXX- an diesen Speicherort schreiben.

In der folgenden Tabelle sind WMI-IRPs und die entsprechenden WNODE_XXX--Strukturen aufgeführt.

WMI-IRP Verwandte WNODE_XXX Struktur

IRP_MN_CHANGE_SINGLE_INSTANCE

WNODE_SINGLE_INSTANCE

IRP_MN_CHANGE_SINGLE_ITEM

WNODE_SINGLE_ITEM

IRP_MN_EXECUTE_METHOD

WNODE_METHOD_ITEM

IRP_MN_QUERY_ALL_DATA

WNODE_ALL_DATA

IRP_MN_QUERY_SINGLE_INSTANCE

WNODE_SINGLE_INSTANCE

Zwei zusätzliche WNODE_XXX Strukturen, WNODE_EVENT_ITEM und WNODE_EVENT_REFERENCE, werden verwendet, um Benachrichtigungen über aktivierte Ereignisse zu senden. Ein Treiber, der Ereignisblöcke registriert, sendet, wenn ein Ereignis aktiviert ist und das Ereignis eintritt, eine Benachrichtigung über das Ereignis an WMI, indem IoWMIWriteEvent- aufgerufen und eine WNODE_EVENT_XXX--Struktur übergeben wird. Informationen zum Senden von WMI-Ereignissen finden Sie unter Senden von WMI-Ereignissen.

Jede WNODE_XXX--Struktur besteht aus folgenden Komponenten:

  • Eine eingebettete WNODE_HEADER Struktur, die Informationen enthält, die allen WNODE_XXX- einschließlich der Größe des Puffers, der GUID, die den Datenblock darstellt, und Flags, die den Typ der WNODE_XXX--Struktur angeben, unabhängig davon, ob statische oder dynamische Instanznamen verwendet werden, und andere Merkmale des Blocks.

  • Die festen Member der speziellen WNODE_XXX--Struktur, z. B. Offsets für Instanznamen und -daten.

Eine WNODE_XXX- Struktur in einem IRP-Puffer (Parameters.WMI.Buffer) folgt in der Regel variablen Daten im Zusammenhang mit der Anforderung, z. B. dynamische Instanznamen, Namenzeichenfolgen für statische Instanzen, Eingabe oder Ausgabe aus einer Methode oder Daten für eine oder mehrere Instanzen eines Datenblocks. Die Größe des Puffers muss daher Sizeof(WNODE_XXX-) überschreiten, um die Menge der beteiligten Variablendaten.

Beachten Sie, dass WMI keine Typüberprüfung für variablen Daten durchführt, die von einem Treiber bereitgestellt werden. Der Treiber muss Ausgabedaten an einer geeigneten Grenze im Ausgabepuffer ausrichten, damit ein Datenverbraucher die Daten richtig analysieren kann. Insbesondere muss jede Instanz auf einer Grenze von 8 Byte beginnen, und jedes element muss auf einer natürlichen Grenze gemäß dem datenblockschema ausgerichtet werden, das zuvor vom Treiber registriert wurde. Dynamische Instanznamen können an einer Grenze von 2 Byte ausgerichtet werden.

Die folgende Abbildung zeigt ein Blockdiagramm eines IRP-Puffers, der eine WNODE_SINGLE_INSTANCE Struktur enthält, die ein Treiber als Reaktion auf eine IRP_MN_QUERY_SINGLE_INSTANCE Anforderung zurückgeben kann.

Diagramm, das einen IRP-Puffer veranschaulicht, der eine wnode-einzelinstanz enthält.

Beginnend am Anfang der vorherigen Abbildung:

  • Die WNODE_HEADER Struktur am Anfang des WNODE_SINGLE_INSTANCE ist in einem WnodeHeader--Element enthalten. WMI füllt alle Member der WNODE_HEADER aus, bevor die Anforderung gesendet wird. Im WNODE_HEADER:

    • WnodeHeader.Buffersize- gibt die Größe des WNODE_SINGLE_INSTANCEan, einschließlich der Daten, die den festen Membern der Struktur folgen. (Der Wert von WnodeHeader.Buffersize ist in der Regel kleiner als Parameters.WMI.Buffersize, wodurch die Größe des vom WMI zugewiesenen Puffers angegeben wird, um die Ausgabe vom Treiber zu erhalten.)
    • WnodeHeader.Guid enthält die GUID, die den Datenblock identifiziert.
    • In diesem Beispiel gibt WnodeHeader.Flags an, dass diese Struktur ein WNODE_SINGLE_INSTANCE ist und dass der Datenblock statische Instanznamen verwendet.
  • Da der Datenblock statische Instanznamen verwendet, legt WMI InstanceIndex- auf den Index der Instanz in der Liste der statischen Instanznamen fest, die vom Treiber übergeben werden, wenn er den Block registriert hat. "OffsetInstanceNames"- wird nicht verwendet.

  • WMI legt DataBlockOffset- fest, um den Offset vom Anfang des Puffers bis zum ersten Byte von Instanzdaten anzugeben. (Der Treiber darf diesen Wert nicht ändern) Da der Datenblock statische Instanznamen verwendet, gibt dieser Offset denselben Speicherort wie VariableData-an. Wenn der Datenblock dynamische Instanznamen verwendet, würden die Instanznamen bei VariableData- beginnen und DataBlockOffset- einen größeren Offset in den Puffer angeben.

  • Der Treiber legt SizeDataBlock- auf die Anzahl der zurückgegebenen Instanzdaten fest.

  • Bei VariableData- (nach Instanznamendaten, falls vorhanden) schreibt der Treiber Instanzdaten für die angeforderte Instanz im Ausgabepuffer.

Ein Treiber liest und schreibt WNODE_METHOD_ITEM und WNODE_SINGLE_ITEM Strukturen auf die gleiche Weise wie WNODE_SINGLE_INSTANCE. Diese Strukturen ähneln einander, da jede die festen Member OffsetInstanceName, InstanceIndex, DataBlockOffset, SizeDataBlock (oder im Fall von WNODE_SINGLE_ITEM, SizeDataItem) und VariableData. WNODE_METHOD_ITEM enthält eine MethodId- und WNODE_SINGLE_ITEM enthält eine ItemId-, die WNODE_SINGLE_INSTANCE fehlt.

WNODE_ALL_DATA unterscheidet sich von den vorherigen Strukturen darin, dass sie verwendet wird, um mehrere Instanzen eines Datenblocks zu übergeben, z. B. dynamische Instanznamen und möglicherweise unterschiedliche Größen.

Die folgende Abbildung zeigt ein Blockdiagramm eines IRP-Puffers, der eine WNODE_ALL_DATA enthält, die ein Treiber als Reaktion auf eine IRP_MN_QUERY_ALL_DATA Anforderung zurückgeben kann.

Diagramm, das einen Irp-Puffer mit einem wnode-all-data-Objekt veranschaulicht.

Beginnend am Anfang der vorherigen Abbildung:

  • Wie in der vorherigen Abbildung beschrieben, ist die WNODE_HEADER Struktur am Anfang des WNODE_ALL_DATA in einem WnodeHeader Member enthalten. WnodeHeader.Buffersize und WnodeHeader.Guid geben die Größe des WNODE_ALL_DATA bzw. die GUID des Datenblocks an.

    In diesem Beispiel legt WMI WnodeHeader.Flags- fest, um anzugeben, dass diese Struktur ein WNODE_ALL_DATA ist und dass der Datenblock mit dynamischen Instanznamen registriert wurde (d. h. WMI löscht WNODE_FLAG_STATIC_INSTANCE_NAMES und WNODE_FLAG_PDO_INSTANCE_NAMES). Bei der Ausgabe legt der Treiber WNODE_FLAG_FIXED_INSTANCE_SIZE fest, um anzugeben, dass alle Instanzen dieselbe Größe aufweisen.

  • WMI legt DataBlockOffset- fest, um den Offset vom Anfang des Puffers bis zum ersten Byte von Instanzdaten anzugeben. (Der Treiber darf diesen Wert nicht ändern). In diesem Beispiel folgen Instanzdaten den Instanznamen bei OffsetInstanceNameOffsets.

  • Der Treiber legt InstanceCount- fest, um die Anzahl der zurückgegebenen Instanzen anzugeben.

  • WNODE_XXX- für Datenblöcke, die dynamische Instanznamen verwenden, enthalten immer die Instanzennamenzeichenfolgen. Da in diesem Beispiel dynamische Instanznamen verwendet werden, gibt OffsetInstanceNameOffsets den Offset vom Anfang des Puffers bis zu einem Array von Offsets zu dynamischen Instanznamen im Puffer an.

  • FixedInstanceSize- gibt die Anzahl der Daten in jeder Instanz an, die vom Treiber zurückgegeben wird. Wenn Instanzen dieses Datenblocks in der Größe variieren sollten, der Treiber würde WNODE_FLAG_FIXED_INSTANCE_SIZE in WnodeHeader.Flags löschen und OffsetInstanceDataAndLength- auf ein Array OFFSETINSTANCEDATAANDLENGTH- Strukturen festlegen, wobei jeder einen Offset für die Daten für eine Instanz und die Anzahl der Bytes in dieser Instanz angibt, anstatt FixedInstanceSizefestzulegen.

Weitere Informationen zu WNODE_XXX Strukturen finden Sie unter Systemstrukturen.