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

傳統 提供者應該使用 Managed 物件格式 (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 字元,請使用 格式 限定詞,並將其值設定為 「c」。
sint16uint16 格式 宣告 2 位元組的十進位整數。 若要指出數位是十六進位數位,請使用 格式 限定詞。 例如,格式 (「x」) 。
sint32uint32 格式 宣告 4 位元組的十進位整數。 若要指出數位是十六進位數位,請使用 格式 限定詞,並將其值設定為 「x」。
sint64uint64 格式 宣告 8 位元組的十進位整數。 若要指出數位是十六進位數位,請使用 格式 限定詞,並將其值設定為 「x」。
boolean 宣告布林值。 事件取用者應該將值解譯為 BOOL (4 位元組整數) 。
char16 宣告寬字元。 事件取用者應該將核心事件中的 char16 陣列解譯為寬字元字串。 (使用陣列大小來複製字串。某些字串可能包含前置 Null 字元。)
object 副檔名 宣告二進位 Blob。 擴充限定詞表示 Blob 中的資料類型。
string FormatStringTermination 宣告字串值。 若要指出字串是寬字元字串,請使用 格式 限定詞,並將其值設定為 「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;
};