Поделиться через


Публикация схемы событий для классического поставщика

Классические поставщики должны использовать формат управляемого объекта (MOF) для публикации макета данных событий. Затем потребители могут считывать опубликованный макет из WMI во время выполнения и использовать его для чтения данных события.

При использовании MOF для публикации макета данных события в WMI обычно создаются следующие три типа классов MOF в пространстве имен root\wmi:

Классы 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;
};