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