Трассировка событий WMI

В этом разделе описываются расширения WMI для WDM (поддерживаемые Windows 2000 и более поздних версий), которые драйверы режима ядра, как поставщики информации, могут использовать для предоставления информации потребителям информации. Драйверы обычно предоставляют сведения, которые потребитель использует для определения конфигурации драйвера и использования ресурсов. Помимо расширений WMI для WDM, API пользовательского режима поддерживает поставщиков или потребителей сведений о событиях WMI. Дополнительные сведения см. в пакете Windows SDK.

Средство ведения журнала трассировки событий поддерживает до 32 экземпляров. Один из экземпляров зарезервирован для трассировки ядра. Средство ведения журнала поддерживает трассировку высокой частоты событий.

События трассировки определяются так же, как и другие события WMI. События WMI описаны в MOF-файле. Дополнительные сведения об описаниях событий WMI см. в разделе Синтаксис MOF для блоков данных И событий WMI.

Процесс, с помощью которого сведения о драйверах режима ядра интегрируются в существующую инфраструктуру WMI. Чтобы регистрировать события трассировки, драйвер выполняет следующие действия:

  1. Зарегистрируйтесь в качестве поставщика WMI, вызвав IoWMIRegistrationControl.

  2. Пометьте события как отслеживаемые, задав WMIREG_FLAG_TRACED_GUID в элементе Flags структуры WMIREGGUID , которая передается, когда драйвер регистрирует события с помощью WMI.

  3. Укажите одно событие в качестве события управления для общего включения или отключения набора событий трассировки, задав WMIREG_FLAG_TRACE_CONTROL_GUID в элементе Flags структуры WMIREGGUID , который передается, когда драйвер регистрирует события с помощью WMI.

  4. При получении запроса от WMI на включение событий, в которых GUID соответствует GUID элемента управления трассировкой, драйвер должен сохранить дескриптор в средстве ведения журнала. Значение потребуется при записи события. Сведения об использовании этого дескриптора см. в шаге 6. Значение дескриптора средства ведения журнала содержится в элементе HistoricalContextWNODE_HEADER части буфера WMI, которая является частью параметров в запросе на включение событий.

  5. Решите, будет ли событие трассировки отправляться потребителям событий WMI или предназначено только для средства ведения журнала событий WMI. Это определит, откуда должна поступать память для структуры EVENT_TRACE_HEADER . Эта память в конечном итоге будет передана в IoWMIWriteEvent.

    Если событие является только событием журнала, WMI не удаляет память. В этом случае драйвер должен передать буфер в стеке или повторно использовать выделенный буфер для этой цели. По соображениям производительности драйвер должен свести к минимуму все ненужные вызовы для выделения или освобождения памяти. Несоблюдение этой рекомендации приведет к нарушению целостности сведений о времени, содержащихся в файле журнала.

    Если событие должно быть отправлено как средству ведения журнала, так и потребителям событий WMI, то память должна быть выделена из пула без пагузированного пула. В этом случае событие будет отправлено в средство ведения журнала, а затем перенаправлено в WMI для отправки потребителям событий WMI, которые запросили уведомление о событии. Затем WMI освободит память для события в соответствии с поведением IoWMIWriteEvent.

  6. После того как память для EVENT_TRACE_HEADER и все данные о событиях драйвера,если таковые имеются, будут защищены, необходимо задать следующие сведения:

    Задайте для элемента Size значение sizeof(EVENT_TRACE_HEADER) и размер всех дополнительных данных о событиях драйвера, которые будут добавлены в конец EVENT_TRACE_HEADER.

    Задайте для элемента Flags значение WNODE_FLAG_TRACED_GUID, чтобы событие было отправлено в средство ведения журнала. Если событие также должно быть отправлено потребителям событий WMI, задайте WNODE_FLAG_LOG_WNODE. Обратите внимание, что нет необходимости задавать WNODE_FLAG_TRACED_GUID, если параметр WNODE_FLAG_LOG_WNODE. Если оба параметра заданы, WNODE_FLAG_TRACED_GUID будет иметь приоритет, и событие не будет отправлено потребителям событий WMI.

    Задайте guid или элемент GuidPtr . При использовании GuidPtr задайте WNODE_FLAG_USE_GUID_PTR в элементе Flags .

    При необходимости укажите значение timeStamp. Если драйвер не указывает значение TimeStamp , средство ведения журнала заполнит его. Если драйвер не хочет, чтобы средство ведения журнала устанавливал метку времени, он должен задать WNODE_FLAG_USE_TIMESTAMP в элементе Flags .

    Задайте любой из следующих элементов EVENT_TRACE_HEADER , имеющих значение для драйвера: Class.Type, Class.Level и Class.Version.

    Наконец, приведите EVENT_TRACE_HEADER к WNODE_HEADER и задайте значение HistoricalContextWnode дескриптору средства ведения журнала, который был сохранен на шаге 4 выше.

  7. Вызовите IoWMIWriteEvent с указателем на структуру EVENT_TRACE_HEADER .

Драйвер должен продолжать регистрировать события трассировки, связанные с GUID элемента управления, пока драйвер не получит уведомление об отключении ведения журнала событий через запрос IRP_MN_DISABLE_EVENTS .