다음을 통해 공유


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

1601년 1월 1일 자정 이후 100나노초 간격으로 이 구조의 정보가 업데이트된 시간입니다.

Guid

세션에 대해 정의하는 GUID입니다.

NT 커널 로거 세션의 경우 이 멤버를 SystemTraceControlGuid로 설정합니다.

이 멤버가 SystemTraceControlGuid 또는 GlobalLoggerGuid로 설정된 경우 로거는 시스템 로거가 됩니다.

프라이빗 로거 세션의 경우 이 멤버를 세션에 사용하도록 설정할 공급자의 GUID로 설정합니다.

커널 로거 또는 프라이빗 로거 세션이 아닌 세션을 시작하는 경우 세션 GUID를 지정할 필요가 없습니다. GUID를 지정하지 않으면 ETW에서 GUID를 만듭니다. 특정 세션과 연결된 기본 권한을 변경하려는 경우에만 세션 GUID를 지정해야 합니다. 자세한 내용은 EventAccessControl 함수를 참조하세요.

동일한 세션 GUID를 사용하여 둘 이상의 세션을 시작할 수 없습니다.

Windows Vista 이전: 동일한 세션 GUID를 사용하여 둘 이상의 세션을 시작할 수 있습니다.

ClientContext

각 이벤트에 대한 타임스탬프를 로깅할 때 사용할 클록 해상도입니다. 기본값은 QPC(쿼리 성능 카운터)입니다.

Windows Vista 이전: 기본값은 시스템 시간입니다.

Windows 10 이전 버전 1703: 시스템 로거에서 2개 이하의 고유한 클록 형식을 동시에 사용할 수 없습니다.

Windows 10 버전 1703: 클록 유형 제한이 제거되었습니다. 이제 세 가지 클록 형식을 모두 시스템 로거에서 동시에 사용할 수 있습니다.

다음 값 중 하나를 지정할 수 있습니다.

의미
1
QPC(쿼리 성능 카운터). QPC 카운터는 시스템 클록 조정의 영향을 받지 않는 고해상도 타임스탬프를 제공합니다. 이벤트에 저장된 타임스탬프는 QueryPerformanceCounter API에서 반환된 값과 동일합니다. 이 타임스탬핑의 특성에 대한 자세한 내용은 고해상도 타임스탬프를 획득을 참조하세요.
이벤트 속도가 높거나 소비자가 다른 버퍼의 이벤트를 병합하는 경우 이 해결을 사용해야 합니다. 이러한 경우 QPC 타임스탬프의 정밀도와 안정성을 통해 다양한 버퍼에서 이벤트를 정렬할 때 정확도가 향상됩니다. 그러나 QPC 타임스탬프는 시스템 클록에 대한 업데이트를 반영하지 않습니다. 예를 들어 추적이 진행 중인 동안 NTP 서버와의 동기화로 인해 시스템 클록이 앞으로 조정되는 경우 추적의 QPC 타임스탬프는 업데이트가 발생하지 않은 것처럼 시간을 계속 반영합니다.
해결 방법을 확인하려면 이벤트를 사용할 때 TRACE_LOGFILE_HEADERPerfFreq 멤버를 사용합니다.
이벤트의 타임스탬프를 100-ns 단위로 변환하려면 다음 변환 수식을 사용합니다.
scaledTimestamp = eventRecord.EventHeader.TimeStamp.QuadPart * 100000000.0 / logfileHeader.PerfFreq.QuadPart
오래된 컴퓨터에서는 하드웨어 오류로 인해 카운터가 앞으로 건너뛰는 경우가 있기 때문에 타임스탬프는 정확하지 않을 수 있습니다.
2
시스템 시간. 시스템 시간은 시스템 클록의 변경 내용을 추적하는 타임스탬프를 제공합니다. 예를 들어 추적이 진행 중인 동안 NTP 서버와의 동기화로 인해 시스템 클록이 앞으로 조정되는 경우 추적의 시스템 시간 타임스탬프도 시스템 클록의 새 설정과 일치하도록 앞으로 이동합니다.
  • Windows 10 이전 시스템에서 이벤트에 저장된 타임스탬프는 GetSystemTimeAsFileTime API에서 반환된 값과 동일합니다.
  • Windows 10 이상에서 이벤트에 저장된 타임스탬프는 GetSystemTimePreciseAsFileTime API에서 반환된 값과 동일합니다.
Windows 10 전에 이 타임스탬프는 TRACE_LOGFILE_HEADER TimerResolution 멤버가 표시한 시스템 클록 틱의 해상도였습니다. Windows 10 시작해서 이 타임스탬프의 해상도는 성능 카운터 해상도이며, TRACE_LOGFILE_HEADER PerfFreq 멤버가 표시합니다.
이벤트의 타임스탬프를 100-ns 단위로 변환하려면 다음 변환 수식을 사용합니다.
scaledTimestamp = eventRecord.EventHeader.TimeStamp.QuadPart
Windows 10 전에 OS를 실행하는 시스템에서 이벤트가 캡처되는 경우 이벤트 볼륨이 높으면 시스템 시간 해상도가 이벤트 시퀀스를 결정할 만큼 충분하지 않을 수 있습니다. 이 경우 이벤트 집합에 동일한 타임스탬프가 있지만 ETW에서 이벤트를 전달하는 순서가 올바르지 않을 수 있습니다. Windows 10 시작하여 타임스탬프는 추가 정밀도로 캡처되지만 추적을 캡처하는 동안 시스템 시계가 조정된 경우에도 일부 불안정이 발생할 수 있습니다.
3
CPU 주기 카운터. CPU 카운터는 가장 높은 해상도의 타임스탬프를 제공하며 검색할 리소스 집약적이 가장 적습니다. 그러나 CPU 카운터는 신뢰할 수 없으며 프로덕션에서 사용해서는 안 됩니다. 예를 들어 일부 컴퓨터에서는 일부 상태에서 중지하는 것 외에도 열 및 전원 변경으로 인해 타이머가 빈도를 변경합니다.
해상도를 확인하려면 이벤트를 사용할 때 TRACE_LOGFILE_HEADERCpuSpeedInMHz 멤버를 사용합니다.
하드웨어에서 이 시계 형식을 지원하지 않는 경우 ETW는 시스템 시간을 사용합니다.
Windows Server 2003, WINDOWS XP SP1 및 Windows XP: 이 값은 지원되지 않으며 SP1이 있는 Windows Server 2003 및 WINDOWS XP SP2에서 도입되었습니다.

 

Windows 2000:ClientContext 멤버는 지원되지 않습니다.

플래그

구조에 이벤트 추적 정보가 포함되어 있음을 나타내려면 WNODE_FLAG_TRACED_GUID 포함되어야 합니다.

설명

멤버를 설정하기 전에 이 구조체의 메모리를 0으로 초기화해야 합니다.

ETW 타임스탬프를 FILETIME으로 변환하려면 다음 절차를 사용합니다.

1. 처리 중인 각 세션 또는 로그 파일(예: 각 EVENT\_TRACE\_LOGFILE)에 대해 logFile.ProcessTraceMode 필드를 검사 PROCESS\_TRACE\_MODE\_RAW\_TIMESTAMP 플래그가 설정되었는지 여부를 확인합니다. 기본적으로 이 플래그는 설정되지 않습니다. 이 플래그가 설정되지 않은 경우 ETW 런타임은 EVENT\_RECORD EventRecordCallback 함수로 보내기 전에 각 EVENT\_RECORD 타임스탬프를 FILETIME으로 자동으로 변환하므로 추가 처리가 필요하지 않습니다. 다음 단계는 PROCESS\_TRACE\_MODE\_RAW\_TIMESTAMP 플래그 집합을 사용하여 추적을 처리하는 경우에만 사용해야 합니다. 2. 처리 중인 각 세션 또는 로그 파일(예: 각 EVENT\_TRACE\_LOGFILE)에 대해 logFile.LogfileHeader.ReservedFlags 필드를 검사 로그 파일의 타임스탬프 크기를 확인합니다. ReservedFlags 값에 따라 다음 단계 중 하나를 수행하여 나머지 단계에서 timeStampScale에 사용할 값을 결정합니다.
a. ReservedFlags == 1(QPC): DOUBLE timeStampScale = 10000000.0 / logFile.LogfileHeader.PerfFreq.QuadPart; B. ReservedFlags == 2(시스템 시간): DOUBLE timeStampScale = 1.0; 이벤트는 이미 FILETIME 단위로 타임스탬프를 제공하므로 시스템 시간을 사용하는 이벤트에는 나머지 단계가 필요하지 않습니다. 나머지 단계는 작동하지만 불필요하며 작은 반올림 오류가 발생합니다. 다. ReservedFlags == 3(CPU 주기 카운터): 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으로 변환하고, 2단계와 3단계에서 계산된 timeStampScale 및 timeStampBase 값을 사용합니다. INT64 timeStampInFileTime = timeStampBase + (INT64)(timeStampScale \* eventRecord.EventHeader.TimeStamp.QuadPart);

요구 사항

요구 사항
지원되는 최소 클라이언트
Windows 2000 Professional [데스크톱 앱 | UWP 앱]
지원되는 최소 서버
Windows 2000 Server [데스크톱 앱 | UWP 앱]
헤더
Wmistr.h

추가 정보

ControlCallback

EVENT_TRACE_PROPERTIES

GetTraceLoggerHandle

LARGE_INTEGER