クラシック プロバイダーのイベント スキーマの発行

クラシック プロバイダーは、 マネージド オブジェクト形式 (MOF) を使用して、イベント データのレイアウトを公開する必要があります。 その後、コンシューマーは実行時に WMI から発行されたレイアウトを読み取り、それを使用してイベント データを読み取ることができます。

MOF を使用して WMI でイベント データのレイアウトを発行する場合は、通常、root\wmi 名前空間に次の 3 種類の 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 Format 1 バイトの 10 進整数を宣言します。 ANSI 文字を宣言するには、 Format 修飾子を使用し、その値を "c" に設定します。
sint16uint16 Format 2 バイトの 10 進整数を宣言します。 数値が 16 進数であることを示すには、 Format 修飾子を使用します。 たとえば、format("x") などです。
sint32uint32 Format 4 バイトの 10 進整数を宣言します。 数値が 16 進数であることを示すには、 Format 修飾子を使用し、その値を "x" に設定します。
sint64uint64 Format 8 バイトの 10 進整数を宣言します。 数値が 16 進数であることを示すには、 Format 修飾子を使用し、その値を "x" に設定します。
boolean ブール値を宣言します。 イベント コンシューマーは、値を BOOL (4 バイト整数) として解釈する必要があります。
char16 ワイド文字を宣言します。 イベント コンシューマーは、カーネル イベント内の char16 配列をワイド文字列として解釈する必要があります。 (配列サイズを使用して文字列をコピーします。一部の文字列には、先頭に NULL 文字が含まれる場合があります)。)
object 拡張子 バイナリ BLOB を宣言します。 Extension 修飾子は、BLOB 内のデータの種類を示します。
string FormatStringTermination 文字列値を宣言します。 文字列がワイド文字列であることを示すには、 Format 修飾子を使用し、その値を "w" に設定します。 Format 修飾子を指定しない場合、文字列は 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 リポジトリに追加する方法の詳細については、「 マネージド オブジェクト形式」を参照してください。 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;
};