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

Драйвер может использовать события WMI для уведомления приложений в пользовательском режиме о событиях, не требуя от приложений опроса или отправки IRPs. Драйвер должен использовать события 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 в режиме ядра WmiFireEvent. Драйвер может вызывать WmiFireEvent для отправки только тех событий, которые не используют динамические имена экземпляров, и которые основывают статические имена экземпляров на одной строке базового имени или идентификаторе экземпляра устройства PDO. Кроме того, событие должно быть одним экземпляром, то есть драйвер не может вызывать WmiFireEvent для отправки события, состоящего из одного элемента или нескольких экземпляров. Дополнительные сведения см. в о отправке события с помощью WmiFireEvent.

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