Share via


estructura de WNODE_HEADER

La estructura WNODE_HEADER es miembro de la estructura EVENT_TRACE_PROPERTIES .

Sintaxis

typedef struct _WNODE_HEADER {
  ULONG BufferSize;
  ULONG ProviderId;
  union {
    ULONG64 HistoricalContext;
    struct {
      ULONG Version;
      ULONG Linkage;
    };
  };
  union {
    HANDLE        KernelHandle;
    LARGE_INTEGER TimeStamp;
  };
  GUID  Guid;
  ULONG ClientContext;
  ULONG Flags;
} WNODE_HEADER, *PWNODE_HEADER;

Miembros

BufferSize

Tamaño total de la memoria asignada, en bytes, para las propiedades de la sesión de seguimiento de eventos. El tamaño de la memoria debe incluir la sala de la estructura de EVENT_TRACE_PROPERTIES más la cadena de nombre de sesión y la cadena de nombre de archivo de registro que siguen la estructura en memoria.

ProviderId

Reservado para uso interno.

HistoricalContext

En la salida, el identificador de la sesión de seguimiento de eventos.

Versión

Reservado para uso interno.

Vinculación

Reservado para uso interno.

KernelHandle

Reservado para uso interno.

Timestamp

Hora en la que se actualizó la información de esta estructura, en intervalos de 100 nanosegundos desde medianoche, 1 de enero de 1601.

Guid

GUID que define para la sesión.

Para una sesión del registrador de kernel nt, establezca este miembro en SystemTraceControlGuid.

Si este miembro se establece en SystemTraceControlGuid o GlobalLoggerGuid, el registrador será un registrador del sistema.

Para una sesión de registrador privado, establezca este miembro en el GUID del proveedor que va a habilitar para la sesión.

Si inicia una sesión que no es un registrador de kernel o una sesión de registrador privado, no es necesario especificar un GUID de sesión. Si no especifica un GUID, ETW crea uno automáticamente. Solo debe especificar un GUID de sesión si desea cambiar los permisos predeterminados asociados a una sesión específica. Para obtener más información, consulte la función EventAccessControl.

No puede iniciar más de una sesión con el mismo GUID de sesión.

Antes de Windows Vista: Puede iniciar más de una sesión con el mismo GUID de sesión.

ClientContext

Resolución de reloj que se va a usar al registrar la marca de tiempo para cada evento. El valor predeterminado es Contador de rendimiento de consultas (QPC).

Antes de Windows Vista: El valor predeterminado es la hora del sistema.

Antes de Windows 10, versión 1703: ningún registrador del sistema puede usar simultáneamente más de 2 tipos de reloj distintos.

A partir de Windows 10, versión 1703: se ha quitado la restricción de tipo de reloj. Los registradores del sistema ahora pueden usar los tres tipos de reloj simultáneamente.

Puede especificar uno de los valores siguientes.

Valor Significado
1
Contador de rendimiento de consultas (QPC). El contador QPC proporciona una marca de tiempo de alta resolución que no se ve afectada por los ajustes en el reloj del sistema. La marca de tiempo almacenada en el evento es equivalente al valor devuelto desde la API QueryPerformanceCounter. Para obtener más información sobre las características de esta marca de tiempo, consulte Adquisición de marcas de tiempo de alta resolución.
Debe usar esta resolución si tiene altas tasas de eventos o si el consumidor combina eventos de diferentes búferes. En estos casos, la precisión y estabilidad de la marca de tiempo QPC permite una mejor precisión al ordenar los eventos de diferentes búferes. Sin embargo, la marca de tiempo de QPC no reflejará las actualizaciones del reloj del sistema, por ejemplo, si el reloj del sistema se ajusta hacia delante debido a la sincronización con un servidor NTP mientras el seguimiento está en curso, las marcas de tiempo de QPC en el seguimiento seguirán reflejando el tiempo como si no se hubiera producido ninguna actualización.
Para determinar la resolución, use el miembro PerfFreq de TRACE_LOGFILE_HEADER al consumir el evento.
Para convertir la marca de tiempo de un evento en unidades de 100-ns, use la siguiente fórmula de conversión:
scaledTimestamp = eventRecord.EventHeader.TimeStamp.QuadPart * 100000000.0 / logfileHeader.PerfFreq.QuadPart
Tenga en cuenta que en los equipos más antiguos, es posible que la marca de tiempo no sea precisa porque el contador a veces omite el reenvío debido a errores de hardware.
2
Hora del sistema. La hora del sistema proporciona una marca de tiempo que realiza un seguimiento de los cambios en el reloj del sistema, por ejemplo, si el reloj del sistema se ajusta hacia delante debido a la sincronización con un servidor NTP mientras el seguimiento está en curso, las marcas de tiempo del sistema en el seguimiento también saltarán hacia delante para que coincidan con la nueva configuración del reloj del sistema.
  • En los sistemas anteriores a Windows 10, la marca de tiempo almacenada en el evento equivale al valor devuelto por la API GetSystemTimeAsFileTime.
  • En Windows 10 o posterior, la marca de tiempo almacenada en el evento equivale al valor devuelto por la API GetSystemTimePreciseAsFileTime.
Antes de Windows 10, la resolución de esta marca de tiempo era la resolución de un tic de reloj del sistema, como indica el miembro TimerResolution de TRACE_LOGFILE_HEADER. A partir de Windows 10, la resolución de esta marca de tiempo es la resolución del contador de rendimiento, como se indica en el miembro PerfFreq de TRACE_LOGFILE_HEADER.
Para convertir la marca de tiempo de un evento en unidades de 100-ns, use la siguiente fórmula de conversión:
scaledTimestamp = eventRecord.EventHeader.TimeStamp.QuadPart
Tenga en cuenta que cuando los eventos se capturan en un sistema que ejecuta un sistema operativo antes de Windows 10, si el volumen de eventos es alto, es posible que la resolución del tiempo del sistema no sea lo suficientemente fina como para determinar la secuencia de eventos. En este caso, un conjunto de eventos tendrá la misma marca de tiempo, pero es posible que el orden en el que ETW entregue los eventos no sea correcto. A partir de Windows 10, la marca de tiempo se captura con precisión adicional, aunque puede producirse cierta inestabilidad en los casos en los que se ajustó el reloj del sistema mientras se capturaba el seguimiento.
3
Contador de ciclo de CPU. El contador de CPU proporciona la marca de tiempo de resolución más alta y es el menos intensivo de recursos que se va a recuperar. Sin embargo, el contador de CPU no es confiable y no debe usarse en producción. Por ejemplo, en algunos equipos, los temporizadores cambiarán la frecuencia debido a cambios térmicos y de energía, además de detenerse en algunos estados.
Para determinar la resolución, use el miembro CpuSpeedInMHz de TRACE_LOGFILE_HEADER al consumir el evento.
Si el hardware no admite este tipo de reloj, ETW usa la hora del sistema.
Windows Server 2003, Windows XP con SP1 y Windows XP: Este valor no se admite, se introdujo en Windows Server 2003 con SP1 y Windows XP con SP2.

 

Windows 2000: No se admite el miembro ClientContext .

Marcas

Debe contener WNODE_FLAG_TRACED_GUID para indicar que la estructura contiene información de seguimiento de eventos.

Comentarios

Asegúrese de inicializar la memoria de esta estructura en cero antes de establecer los miembros.

Para convertir una marca de tiempo ETW en filetime, use el procedimiento siguiente:

1. Para cada sesión o archivo de registro que se está procesando (es decir, para cada EVENTO\_TRACE\_LOGFILE), compruebe el campo logFile.ProcessTraceMode para determinar si está establecida la marca PROCESS\_TRACE\_MODE\_RAW\_TIMESTAMP. De forma predeterminada, esta marca no está establecida. Si no se establece esta marca, el tiempo de ejecución de ETW convertirá automáticamente la marca de tiempo de cada EVENT\_RECORD en filetime antes de enviar event\_RECORD a la función EventRecordCallback, por lo que no se necesita ningún procesamiento adicional. Los pasos siguientes solo deben usarse si el seguimiento se está procesando con process\_TRACE\_MODE\_RAW\_TIMESTAMP marca establecida. 2. Para cada archivo de sesión o registro que se está procesando (es decir, para cada EVENT\_TRACE\_LOGFILE), compruebe el campo logFile.LogfileHeader.ReservedFlags para determinar la escala de marca de tiempo para el archivo de registro. En función del valor de ReservedFlags, siga uno de estos pasos para determinar el valor que se usará para timeStampScale en los pasos restantes:
a. Si ReservedFlags == 1 (QPC): DOUBLE timeStampScale = 100000000.0 / logFile.LogfileHeader.PerfFreq.QuadPart; B. Si ReservedFlags == 2 (hora del sistema): DOUBLE timeStampScale = 1,0; Tenga en cuenta que los pasos restantes no son necesarios para los eventos que usan la hora del sistema, ya que los eventos ya proporcionan sus marcas de tiempo en unidades FILETIME. Los pasos restantes funcionarán, pero son innecesarios y producirán un pequeño error de redondeo. c. Si ReservedFlags == 3 (contador de ciclo de CPU): DOUBLE timeStampScale = 10.0 / logFile.LogfileHeader.CpuSpeedInMHz;
3. En la primera llamada a la función EventRecordCallback para un archivo de registro determinado, use datos del logFile (EVENT\_TRACE\_LOGFILE) y del eventRecord (EVENT\_RECORD) para calcular timeStampBase que se usará para los eventos restantes en el archivo de registro: INT64 timeStampBase = logFile.LogfileHeader.StartTime.QuadPart - (INT64)(timeStampScale \* eventRecord.EventHeader.TimeStamp.QuadPart); 4. Para cada eventoRecord (EVENT\_RECORD), convierta la marca de tiempo del evento en FILETIME como se indica a continuación, usando los valores timeStampScale y timeStampBase calculados en los pasos 2 y 3: INT64 timeStampInFileTime = timeStampBase + (INT64)(timeStampScale \* eventRecord.EventHeader.TimeStamp.QuadPart);

Requisitos

Requisito Value
Cliente mínimo compatible
Windows 2000 Professional [aplicaciones de escritorio | Aplicaciones para UWP]
Servidor mínimo compatible
Windows 2000 Server [aplicaciones de escritorio | Aplicaciones para UWP]
Encabezado
Wmistr.h

Consulte también

ControlCallback

EVENT_TRACE_PROPERTIES

GetTraceLoggerHandle

LARGE_INTEGER