Veröffentlichen Ihres Ereignisschemas für einen klassischen Anbieter

Klassische Anbieter sollten das MoF-Format (Managed Object Format ) verwenden, um das Layout ihrer Ereignisdaten zu veröffentlichen. Consumer können dann das veröffentlichte Layout zur Laufzeit aus WMI lesen und zum Lesen der Ereignisdaten verwenden.

Wenn Sie MOF zum Veröffentlichen des Layouts Ihrer Ereignisdaten in WMI verwenden, erstellen Sie in der Regel die folgenden drei Typen von MOF-Klassen im Namespace root\wmi:

MOF-Anbieterklassen

Wenn Sie das Layout Ihrer Ereignisdaten veröffentlichen, müssen Sie eine MOF-Klasse erstellen, die Ihren Anbieter identifiziert. Diese Klasse muss von der EventTrace MOF-Klasse abgeleitet werden und muss leer sein (keine Eigenschaften oder Methoden). Die Klasse muss auch den Guid-Qualifizierer enthalten, der den Anbieter eindeutig identifiziert. Dies ist die gleiche GUID, die Sie verwenden, wenn Sie die RegisterTraceGuids-Funktion aufrufen, um Ihren Anbieter zu registrieren.

MOF-Ereignisklassen

Eine MOF-Ereignisklasse definiert eine Klasse von Ereignissen, die der Anbieter bereitstellt. Diese Klasse leitet sich von der MOF-Klasse des Anbieters ab und muss leer sein (keine Eigenschaften oder Methoden). Die Klasse muss auch den Guid-Qualifizierer enthalten, der die Ereignisklasse eindeutig identifiziert, die von den untergeordneten Klassen definiert wird. Der Anbieter verwendet dieselbe GUID beim Festlegen des Guid-Members der EVENT_TRACE_HEADER-Struktur .

MOF-Ereignistypklassen

Eine MOF-Ereignistypklasse definiert die tatsächlichen Ereignisdaten. Diese Klasse leitet sich von ihrer übergeordneten MOF-Ereignisklasse ab. Beim Benennen der MOF-Ereignistypklasse besteht die Konvention darin, den Namen der MOF-Ereignisklasse am Anfang des MOF-Klassennamens des Ereignistyps zu verwenden. Wenn der MOF-Ereignisklassenname beispielsweise HWConfig ist und die MOF-Ereignistypklasse CPU-Informationen darstellt, sollten Sie der Ereignistyp-MOF-Klasse den Namen HWConfig_CPU.

Verwenden Sie den EventType-Qualifizierer für die MOF-Klasse des Ereignistyps, um den Ereignistyp zu identifizieren. Wenn mehrere Ereignistypen dieselben Ereignisdaten verwenden, können sie dieselbe MOF-Klasse verwenden. Der Anbieter verwendet denselben Ereignistypwert, um das Ereignis beim Festlegen des Class.Type-Members der EVENT_TRACE_HEADER-Struktur zu identifizieren.

Die MOF-Klasse des Ereignistyps enthält Eigenschaften. Die Reihenfolge dieser Eigenschaften definiert das Layout der Ereignisdaten. In der folgenden Tabelle werden die Datentypen und Qualifizierer angegeben, die Sie zum Definieren der Eigenschaften verwenden können. Weitere Informationen zu den Eigenschaften- und Klassenqualifizierern, die Sie verwenden können, finden Sie unter MOF-Qualifierer der Ereignisablaufverfolgung.

Datentyp Qualifizierer BESCHREIBUNG
sint8, uint8 Format Deklariert eine 1-Byte-ganzzahlige Dezimalzahl. Um ein ANSI-Zeichen zu deklarieren, verwenden Sie den Formatqualifizierer, und legen Sie seinen Wert auf "c" fest.
sint16, uint16 Format Deklariert eine 2-Byte-Dezimalzahl. Um anzugeben, dass die Zahl eine hexadezimale Zahl ist, verwenden Sie den Formatqualifizierer. Beispiel: format("x").
sint32, uint32 Format Deklariert eine 4-Byte-Ganze Dezimalzahl. Um anzugeben, dass die Zahl eine hexadezimale Zahl ist, verwenden Sie den Format-Qualifizierer, und legen Sie ihren Wert auf "x" fest.
sint64, uint64 Format Deklariert eine 8-Byte-Ganze Dezimalzahl. Um anzugeben, dass die Zahl eine hexadezimale Zahl ist, verwenden Sie den Format-Qualifizierer, und legen Sie ihren Wert auf "x" fest.
boolean Deklariert einen booleschen Wert. Der Ereignis consumer sollte den Wert als BOOL (4-Byte integer) interpretieren.
char16 Deklariert ein Breitzeichen. Der Ereignis consumer sollte char16-Arrays in Kernelereignissen als breite Zeichenfolgen interpretieren. (Verwenden Sie die Arraygröße, um die Zeichenfolge zu kopieren. Einige Zeichenfolgen können führende NULL-Zeichen enthalten.)
object Erweiterung Deklariert ein binäres Blob. Der Erweiterungsqualifizierer gibt den Typ der Daten im Blob an.
string Format, StringTermination Deklariert einen Zeichenfolgenwert. Um anzugeben, dass die Zeichenfolge eine Breitzeichenzeichenfolge ist, verwenden Sie den Format-Qualifizierer, und legen Sie ihren Wert auf "w" fest. Die Zeichenfolge wird als ANSI-Zeichenfolge betrachtet, wenn Sie den Formatqualifizierer nicht angeben. Verwenden Sie den StringTermination-Qualifizierer, um anzugeben, wie die Zeichenfolge beendet wird.

 

Zum Angeben eines Arrays können Sie eckige Klammern verwenden, []. Die eckigen Klammern können die Größe des Arrays enthalten. Beispiel:

[WmiDataId(1), read] uint8 MyGuid[16];

Sie können auch den Max-Qualifizierer verwenden, um die Größe eines Arrays anzugeben. Beispiel:

[WmiDataId(1), Max(16), read] uint8 MyGuid[];

Wenn Sie die Größe des Arrays in die eckigen Klammern einschließen, generiert der MOF-Compiler den Max-Qualifizierer für Sie.

Es ist wichtig, dass Sie den Description-Qualifizierer für jede Eigenschaft verwenden. Die Beschreibung sollte einen Anzeigenamen enthalten, den der Consumer beim Anzeigen der Eigenschaftswerte verwenden kann.

Das folgende Beispiel zeigt den Inhalt einer MOF-Datei, die eine MOF-Klasse für Anbieter, Ereignisse und Ereignistypen beschreibt.

#pragma namespace("\\\\.\\root\\wmi")

[dynamic: ToInstance, Description("Defines my event provider"),
 Guid("{7C214FB1-9CAC-4b8d-BAED-7BF48BF63BB3}")]
class MyProvider : EventTrace
{
};

[dynamic: ToInstance, Description("Defines a category of events that my provider logs."): Amended,
 Guid("{B49D5931-AD85-4070-B1B1-3F81F1532875}")]
class MyCategory : MyProvider
{
};

[dynamic: ToInstance, Description("Defines an event within the category of events that my provider logs."): Amended,
 EventType(1)]
class MyCategory_MyEvent : MyCategory
{
    [WmiDataId(1), Description("Cost factor"): Amended, read] sint32 Cost;
    [WmiDataId(2), Description("Index values"): Amended, read] uint32 Indices[3];
    [WmiDataId(3), Description("Signature"): Amended, read, StringTermination("NullTerminated"), Format("w")] string Signature;
    [WmiDataId(4), Description("Is complete copy"): Amended, read] boolean IsComplete;
    [WmiDataId(5), Description("Class identifier"): Amended, read, Extension("Guid")] object ID;
};

Beachten Sie, dass die MOF-Klassennamen des Anbieters, Ereignisses und Ereignistyps innerhalb des gesamten Namespace eindeutig sein müssen. Um Benennungskonflikte zu vermeiden, sollten Sie einen eindeutigen und aussagekräftigen Namen für alle Klassennamen verwenden. Klasseneigenschaften sollten auch beschreibend und innerhalb der Klassenhierarchie eindeutig sein. Eine untergeordnete Klasse, die denselben Eigenschaftennamen wie eine übergeordnete Klasse enthält, überschreibt die Eigenschaft der übergeordneten Klasse.

Nachdem Sie Ihre MOF-Klassen definiert haben, verwenden Sie den MOF-Compiler, um Ihr Ereignisschema zu generieren und es dem CIM-Repository hinzuzufügen. Consumer können dann das Schema aus dem Repository lesen und die Ereignisdaten programmgesteuert lesen. Eine vollständige Beschreibung der MOF-Syntax und die Verwendung des MOF-Compilers (Mofcomp.exe) zum Hinzufügen Ihrer MOF-Klassen zum CIM-Repository finden Sie unter Verwaltetes Objektformat. Informationen zur Verwendung von Wbemtest.exe für den Zugriff auf das CIM-Repository finden Sie unter Windows-Verwaltungsinstrumentation (WMI ).

MoF-Klasse mit Versionsverwaltung

Wenn Sie eine MOF-Klasse des Ereignistyps hinzufügen oder ändern, besteht die Konvention darin, sowohl die MOF-Ereignisklasse als auch ihre untergeordneten MOF-Klassen zu versionieren. Um die aktuelle MOF-Ereignisklasse zu versionieren, fügen Sie _Vn an den Klassennamen an, wobei n eine inkrementelle Zahl ab 0 ist. Wenn dies die erste Revision der -Klasse ist, fügen Sie _V0 an den Klassennamen an. Außerdem müssen Sie der Klasse den EventVersion-Qualifizierer hinzufügen. Verwenden Sie dieselbe Versionsnummer, die Sie im Klassennamen für den Wert des EventVersion-Qualifizierers verwendet haben.

Die neue Version der MOF-Ereignisklasse muss denselben Namen und guid-Qualifizierer wie die ursprüngliche Klasse verwenden. Die neue Klasse kann optional den EventVersion-Qualifizierer hinzufügen. Die MOF-Ereignisklasse, die den EventVersion-Qualifizierer nicht enthält, wird als neueste Version betrachtet. Wenn alle Versionen der Klasse einen EventVersion-Qualifizierer enthalten, wird die Klasse mit der höchsten Versionsnummer als neueste Version betrachtet. Der Anbieter verwendet das Class.Version-Member der EVENT_TRACE_HEADER-Struktur , um die Version des Ereignisses zu identifizieren, das in der Ablaufverfolgung enthalten ist.

Das folgende Beispiel zeigt, wie eine MOF-Ereignisklasse versioniert wird.

#pragma namespace("\\\\.\\root\\wmi")
#pragma classflags("forceupdate")

[dynamic: ToInstance, Description("Defines my event provider"),
 Guid("{7C214FB1-9CAC-4b8d-BAED-7BF48BF63BB3}")]
class MyProvider : EventTrace
{
};

[dynamic: ToInstance, Description("Defines a category of events that my provider logs."),
 Guid("{B49D5931-AD85-4070-B1B1-3F81F1532875}"),
 EventVersion(1)]
class MyCategory : MyProvider
{
};

[dynamic: ToInstance, Description("Defines an event within the category of events that my provider logs."): Amended,
 EventType(1),
 EventName("MyEvent")]
class MyCategory_MyEvent : MyCategory
{
    [WmiDataId(1), Description("Cost factor"): Amended, read] sint32 Cost;
    [WmiDataId(2), Description("Index values"): Amended, read] uint32 Indices[3];
    [WmiDataId(3), Description("Signature"): Amended, read, StringTermination("NullTerminated"), Format("w")] string Signature;
    [WmiDataId(4), Description("Is complete copy"): Amended, read] boolean IsComplete;
    [WmiDataId(5), Description("Identifier"): Amended, read, Extension("Guid")] object ID;
    [WmiDataId(6), Description("Buffer Size"): Amended, read] uint32 Size;
};

[dynamic: ToInstance, Description("Defines a category of events that my provider logs."): Amended,
 Guid("{B49D5931-AD85-4070-B1B1-3F81F1532875}"),
 EventVersion(0)]
class MyCategory_V0 : MyProvider
{
};

[dynamic: ToInstance, Description("Defines an event within the category of events that my provider logs."): Amended,
 EventType(1)]
class MyCategory_V0_MyEvent : MyCategory_V0
{
    [WmiDataId(1), Description("Cost factor"): Amended, read] sint32 Cost;
    [WmiDataId(2), Description("Index values"): Amended, read] uint32 Indices[3];
    [WmiDataId(3), Description("Signature"): Amended, read, StringTermination("NullTerminated"), Format("w")] string Signature;
    [WmiDataId(4), Description("Is complete copy"): Amended, read] boolean IsComplete;
    [WmiDataId(5), Description("Identifier"): Amended, read, Extension("Guid")] object ID;
};