共用方式為


發佈傳統提供者的事件架構

傳統 提供者應該使用 Managed Object Format (MOF)來發佈其事件資料的結構。 使用者可以在執行時從 WMI 閱讀已發佈的佈局,並使用它來讀取事件數據。

如果您使用 MOF 在 WMI 中發佈事件資料的版面配置,您通常會在 root\wmi 命名空間中建立下列三種類型的 MOF 類別:

MOF提供者類別

如果您發佈事件數據的版面配置,您必須建立可識別提供者的MOF類別。 這個類別必須衍生自 EventTrace MOF類別,而且必須是空的(沒有屬性或方法)。 類別也必須包含可唯一識別提供者的 Guid 限定符。 當您呼叫 RegisterTraceGuids 函式來註冊您的提供者時,這是您所使用的相同 GUID。

事件MOF類別

事件MOF類別會定義提供者所提供的事件類別。 這個類別衍生自提供者MOF類別,而且必須是空的(沒有屬性或方法)。 類別也必須包含 Guid 限定符,其可唯一識別其子類別所定義的事件類別。 提供者在設定 EVENT_TRACE_HEADER 結構的 Guid 成員時,會使用相同的 GUID。

MOF 類別的事件類型

事件類型MOF類別會定義實際的事件數據。 這個類別衍生自其父事件MOF類別。 命名事件類型MOF類別時,慣例是在事件類型MOF類別名稱開頭使用事件MOF類別名稱。 例如,如果事件MOF類別名稱為HWConfig,而事件類型MOF類別代表 CPU 資訊,您應該將事件類型命名為MOF類別,HWConfig_CPU。

在事件類型MOF類別上使用 EventType 限定符來識別事件類型。 如果多個事件類型使用相同的事件數據,則可以使用相同的MOF類別。 提供者會在設定 EVENT_TRACE_HEADER 結構的 Class. Type 成員時,使用相同的事件類型值來識別事件。

事件類型MOF類別包含屬性。 這些屬性的順序會定義事件數據的版面配置。 下表會識別可用來定義屬性的數據類型和限定符。 如需您可以使用的屬性和類別限定符的詳細資訊,請參閱 事件追蹤MOF限定符

數據類型 限定 符 描述
sint8uint8 格式 宣告1位元組的十進位整數。 若要宣告 ANSI 字元,請使用 Format 限定符,並將其值設定為 “c”。
sint16uint16 格式 宣告 2 位元組的十進制整數。 若要指出數位是十六進位數位,請使用 Format 限定符。 例如,format(“x”)。
sint32uint32 格式 宣告一個 4 位元組的十進制整數。 若要指出數位是十六進位數位,請使用 Format 限定符,並將其值設定為 “x”。
sint64uint64 格式 宣告8位元組的十進位整數。 若要指出數位是十六進位數位,請使用 Format 限定符,並將其值設定為 “x”。
布爾值 宣告布爾值。 事件取用者應該將值解譯為BOOL(4位元組整數)。
char16 宣告寬字元。 事件消費者應該將內核事件中的 char16 陣列解釋為寬字元字串。 (使用陣列大小來複製字串。某些字串可能包含前置NULL字元。
物件 擴充功能 宣告二進位資料塊。 延伸模組 限定符表示 Blob 中的數據類型。
字串 FormatStringTermination 宣告字串值。 若要指出字串是寬字元字串,請使用 Format 限定符,並將其值設定為 “w”。 如果您未指定 格式 限定符,字串會被視為 ANSI 字串。 若要指出字串的終止方式,請使用 StringTermination 限定符。

 

若要指定陣列,您可以使用方括弧 []。 方括號可以包含陣列的大小。 例如:

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

您也可以使用 Max 限定符來指定陣列的容量。 例如:

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

如果您在方括弧中包含陣列的大小,MOF 編譯程序會自動為您生成 Max 限定符。

請務必針對每個屬性使用 Description 限定符。 描述應該包含取用者在顯示屬性值時可以使用的顯示名稱。

下列範例顯示描述提供者、事件和事件類型MOF類別之MOF檔案的內容。

#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;
};

請注意,提供者、事件和事件類型MOF類別名稱在整個命名空間內必須是唯一的。 若要避免命名衝突,您應該對所有類別名稱使用唯一和描述性的名稱。 類別屬性也應該在其類別階層中具有描述性和唯一性—包含與父類別相同的屬性名稱的子類別會覆寫父類別的屬性。

定義MOF類別之後,請使用MOF編譯程式來產生事件架構,並將它新增至 CIM 存放庫。 取用者接著可以從存放庫讀取架構,並以程式設計方式讀取事件數據。 如需MOF語法的完整描述,以及使用MOF編譯程式 (Mofcomp.exe) 將MOF類別新增至 CIM 存放庫,請參閱 Managed 物件格式。 如需使用 Wbemtest.exe 存取 CIM 存放庫的資訊,請參閱 Windows Management Instrumentation (WMI)。

版本化MOF類別

如果您新增或變更事件類型MOF類別,慣例是同時設定事件MOF類別及其子事件類型MOF類別的版本。 若要建立目前事件MOF類別的版本,請將_Vn附加至類別名稱,其中 n是從 0 開始的累加數位。 如果這是類別的第一個修訂,請將_V0附加至類別名稱。 您也必須將 EventVersion 限定符新增至 類別。 針對 EventVersion 限定符的值,使用您在類別名稱中使用的相同版本號碼。

新版的事件MOF類別必須使用與原始類別相同的名稱和 Guid 限定符。 新的類別可以選擇性地新增 EventVersion 限定符。 不包含 EventVersion 限定符的事件 MOF 類別會被視為最新版本,或如果類別的所有版本都包含 EventVersion 限定符,則具有最高版本號碼的類別會被視為最新版本。 提供者會使用 EVENT_TRACE_HEADER 結構的 Class.Version 成員,來識別追蹤中包含的事件版本。

下列範例示範如何建立事件MOF類別的版本。

#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;
};