WMI WNODE_XXX Strukturen

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

In der folgenden Tabelle sind WMI-IRPs und ihre 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 von aktivierten Ereignissen zu senden. Ein Treiber, der Ereignisblöcke registriert, wenn ein Ereignis aktiviert ist und das Ereignis auftritt, senden Sie Benachrichtigungen des Ereignisses an WMI, indem Sie IoWMIWriteEvent aufrufen und eine WNODE_EVENT_XXX-Struktur übergeben. Informationen zum Senden von WMI-Ereignissen finden Sie unter Senden von WMI-Ereignissen.

Jede WNODE_XXX-Struktur besteht aus den folgenden:

  • Eine eingebettete WNODE_HEADER-Struktur, die Informationen enthält, die für alle WNODE_XXX gemeinsam sind, 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 und andere Merkmale des Blocks verwendet werden.

  • Die festen Elemente der bestimmten WNODE_XXX-Struktur , z. B. Offsets zu Instanznamen und Daten.

Eine WNODE_XXX-Struktur in einem IRP-Puffer (Parameters.WMI.Buffer) wird in der Regel von variablen Daten im Zusammenhang mit der Anforderung gefolgt, z. B. dynamische Instanznamen, statische Instanznamenzeichenfolgen, Eingaben oder Ausgabe aus einer Methode oder Daten für eine oder mehrere Instanzen eines Datenblocks. Die Größe des Puffers muss daher die Größe(WNODE_XXX) durch die Menge der variablen Daten überschreiten, die beteiligt sind.

Beachten Sie, dass WMI keine Typüberprüfung auf variablen Daten ausführt, die von einem Treiber bereitgestellt werden. Der Treiber muss Ausgabedaten an einer entsprechenden Grenze im Ausgabepuffer ausrichten, damit ein Datenverbraucher die Daten korrekt analysiert. Insbesondere muss jede Instanz auf einer 8-Byte-Grenze beginnen und jede ihrer Elemente gemäß dem zuvor von dem Treiber registrierten Datenblockschema auf eine natürliche Grenze ausgerichtet werden. Dynamische Instanznamen können auf einer 2-Byte-Grenze ausgerichtet werden.

Die folgende Abbildung zeigt ein Blockdiagramm eines IRP-Puffers mit einer WNODE_SINGLE_INSTANCE Struktur, die ein Treiber als Antwort auf eine IRP_MN_QUERY_SINGLE_INSTANCE-Anforderung zurückgibt.

diagram illustrating an irp buffer containing a wnode-single-instance.

Beginnend am oberen Rand der vorherigen Abbildung:

  • Die WNODE_HEADER Struktur am Anfang des WNODE_SINGLE_INSTANCE ist in einem WnodeHeader-Element enthalten. WMI füllt alle Elemente der WNODE_HEADER vor dem Senden der Anforderung aus. Im WNODE_HEADER:

    • WnodeHeader.Buffersize gibt die Größe des WNODE_SINGLE_INSTANCE an, einschließlich Daten, die den festen Elementen der Struktur folgen. (Der Wert von WnodeHeader.Buffersize ist in der Regel kleiner als Parameters.WMI.Buffersize, der die Größe des vom WMI zugewiesenen Puffers angibt, 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 InstanzIndex 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 auf den 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 hat, würde die Instanznamen bei VariableData 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, sofern 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 ähnlich wie WNODE_SINGLE_INSTANCE. Diese Strukturen ähneln einander, dass jede die festen Member OffsetInstanceName, InstanceIndex, DataBlockOffset, SizeDataBlock (oder im Fall von WNODE_SINGLE_ITEM, SizeDataItem) und VariableData enthält. 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, in denen es verwendet wird, mehrere Instanzen eines Datenblocks zu übergeben, möglicherweise einschließlich dynamischer Instanznamen und möglicherweise verschiedener Größen.

Die folgende Abbildung zeigt ein Blockdiagramm eines IRP-Puffers mit einem WNODE_ALL_DATA, dass ein Treiber auf eine IRP_MN_QUERY_ALL_DATA Anforderung zurückgibt.

diagram illustrating an irp buffer containing a wnode-all-data.

Beginnend am oberen Rand der vorherigen Abbildung:

  • Wie in der vorherigen Abbildung beschrieben, ist die WNODE_HEADER Struktur am Anfang des WNODE_ALL_DATA in einem WnodeHeader-Element enthalten. WnodeHeader.Buffersize und WnodeHeader.Guid geben die Größe des WNODE_ALL_DATA und der 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 auf den 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 Instanznamenzeichenfolgen. Da in diesem Beispiel dynamische Instanznamen verwendet werden, gibt OffsetInstanceNameOffsets den Offset vom Anfang des Puffers auf ein Array von Offsets auf dynamische Instanznamen im Puffer an.

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

Weitere Informationen zu WNODE_XXX-Strukturen finden Sie unter Systemstrukturen.