Отправка события с помощью IoWMIWriteEvent
Драйвер может вызвать IoWMIWriteEvent для отправки любого события. Событие может состоять из одного элемента, одного экземпляра или всех экземпляров блока данных и может использовать динамические имена экземпляров.
В отличие от структур WNODE_XXX, передаваемых с запросами или запросами на изменение, которые выделяются и частично инициализированы WMI, драйвер должен выделить и инициализировать все элементы структуры WNODE_XXX, содержащей событие.
Драйвер должен отправлять событие только после того, как WMI отправит запрос IRP_MN_ENABLE_EVENTS для включения события. Затем, когда происходит условие триггера события, драйвер:
Выделяет буфер из непагрегированного пула, чтобы он содержал структуру WNODE_XXX, необходимую для события, включая пространство для переменных данных, если таковые есть.
В зависимости от события драйвер может выделить для события WNODE_SINGLE_ITEM, WNODE_SINGLE_INSTANCE или WNODE_ALL_DATA . Размер данных WNODE_XXX и переменных не должен превышать заданное реестром ограничение в 1 КБ.
Инициализирует все элементы структуры WNODE_XXX, включая WnodeHeader.Flags:
Драйвер устанавливает флаг WNODE_FLAG_EVENT_ITEM , чтобы указать, что структура является событием.
Драйвер устанавливает один из следующих флагов, чтобы указать тип структуры WNODE_XXX :
WNODE_FLAG_ALL_DATA
WNODE_FLAG_SINGLE_INSTANCE
WNODE_FLAG_SINGLE_ITEM
Драйвер устанавливает или очищает следующие флаги, чтобы указать, использует ли блок статические или динамические имена экземпляров:
WNODE_FLAG_STATIC_INSTANCE_NAMES
WNODE_FLAG_PDO_INSTANCE_NAMES
Драйвер может задать дополнительные флаги в зависимости от события.
Приводит указатель на WNODE_XXX к PWNODE_EVENT_ITEM.
Вызывает IoWMIWriteEvent с указателем.
Если IoWMIWriteEvent завершается успешно, WMI освобождает память, выделенную драйвером, для события.
После возврата IoWMIWriteEvent драйвер возобновляет мониторинг состояния триггера события и отправку события при каждом возникновении условия триггера, пока WMI не отправит IRP_MN_DISABLE_EVENTS запрос на отключение этого события.
Если размер события превышает максимальное значение в 1 КБ (не рекомендуется), драйвер должен вызвать IoWmiWriteEvent с инициализированным WNODE_EVENT_REFERENCE , который указывает GUID события, его размер и индекс экземпляра (для имен статических экземпляров) или имя (для динамических имен экземпляров). WMI будет использовать сведения из WNODE_EVENT_REFERENCE для запроса события.
Драйвер может отправлять события, не использующие динамические имена экземпляров и состоящие из одного экземпляра, путем вызова подпрограммы библиотеки WMI WmiFireEvent. Драйверу не нужно выделять и инициализировать структуру WNODE_XXX для вызова WmiFireEvent . WMI упаковывает данные событий драйвера в WNODE_SINGLE_INSTANCE и доставляет их потребителям данных. Дополнительные сведения об отправке событий с помощью WmiFireEvent см. в разделе Отправка события с помощью WmiFireEvent.