Compartir a través de


Envío de eventos WMI

Un controlador puede usar eventos WMI para notificar a las aplicaciones en modo de usuario los eventos sin necesidad de que las aplicaciones sondeen o envíen IRP. Un controlador debe usar eventos WMI para notificar a los clientes WMI condiciones excepcionales, no como alternativa al registro de errores. Un controlador debe admitir los bloques de eventos estándar definidos para su tipo de dispositivo en Wmicore.mof y podría definir y registrar bloques de eventos personalizados adicionales para admitir notificaciones específicas del dispositivo.

Un bloque de eventos es simplemente un bloque de datos que deriva de la clase base abstracta WMIEvent. Un bloque de eventos puede contener cualquiera de los mismos datos que un bloque de datos o puede estar vacío; es decir, un bloque de eventos no necesita contener ningún elemento de datos definido por el controlador. Si un bloque de eventos contiene datos, el tamaño total del WNODE_XXX más los datos no debe superar el límite definido por el Registro de 1 kilobyte. En general, los eventos más pequeños dan como resultado un mejor rendimiento del sistema y una notificación más oportuna. Para obtener información sobre cómo definir bloques, vea Sintaxis MOF para datos de WMI y bloques de eventos y diseño de datos de WMI y bloques de eventos.

Un controlador indica la compatibilidad con un evento registrando el bloque de eventos correspondiente con WMIREG_FLAG_EVENT_ONLY_GUID establecido en la estructura WMIREGGUID del bloque. Para obtener información sobre el registro de bloques, vea Registro como proveedor de datos WMI.

Cuando un usuario cliente WMI solicita una notificación de un evento, WMI envía una solicitud de IRP_MN_ENABLE_EVENTS al controlador, que alerta al controlador para comenzar a supervisar la condición de desencadenador determinada por el controlador del evento. A continuación, cuando se produce la condición del desencadenador, el controlador envía el evento a WMI, que lo entrega a todos los consumidores de datos que se han registrado para el evento.

Un controlador envía un evento a WMI de una de las maneras siguientes:

  • Llame a la rutina de biblioteca WmiFireEvent en modo kernel. Un controlador puede llamar a WmiFireEvent para enviar solo eventos que no usen nombres de instancia dinámicos y que basen nombres de instancia estáticos en una sola cadena de nombre base o el identificador de instancia de dispositivo de un PDO. Además, el evento debe ser una sola instancia, es decir, un controlador no puede llamar a WmiFireEvent para enviar un evento que consta de un solo elemento o de varias instancias. Para obtener más información, vea Envío de un evento con WmiFireEvent.

  • Llame a la rutina de modo kernel IoWMIWriteEvent con un puntero a una estructura WNODE_XXX asignada por el controlador que contiene los datos del evento. Para obtener más información, consulte Envío de un evento con IoWMIWriteEvent.