Seguimiento de eventos WMI

En esta sección se describen las extensiones WMI a WDM (compatibles con Windows 2000 y versiones posteriores) que los controladores en modo kernel, como proveedores de información, pueden usar para proporcionar información a los consumidores de información. Los controladores suelen proporcionar información que un consumidor usa para determinar la configuración del controlador y el uso de recursos. Además de las extensiones de WMI a WDM, una API en modo de usuario admite proveedores o consumidores de información de eventos de WMI; consulte Windows SDK para obtener más información.

El registrador de seguimiento de eventos admite hasta 32 instancias. Una de las instancias está reservada para realizar el seguimiento del kernel. El registrador admite el seguimiento de una alta tasa de eventos.

Los eventos de seguimiento se definen de la misma manera que otros eventos WMI. Los eventos WMI se describen en el archivo MOF. Para obtener más información sobre las descripciones de eventos de WMI, vea Sintaxis MOF para datos WMI y bloques de eventos.

El proceso por el que la información del registro de controladores en modo kernel se integra en la infraestructura de WMI existente. Para registrar eventos de seguimiento, un controlador hace lo siguiente:

  1. Regístrese como proveedor WMI mediante una llamada a IoWMIRegistrationControl.

  2. Marque los eventos como rastreables estableciendo WMIREG_FLAG_TRACED_GUID en el miembro Flags de la estructura WMIREGGUID que se pasa cuando el controlador registra eventos con WMI.

  3. Especifique un evento como evento de control para habilitar o deshabilitar globalmente un conjunto de eventos de seguimiento estableciendo WMIREG_FLAG_TRACE_CONTROL_GUID en el miembro Flags de la estructura WMIREGGUID que se pasa cuando el controlador registra eventos con WMI.

  4. Tras recibir una solicitud de WMI para habilitar eventos en los que el GUID coincide con el GUID del control de seguimiento, el controlador debe almacenar el identificador en el registrador. El valor será necesario al escribir un evento. Para obtener información sobre cómo usar este identificador, consulte el paso 6. El valor del identificador del registrador se encuentra en el miembro HistoricalContext de la parte WNODE_HEADER del búfer WMI que forma parte de los parámetros de la solicitud de habilitación de eventos.

  5. Decida si el evento de seguimiento se enviará a los consumidores de eventos WMI o se destina solo al registrador de eventos WMI. Esto determinará de dónde debe provenir la memoria de la estructura de EVENT_TRACE_HEADER . Esta memoria se pasará finalmente a IoWMIWriteEvent.

    Si el evento es solo un evento de registro, WMI no eliminará la memoria. En este caso, el controlador debe pasar un búfer en la pila o debe reutilizar un búfer asignado para este fin. Por motivos de rendimiento, el controlador debe minimizar las llamadas innecesarias para asignar o liberar memoria. Si no se cumple esta recomendación, se verá comprometida la integridad de la información de tiempo contenida en el archivo de registro.

    Si el evento se va a enviar tanto al registrador como a los consumidores de eventos WMI, la memoria debe asignarse desde un grupo no paginado. En este caso, el evento se enviará al registrador y, a continuación, se reenviará a WMI para que se envíe a los consumidores de eventos de WMI que han solicitado la notificación del evento. WMI liberará la memoria del evento según el comportamiento de IoWMIWriteEvent.

  6. Después de proteger la memoria de la EVENT_TRACE_HEADER y de los datos de eventos del controlador, si existe, se debe establecer la siguiente información:

    Establezca el miembro Size en sizeof(EVENT_TRACE_HEADER) más el tamaño de los datos de eventos de controlador adicionales que se anexarán al final de EVENT_TRACE_HEADER.

    Establezca el miembro Flags en WNODE_FLAG_TRACED_GUID para que el evento se envíe al registrador. Si el evento también se va a enviar a los consumidores de eventos WMI, establezca el WNODE_FLAG_LOG_WNODE. Tenga en cuenta que no es necesario establecer WNODE_FLAG_TRACED_GUID si se establece WNODE_FLAG_LOG_WNODE. Si se establecen ambos, WNODE_FLAG_TRACED_GUID tendrán prioridad y el evento no se enviará a los consumidores de eventos WMI.

    Establezca el Guid o el miembro GuidPtr . Si usa GuidPtr, establezca WNODE_FLAG_USE_GUID_PTR en el miembro Flags .

    Opcionalmente, especifique un valor para TimeStamp. Si el controlador no especifica un valor TimeStamp , el registrador lo rellenará. Si el controlador no desea que el registrador establezca la marca de tiempo, debe establecer WNODE_FLAG_USE_TIMESTAMP en el miembro Flags .

    Establezca cualquiera de los siguientes miembros EVENT_TRACE_HEADER que tengan significado para el controlador: Class.Type, Class.Level y Class.Version.

    Por último, convierta el EVENT_TRACE_HEADER en un WNODE_HEADER y establezca el valor HistoricalContext del Wnode en el identificador del registrador que se guardó en el paso 4 anterior.

  7. Llame a IoWMIWriteEvent con el puntero a la estructura EVENT_TRACE_HEADER .

El controlador debe continuar registrando eventos de seguimiento asociados al GUID de control hasta que el controlador reciba la notificación para deshabilitar el registro de eventos a través de una solicitud de IRP_MN_DISABLE_EVENTS .