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

Драйвер может использовать события WMI для уведомления приложений пользовательского режима о событиях, не требуя от приложений опроса или отправки IRP. Драйвер должен использовать события WMI для уведомления клиентов WMI об исключительных условиях, а не в качестве альтернативы ведению журнала ошибок. Драйвер должен поддерживать все стандартные блоки событий, определенные для типа устройства в Wmicore.mof, а также может определять и регистрировать дополнительные настраиваемые блоки событий для поддержки уведомлений, относящихся к устройству.

Блок событий — это просто блок данных, производный от абстрактного базового класса WMIEvent. Блок событий может содержать те же данные, что и блок данных, или быть пустым, то есть блок событий не должен содержать элементы данных, определяемые драйвером. Если блок событий содержит данные, общий размер WNODE_XXX и данных не должен превышать заданное реестром ограничение в 1 килобайт. Как правило, небольшие события приводят к повышению производительности системы и более своевременному уведомлению. Сведения об определении блоков см. в разделах Синтаксис MOF для блоков данных и событий WMI и Проектирование блоков данных и событий WMI.

Драйвер указывает на поддержку события, регистрируя соответствующий блок событий с WMIREG_FLAG_EVENT_ONLY_GUID, заданным в структуре WMIREGGUID блока. Сведения о регистрации блоков см. в разделе Регистрация в качестве поставщика данных WMI.

Когда пользователь клиента WMI запрашивает уведомление о событии, WMI отправляет драйверу запрос IRP_MN_ENABLE_EVENTS , который уведомляет драйвер о начале мониторинга состояния триггера, определяемого драйвером. Затем при возникновении условия триггера драйвер отправляет событие в WMI, который доставляет его всем потребителям данных, зарегистрированным для события.

Драйвер отправляет событие в WMI одним из следующих способов:

  • Вызовите подпрограмму библиотеки WMI в режиме ядра WMI WMIFireEvent. Драйвер может вызывать WmiFireEvent для отправки только событий, которые не используют динамические имена экземпляров и которые используют базовые статические имена экземпляров в одной строке базового имени или идентификаторе экземпляра устройства PDO. Кроме того, событие должно быть одним экземпляром, то есть драйвер не может вызвать WmiFireEvent для отправки события, состоящего из одного элемента или нескольких экземпляров. Дополнительные сведения см. в разделе Отправка события с помощью WmiFireEvent.

  • Вызовите подпрограмму режима ядра IoWMIWriteEvent с указателем на выделенную драйвером и инициализированную структуру WNODE_XXX, содержащую данные события. Дополнительные сведения см. в разделе Отправка события с помощью IoWMIWriteEvent.