WNODE_HEADER-Struktur

Die WNODE_HEADER-Struktur ist ein Element der EVENT_TRACE_PROPERTIES-Struktur .

Syntax

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;

Member

BufferSize

Gesamtgröße des zugeordneten Arbeitsspeichers in Bytes für die Eigenschaften der Ereignisablaufverfolgungssitzung. Die Größe des Arbeitsspeichers muss den Raum für die EVENT_TRACE_PROPERTIES-Struktur sowie die Sitzungsnamenzeichenfolge und die Protokolldateinamenzeichenfolge enthalten, die der Struktur im Arbeitsspeicher folgen.

ProviderId

Für die interne Verwendung reserviert.

HistoricalContext

Bei der Ausgabe das Handle für die Ereignisablaufverfolgungssitzung.

Version

Für die interne Verwendung reserviert.

Verknüpfung

Für die interne Verwendung reserviert.

KernelHandle

Für die interne Verwendung reserviert.

Timestamp

Zeitpunkt, zu dem die Informationen in dieser Struktur aktualisiert wurden, in Intervallen von 100 Nanosekunden seit Mitternacht, 1. Januar 1601.

Guid

Die GUID, die Sie für die Sitzung definieren.

Legen Sie für eine NT-Kernelprotokollierungssitzung dieses Element auf SystemTraceControlGuid fest.

Wenn dieser Member auf SystemTraceControlGuid oder GlobalLoggerGuid festgelegt ist, ist die Protokollierung eine Systemprotokollierung.

Legen Sie für eine private Protokollierungssitzung dieses Mitglied auf die GUID des Anbieters fest, die Sie für die Sitzung aktivieren möchten.

Wenn Sie eine Sitzung starten, die keine Kernelprotokollierung oder private Protokollierungssitzung ist, müssen Sie keine Sitzungs-GUID angeben. Wenn Sie keine GUID angeben, erstellt ETW eine für Sie. Sie müssen eine Sitzungs-GUID nur angeben, wenn Sie die Standardberechtigungen für eine bestimmte Sitzung ändern möchten. Weitere Informationen finden Sie in der EventAccessControl-Funktion.

Sie können nicht mehr als eine Sitzung mit derselben Sitzungs-GUID starten.

Vor Windows Vista: Sie können mehrere Sitzungen mit derselben Sitzungs-GUID starten.

Clientcontext

Uhrauflösung, die beim Protokollieren des Zeitstempels für jedes Ereignis verwendet werden soll. Der Standardwert ist Abfrageleistungsindikator (Query Performance Counter, QPC).

Vor Windows Vista: Die Standardeinstellung ist die Systemzeit.

Vor Windows 10 Version 1703: Es können nicht mehr als zwei verschiedene Takttypen gleichzeitig von allen Systemprotokollierungen verwendet werden.

Ab Windows 10 Version 1703: Die Einschränkung des Uhrtyps wurde entfernt. Alle drei Takttypen können nun gleichzeitig von Systemloggern verwendet werden.

Sie können einen der folgenden Werte angeben.

Wert Bedeutung
1
Abfrageleistungsindikator (Query Performance Counter, QPC). Der QPC-Zähler stellt einen Zeitstempel mit hoher Auflösung bereit, der nicht von Anpassungen an der Systemuhr beeinflusst wird. Der im Ereignis gespeicherte Zeitstempel entspricht dem Wert, der von der QueryPerformanceCounter-API zurückgegeben wird. Weitere Informationen zu den Merkmalen dieses Zeitstempels finden Sie unter Abrufen von Zeitstempeln mit hoher Auflösung.
Sie sollten diese Auflösung verwenden, wenn Sie hohe Ereignisraten haben oder wenn der Consumer Ereignisse aus verschiedenen Puffern zusammenführt. In diesen Fällen ermöglicht die Genauigkeit und Stabilität des QPC-Zeitstempels eine bessere Genauigkeit bei der Reihenfolge der Ereignisse aus verschiedenen Puffern. Der QPC-Zeitstempel spiegelt jedoch keine Aktualisierungen der Systemuhr wider, z. B. wenn die Systemuhr während der Ablaufverfolgung aufgrund der Synchronisierung mit einem NTP-Server vorwärts angepasst wird, während die Ablaufverfolgung ausgeführt wird, spiegeln die QPC-Zeitstempel in der Ablaufverfolgung weiterhin die Zeit wider, als ob keine Aktualisierung erfolgt wäre.
Verwenden Sie zum Bestimmen der Auflösung den PerfFreq-Member von TRACE_LOGFILE_HEADER , wenn Sie das Ereignis verwenden.
Verwenden Sie die folgende Konvertierungsformel, um den Zeitstempel eines Ereignisses in 100-ns-Einheiten zu konvertieren:
scaledTimestamp = eventRecord.EventHeader.TimeStamp.QuadPart * 10000000.0 / logfileHeader.PerfFreq.QuadPart
Beachten Sie, dass der Zeitstempel auf älteren Computern möglicherweise nicht korrekt ist, da der Zähler manchmal aufgrund von Hardwarefehlern übersprungen wird.
2
Systemzeit. Die Systemzeit stellt einen Zeitstempel bereit, der Änderungen an der Uhr des Systems nachverfolgt, z. B. wenn die Systemuhr aufgrund der Synchronisierung mit einem NTP-Server vorwärts angepasst wird, während die Ablaufverfolgung ausgeführt wird, werden die Systemzeitstempel in der Ablaufverfolgung ebenfalls nach vorne springen, um der neuen Einstellung der Systemuhr zu entsprechen.
  • Auf Systemen vor Windows 10 entspricht der im Ereignis gespeicherte Zeitstempel dem Wert, der von der GetSystemTimeAsFileTime-API zurückgegeben wird.
  • Auf Windows 10 oder höher entspricht der im Ereignis gespeicherte Zeitstempel dem Wert, der von der GetSystemTimePreciseAsFileTime-API zurückgegeben wird.
Vor Windows 10 war die Auflösung dieses Zeitstempels die Auflösung eines Systemuhrstrichs, wie durch das TimerResolution-Element von TRACE_LOGFILE_HEADER angegeben. Ab Windows 10 ist die Auflösung dieses Zeitstempels die Auflösung des Leistungsindikators, wie durch das PerfFreq-Element von TRACE_LOGFILE_HEADER angegeben.
Verwenden Sie die folgende Konvertierungsformel, um den Zeitstempel eines Ereignisses in 100-ns-Einheiten zu konvertieren:
scaledTimestamp = eventRecord.EventHeader.TimeStamp.QuadPart
Beachten Sie, dass die Auflösung für die Systemzeit möglicherweise nicht ausreichend ist, wenn Ereignisse auf einem System erfasst werden, auf dem vor Windows 10 ein Betriebssystem ausgeführt wird, wenn das Ereignisvolumen hoch ist. In diesem Fall hat eine Reihe von Ereignissen den gleichen Zeitstempel, aber die Reihenfolge, in der die ETW die Ereignisse bereitstellt, ist möglicherweise nicht richtig. Ab Windows 10 wird der Zeitstempel mit zusätzlicher Genauigkeit erfasst, obwohl es noch zu einer gewissen Instabilität kommen kann, wenn die Systemuhr während der Erfassung der Ablaufverfolgung angepasst wurde.
3
CPU-Zykluszähler. Der CPU-Zähler bietet den Zeitstempel mit der höchsten Auflösung und ist der ressourcenintensivste, der abgerufen werden kann. Der CPU-Zähler ist jedoch unzuverlässig und sollte nicht in der Produktion verwendet werden. Auf einigen Computern ändern die Timer beispielsweise die Häufigkeit aufgrund von Wärme- und Leistungsänderungen, zusätzlich zum Anhalten in einigen Zuständen.
Um die Auflösung zu bestimmen, verwenden Sie den CpuSpeedInMHz-Member von TRACE_LOGFILE_HEADER , wenn Sie das Ereignis nutzen.
Wenn Ihre Hardware diesen Uhrtyp nicht unterstützt, verwendet die ETW die Systemzeit.
Windows Server 2003, Windows XP mit SP1 und Windows XP: Dieser Wert wird nicht unterstützt. Er wurde in Windows Server 2003 mit SP1 und Windows XP mit SP2 eingeführt.

 

Windows 2000: Das ClientContext-Element wird nicht unterstützt.

Flags

Muss WNODE_FLAG_TRACED_GUID enthalten, um anzugeben, dass die Struktur Informationen zur Ereignisablaufverfolgung enthält.

Bemerkungen

Stellen Sie sicher, dass Sie den Arbeitsspeicher für diese Struktur auf 0 (null) initialisieren, bevor Sie Member festlegen.

Führen Sie das folgende Verfahren aus, um einen ETW-Zeitstempel in einen FILETIME-Wert zu konvertieren:

1. Überprüfen Sie für jede Sitzung oder Protokolldatei, die verarbeitet wird (d. h. für jede EVENT\_TRACE\_LOGFILE), das Feld logFile.ProcessTraceMode, um zu bestimmen, ob das Flag PROCESS\_TRACE\_MODE\_RAW\_TIMESTAMP festgelegt ist. Standardmäßig ist dieses Flag nicht festgelegt. Wenn dieses Flag nicht festgelegt ist, konvertiert die ETW-Runtime den Zeitstempel jedes EVENT\_RECORD automatisch in eine FILETIME, bevor die EVENT\_RECORD an Ihre EventRecordCallback-Funktion gesendet wird, sodass keine zusätzliche Verarbeitung erforderlich ist. Die folgenden Schritte sollten nur verwendet werden, wenn die Ablaufverfolgung mit dem flag PROCESS\_TRACE\_MODE\_RAW\_TIMESTAMP verarbeitet wird. 2. Überprüfen Sie für jede Sitzung oder Protokolldatei, die verarbeitet wird (d. h. für jede EVENT\_TRACE\_LOGFILE), das Feld logFile.LogfileHeader.ReservedFlags, um die Zeitstempelskala für die Protokolldatei zu bestimmen. Führen Sie basierend auf dem Wert von ReservedFlags einen der folgenden Schritte aus, um den Wert für timeStampScale in den verbleibenden Schritten zu bestimmen:
a. If ReservedFlags == 1 (QPC): DOUBLE timeStampScale = 100000000.0 / logFile.LogfileHeader.PerfFreq.QuadPart; B. If ReservedFlags == 2 (Systemzeit): DOUBLE timeStampScale = 1.0; Beachten Sie, dass die verbleibenden Schritte für Ereignisse mit Systemzeit nicht erforderlich sind, da die Ereignisse bereits ihre Zeitstempel in FILETIME-Einheiten bereitstellen. Die verbleibenden Schritte funktionieren, sind jedoch unnötig und führen zu einem kleinen Rundungsfehler. c. If ReservedFlags == 3 (CPU-Zykluszähler): DOUBLE timeStampScale = 10.0 / logFile.LogfileHeader.CpuSpeedInMHz;
3. Beim ERSTEN Aufruf Ihrer EventRecordCallback-Funktion für eine bestimmte Protokolldatei, Verwenden Sie Daten aus der logFile (EVENT\_TRACE\_LOGFILE) und aus dem eventRecord (EVENT\_RECORD), um die timeStampBase zu berechnen, die für die verbleibenden Ereignisse in der Protokolldatei verwendet wird: INT64 timeStampBase = logFile.LogfileHeader.StartTime.QuadPart - (INT64)(timeStampScale \* eventRecord.EventHeader.TimeStamp.QuadPart); 4. Konvertieren Sie für jeden Ereignisdatensatz (EVENT\_RECORD) den Zeitstempel des Ereignisses wie folgt in FILETIME. Verwenden Sie dabei die werte timeStampScale und timeStampBase, die in den Schritten 2 und 3 berechnet werden: INT64 timeStampInFileTime = timeStampBase + (INT64)(timeStampScale \* eventRecord.EventHeader.TimeStamp.QuadPart);

Anforderungen

Anforderung Wert
Unterstützte Mindestversion (Client)
Windows 2000 Professional [Desktop-Apps | UWP-Apps]
Unterstützte Mindestversion (Server)
Windows 2000 Server [Desktop-Apps | UWP-Apps]
Header
Wmistr.h

Siehe auch

ControlCallback

EVENT_TRACE_PROPERTIES

GetTraceLoggerHandle

LARGE_INTEGER