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


Отправка события с помощью IoWMIWriteEvent

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

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

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

  1. Выделяет буфер из непагрегированного пула, чтобы он содержал структуру WNODE_XXX, необходимую для события, включая пространство для переменных данных, если таковые есть.

    В зависимости от события драйвер может выделить для события WNODE_SINGLE_ITEM, WNODE_SINGLE_INSTANCE или WNODE_ALL_DATA . Размер данных WNODE_XXX и переменных не должен превышать заданное реестром ограничение в 1 КБ.

  2. Инициализирует все элементы структуры 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

    • Драйвер может задать дополнительные флаги в зависимости от события.

  3. Приводит указатель на WNODE_XXX к PWNODE_EVENT_ITEM.

  4. Вызывает 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.