Compartir a través de


Envío de un evento con IoWMIWriteEvent

Un controlador puede llamar a IoWMIWriteEvent para enviar cualquier evento. El evento puede constar de un solo elemento, una sola instancia o todas las instancias de un bloque de datos, y puede usar nombres de instancia dinámicos.

A diferencia de WNODE_XXX estructuras pasadas con solicitudes de consulta o cambio, que WMI asigna e inicializa parcialmente, el controlador debe asignar e inicializar todos los miembros de la estructura WNODE_XXX que contiene un evento.

Un controlador debe enviar un evento solo después de que WMI haya enviado una solicitud de IRP_MN_ENABLE_EVENTS para habilitar el evento. A continuación, cuando se produce la condición del desencadenador del evento, el controlador:

  1. Asigna un búfer del grupo no paginado para contener la estructura WNODE_XXX necesaria para el evento, incluido el espacio para los datos variables, si existe.

    Según el evento, el controlador puede asignar un WNODE_SINGLE_ITEM, un WNODE_SINGLE_INSTANCE o un WNODE_ALL_DATA para el evento. El tamaño de los datos de WNODE_XXX más variables no debe superar el límite definido por el Registro de 1K.

  2. Inicializa todos los miembros de la estructura WNODE_XXX , incluido WnodeHeader.Flags:

    • El controlador establece la marca WNODE_FLAG_EVENT_ITEM para indicar que la estructura es un evento.

    • El controlador establece una de las marcas siguientes para indicar el tipo de estructura WNODE_XXX :

      WNODE_FLAG_ALL_DATA

      WNODE_FLAG_SINGLE_INSTANCE

      WNODE_FLAG_SINGLE_ITEM

    • El controlador establece o borra las marcas siguientes para indicar si el bloque usa nombres de instancia estáticos o dinámicos:

      WNODE_FLAG_STATIC_INSTANCE_NAMES

      WNODE_FLAG_PDO_INSTANCE_NAMES

    • El controlador puede establecer marcas adicionales en función del evento.

  3. Convierte un puntero al WNODE_XXX en un PWNODE_EVENT_ITEM.

  4. Llama a IoWMIWriteEvent con el puntero.

    Si IoWMIWriteEvent se completa correctamente, WMI libera la memoria asignada por el controlador para el evento.

Después de que IoWMIWriteEvent vuelva, el controlador reanuda la supervisión de la condición del desencadenador del evento y envía el evento cada vez que se produce su condición de desencadenador, hasta que WMI envía una solicitud de IRP_MN_DISABLE_EVENTS para deshabilitar ese evento.

Si el tamaño de un evento supera el máximo definido por el Registro de 1K (no recomendado), el controlador debe llamar a IoWmiWriteEvent con un WNODE_EVENT_REFERENCE inicializado que especifique el GUID del evento, su tamaño y su índice de instancia (para nombres de instancia estáticos) o nombre (para nombres de instancia dinámicos). WMI usará la información del WNODE_EVENT_REFERENCE para consultar el evento.

Un controlador puede enviar eventos que no usan nombres de instancia dinámicos y que consta de una sola instancia llamando a la rutina de biblioteca WmiFireEvent de la biblioteca WMI. El controlador no necesita asignar e inicializar una estructura WNODE_XXX para una llamada WmiFireEvent . WMI empaqueta los datos de eventos del controlador en un WNODE_SINGLE_INSTANCE y los entrega a los consumidores de datos. Para obtener más información sobre el envío de eventos con WmiFireEvent, consulte Envío de un evento con WmiFireEvent.