Публикация схемы событий для классического поставщика
Классические поставщики должны использовать формат управляющего объекта (MOF) для публикации макета данных о событиях. Затем потребители могут считывать опубликованный макет из WMI в режиме выполнения и использовать его для чтения данных события.
При использовании MOF для публикации макета данных событий в WMI обычно создаются следующие три типа классов MOF в пространстве имен root\wmi:
- класс поставщика MOF
- Один или несколько классов событий MOF
- Один или несколько классов MOF типа событий
Классы поставщика MOF
При публикации макета данных события необходимо создать класс MOF, определяющий поставщика. Этот класс должен быть производным от класса EventTrace MOF и должен быть пустым (свойства или методы не должны быть пустыми). Класс также должен включать квалификатор guid, который однозначно идентифицирует поставщика. Это тот же GUID, который вы используете при вызове функции RegisterTraceGuids для регистрации поставщика.
Классы MOF событий
Класс MOF события определяет класс событий, которые предоставляет поставщик. Этот класс является производным от класса MOF поставщика и должен быть пустым (свойства или методы не должны быть пустыми). Класс также должен включать квалификатор Guid, который однозначно идентифицирует класс событий, которые определяются его дочерними классами. Поставщик использует этот же GUID при установке члена GUID в структуре EVENT_TRACE_HEADER.
Классы типа события MOF
Класс MOF типа события определяет фактические данные о событиях. Этот класс является производным от родительского класса MOF события. При именовании класса MOF типа события рекомендуется использовать имя класса MOF события в начале имени класса MOF типа события. Например, если имя класса MOF события — HWConfig, а класс MOF типа события представляет сведения о ЦП, следует присвоить классу MOF типа события HWConfig_CPU.
Используйте квалификатор EventType в классе типа события MOF, чтобы определить тип события. Если несколько типов событий используют одни и те же данные событий, они могут использовать один и тот же класс MOF. Поставщик использует то же значение типа события для идентификации события, когда устанавливает член класса.Type структуры EVENT_TRACE_HEADER.
Класс типа события MOF содержит свойства. Порядок этих свойств определяет макет данных события. В следующей таблице определены типы данных и квалификаторы, которые можно использовать для определения свойств. Дополнительные сведения о квалификаторах свойств и классов, которые можно использовать, см. раздел Квалификаторы трассировки событий MOF.
Тип данных | Квалификаторы | Описание |
---|---|---|
sint8, uint8 | Формат | Объявляет 1-байтовое десятичное целое число. Чтобы объявить символ ANSI, используйте квалификатор формата и задайте для него значение "c". |
sint16, uint16 | Формат | Объявляет 2-байтовое десятичное целое число. Чтобы указать, что число является шестнадцатеричным числом, используйте квалификатор формата . Например, формат("x"). |
sint32, uint32 | Формат | Объявляет 4-байтовое десятичное целое число. Чтобы указать, что число является шестнадцатеричным числом, используйте квалификатор формата и задайте для него значение x. |
sint64, uint64 | Формат | Объявляет 8-байтовое десятичное целое число. Чтобы указать, что число является шестнадцатеричным числом, используйте квалификатор формата и задайте для него значение x. |
булевое значение | Объявляет логическое значение. Потребитель события должен интерпретировать значение как BOOL (4-байтовое целое число). | |
char16 | Объявляет расширенный символ. Потребитель событий должен интерпретировать массивы char16 в событиях ядра как широкие строки символов. (Используйте размер массива для копирования строки. Некоторые строки могут содержать ведущие символы NULL.) | |
объекта | расширения | Объявляет двоичный блок. Квалификатор расширения указывает тип данных в бинарном объекте. |
строка | формат, StringTermination | Объявляет строковое значение. Чтобы указать, что строка является строкой с широким символом, используйте квалификатор формата и задайте для него значение "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 см. в разделе Формат управляемых объектов. Сведения об использовании Wbemtest.exe для доступа к репозиторию CIM см. в инструментарии управления Windows (WMI).
Класс MOF для управления версиями
Если вы добавляете или изменяете класс MOF типа события, принято присваивать версию как этому, так и его дочерним классам MOF типов событий. Чтобы изменить версию текущего класса события MOF, добавьте _Vn к имени класса, где n является числом, увеличивающимся от 0. Если это первая редакция класса, добавьте _V0 к имени класса. Также необходимо добавить к классу квалификатор EventVersion. Используйте тот же номер версии, который использовался в имени класса для значения квалификатора EventVersion.
Новая версия класса MOF события должна использовать то же имя и Guid квалификатором в качестве исходного класса. Новый класс может при желании добавить квалификатор EventVersion. Класс MOF события, который не содержит квалификатор EventVersion, считается последней версией или если все версии класса содержат квалификатор EventVersion EventVersion, то класс с самым высоким номером версии считается последней версией. Поставщик использует элемент Class.Version структуры EVENT_TRACE_HEADER для идентификации версии события, включенного в трассировку.
В следующем примере показано, как изменить класс 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;
};