Поделиться через


структура WNODE_HEADER

Структура WNODE_HEADER является членом структуры EVENT_TRACE_PROPERTIES .

Синтаксис

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;

Члены

BufferSize

Общий размер памяти, выделенной в байтах для свойств сеанса трассировки событий. Размер памяти должен включать комнату для структуры EVENT_TRACE_PROPERTIES , а также строку имени сеанса и строку имени файла журнала, которые соответствуют структуре в памяти.

ProviderId

Зарезервировано для внутреннего использования.

HistoricalContext

В выходных данных — дескриптор сеанса трассировки событий.

Версия

Зарезервировано для внутреннего использования.

Компоновка

Зарезервировано для внутреннего использования.

KernelHandle

Зарезервировано для внутреннего использования.

Timestamp

Время обновления информации в этой структуре с интервалом в 100 наносекунд с полуночи 1 января 1601 года.

Guid

Идентификатор GUID, заданный для сеанса.

Для сеанса nt kernel Logger задайте для этого элемента значение SystemTraceControlGuid.

Если для этого элемента задано значение SystemTraceControlGuid или GlobalLoggerGuid, средство ведения журнала будет системным.

Для закрытого сеанса средства ведения журнала задайте для этого участника GUID поставщика, который вы будете включать для сеанса.

Если вы запускаете сеанс, который не является сервером ведения журнала ядра или частным сеансом средства ведения журнала, указывать GUID сеанса не требуется. Если вы не укажете GUID, трассировка событий Windows создаст его автоматически. Идентификатор GUID сеанса необходимо указывать только в том случае, если вы хотите изменить разрешения по умолчанию, связанные с определенным сеансом. Дополнительные сведения см. в разделе Функция EventAccessControl.

Нельзя запустить несколько сеансов с одним и тем же идентификатором GUID сеанса.

До Windows Vista: Вы можете запустить несколько сеансов с одним и тем же идентификатором GUID сеанса.

ClientContext

Разрешение часов, используемое при регистрации метки времени для каждого события. Значение по умолчанию — счетчик производительности запросов (QPC).

До Windows Vista: По умолчанию используется системное время.

До Windows 10 версия 1703: любые системные средства ведения журнала могут одновременно использовать не более 2 различных типов часов.

Начиная с Windows 10 версии 1703: ограничение типа часов удалено. Все три типа часов теперь могут одновременно использоваться системными средствами ведения журнала.

Можно указать одно из следующих значений.

Значение Значение
1
Счетчик производительности запросов (QPC). Счетчик QPC предоставляет метку времени с высоким разрешением, на которую не влияют корректировки системных часов. Метка времени, хранящейся в событии, эквивалентна значению, возвращаемого API QueryPerformanceCounter. Дополнительные сведения о характеристиках этой метки времени см. в разделе Получение меток времени с высоким разрешением.
Это разрешение следует использовать, если у вас высокая частота событий или потребитель объединяет события из разных буферов. В таких случаях точность и стабильность метки времени QPC позволяют лучше упорядочить события из разных буферов. Однако метка времени QPC не будет отражать обновления системных часов, например, если системные часы настроены вперед из-за синхронизации с NTP-сервером во время выполнения трассировки, метки времени QPC в трассировке будут по-прежнему отражать время, как если бы обновление не произошло.
Чтобы определить разрешение, используйте элемент PerfFreqTRACE_LOGFILE_HEADER при использовании события.
Чтобы преобразовать метку времени события в 100-ns единиц, используйте следующую формулу преобразования:
scaledTimestamp = eventRecord.EventHeader.TimeStamp.QuadPart * 10000000.0 / logfileHeader.PerfFreq.QuadPart
Обратите внимание, что на старых компьютерах метка времени может быть неточна, так как счетчик иногда пропускается вперед из-за ошибок оборудования.
2
Системное время. Системное время предоставляет метку времени, которая отслеживает изменения системных часов, например, если системные часы корректируются вперед из-за синхронизации с NTP-сервером во время выполнения трассировки, метки системного времени в трассировке также будут переходить вперед в соответствии с новым параметром системных часов.
  • В системах до Windows 10 метка времени, хранящейся в событии, эквивалентна значению, возвращаемого api GetSystemTimeAsFileTime.
  • На Windows 10 или более поздней версии метка времени, хранящейся в событии, эквивалентна значению, возвращенного API GetSystemTimePreciseAsFileTime.
До Windows 10 разрешение этой метки времени было разрешением такта системных часов, как указано элементом TimerResolution TRACE_LOGFILE_HEADER. Начиная с Windows 10, разрешение этой метки времени является разрешением счетчика производительности, как указано в элементе PerfFreq TRACE_LOGFILE_HEADER.
Чтобы преобразовать метку времени события в 100-ns единиц, используйте следующую формулу преобразования:
scaledTimestamp = eventRecord.EventHeader.TimeStamp.QuadPart
Обратите внимание, что при записи событий в системе под управлением ОС до Windows 10, если объем событий высок, разрешение системного времени может быть недостаточно для определения последовательности событий. В этом случае набор событий будет иметь одинаковую метку времени, но порядок, в котором трассировка событий Windows доставляет события, может быть неправильной. Начиная с Windows 10, метка времени фиксируется с дополнительной точностью, хотя некоторая нестабильность может по-прежнему возникать в случаях, когда системные часы были скорректированы во время отслеживания трассировки.
3
Счетчик циклов ЦП. Счетчик ЦП обеспечивает максимальное разрешение метки времени и является наименее ресурсоемким для извлечения. Однако счетчик ЦП ненадежн и не должен использоваться в рабочей среде. Например, на некоторых компьютерах таймеры будут изменять частоту из-за изменения температуры и питания в дополнение к остановке в некоторых состояниях.
Чтобы определить разрешение, используйте элемент CpuSpeedInMHzTRACE_LOGFILE_HEADER при использовании события.
Если оборудование не поддерживает этот тип часов, трассировка событий Windows использует системное время.
Windows Server 2003, Windows XP с пакетом обновления 1 (SP1) и Windows XP: Это значение не поддерживается, оно появилось в Windows Server 2003 с пакетом обновления 1 (SP1) и Windows XP с пакетом обновления 2 (SP2).

 

Windows 2000: Элемент ClientContext не поддерживается.

Flags

Должен содержать WNODE_FLAG_TRACED_GUID , чтобы указать, что структура содержит сведения трассировки событий.

Комментарии

Не забудьте инициализировать память для этой структуры до нуля, прежде чем задавать какие-либо члены.

Чтобы преобразовать метку времени трассировки событий Windows в FILETIME, используйте следующую процедуру:

1. Для каждого обрабатываемого файла сеанса или журнала (т. е. для каждого события\_TRACE\_LOGFILE) проверка поле logFile.ProcessTraceMode, чтобы определить, установлен ли флаг PROCESS\_TRACE\_MODE\_RAW\_TIMESTAMP. По умолчанию этот флаг не установлен. Если этот флаг не установлен, среда выполнения ETW автоматически преобразует метку времени каждого события EVENT\_RECORD в FILETIME перед отправкой EVENT\_RECORD в функцию EventRecordCallback, поэтому дополнительная обработка не требуется. Следующие действия следует выполнять, только если трассировка обрабатывается с установленным флагом PROCESS\_TRACE\_MODE\_RAW\_TIMESTAMP. 2. Для каждого обрабатываемого файла сеанса или журнала (т. е. для каждого события\_TRACE\_LOGFILE) проверка поле logFile.LogfileHeader.ReservedFlags, чтобы определить масштаб метки времени для файла журнала. На основе значения ReservedFlags выполните одно из следующих действий, чтобы определить значение, которое будет использоваться для timeStampScale на оставшихся шагах:
а. If ReservedFlags == 1 (QPC): DOUBLE timeStampScale = 10000000.0 / logFile.LogfileHeader.PerfFreq.QuadPart; B. If ReservedFlags == 2 (System time): DOUBLE timeStampScale = 1.0; Обратите внимание, что оставшиеся шаги не нужны для событий, использующих системное время, так как события уже предоставляют свои метки времени в единицах FILETIME. Остальные шаги будут работать, но они не нужны и приведут к небольшой ошибке округления. c. If ReservedFlags == 3 (счетчик циклов ЦП): DOUBLE timeStampScale = 10,0 / logFile.LogfileHeader.CpuSpeedInMHz;
3. При первом вызове функции EventRecordCallback для определенного файла журнала используйте данные из logFile (EVENT\_TRACE\_LOGFILE) и eventRecord (EVENT\_RECORD) для вычисления timeStampBase, которая будет использоваться для остальных событий в файле журнала: INT64 timeStampBase = logFile.LogfileHeader.StartTime.QuadPart - (INT64)(timeStampScale \* eventRecord.EventHeader.TimeStamp.QuadPart); 4. Для каждого eventRecord (EVENT\_RECORD) преобразуйте метку времени события в FILETIME следующим образом, используя значения timeStampScale и timeStampBase, вычисленные на шагах 2 и 3: INT64 timeStampInFileTime = timeStampBase + (INT64)(timeStampScale \* eventRecord.EventHeader.TimeStamp.QuadPart);

Требования

Требование Значение
Минимальная версия клиента
Windows 2000 Профессиональная [классические приложения | Приложения UWP]
Минимальная версия сервера
Windows 2000 Server [классические приложения | Приложения UWP]
Заголовок
Wmistr.h

См. также раздел

ControlCallback

EVENT_TRACE_PROPERTIES

GetTraceLoggerHandle

LARGE_INTEGER