클래식 공급자에 대한 이벤트 스키마 게시
클래식 공급자는 MOF( Managed Object Format )를 사용하여 이벤트 데이터의 레이아웃을 게시해야 합니다. 그런 다음, 소비자는 런타임에 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 한정자를 참조하세요.
데이터 형식 | 한정자 | Description |
---|---|---|
sint8, uint8 | 형식 | 1 바이트 10진수를 선언합니다. ANSI 문자를 선언하려면 형식 한정자를 사용하고 해당 값을 "c"로 설정합니다. |
sint16, uint16 | 형식 | 2 바이트 10진수를 선언합니다. 숫자가 16진수임을 나타내려면 서식 한정자를 사용합니다. 예를 들어 format("x")입니다. |
sint32, uint32 | 형식 | 4 바이트 10진수를 선언합니다. 숫자가 16진수임을 나타내려면 서식 한정자를 사용하고 해당 값을 "x"로 설정합니다. |
sint64, uint64 | 형식 | 8 바이트 10진수를 선언합니다. 숫자가 16진수임을 나타내려면 서식 한정자를 사용하고 해당 값을 "x"로 설정합니다. |
boolean | 부울 값을 선언합니다. 이벤트 소비자는 값을 BOOL(4 바이트 정수)으로 해석해야 합니다. | |
char16 | 와이드 문자를 선언합니다. 이벤트 소비자는 커널 이벤트의 char16 배열을 와이드 문자 문자열로 해석해야 합니다. (배열 크기를 사용하여 문자열을 복사합니다. 일부 문자열에는 선행 NULL 문자가 포함될 수 있습니다.) | |
object | 내선 번호 | 이진 Blob을 선언합니다. 확장 한정자는 Blob의 데이터 형식을 나타냅니다. |
string | Format, StringTermination | 문자열 값을 선언합니다. 문자열이 와이드 문자열임을 나타내려면 서식 한정자를 사용하고 해당 값을 "w"로 설정합니다.
서식 한정자를 지정하지 않으면 문자열은 ANSI 문자열로 간주됩니다. 문자열이 종료되는 방법을 나타내려면 StringTermination 한정자를 사용합니다. |
배열을 지정하려면 대괄호 []를 사용할 수 있습니다. 대괄호는 배열의 크기를 포함할 수 있습니다. 예:
[WmiDataId(1), read] uint8 MyGuid[16];
최대 한정자를 사용하여 배열 크기를 지정할 수도 있습니다. 예:
[WmiDataId(1), Max(16), read] uint8 MyGuid[];
대괄호에 배열 크기를 포함하면 MOF 컴파일러에서 Max 한정자를 생성합니다.
각 속성에 대해 설명 한정자를 사용하는 것이 중요합니다. 설명에는 소비자가 속성 값을 표시할 때 사용할 수 있는 표시 이름이 포함되어야 합니다.
다음 예제에서는 공급자, 이벤트 및 이벤트 형식 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)를 사용하여 CIM 리포지토리에 MOF 클래스를 추가하려면 관리되는 개체 형식을 참조하세요. Wbemtest.exe 사용하여 CIM 리포지토리에 액세스하는 방법에 대한 자세한 내용은 WMI( Windows Management Instrumentation )를 참조하세요.
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;
};