NT 커널 로거 세션 구성 및 시작
NT 커널 로거 세션은 미리 정의된 커널 이벤트 집합을 기록하는 이벤트 추적 세션입니다. 커널 공급자를 사용하도록 설정하기 위해 EnableTrace 함수를 호출하지 않습니다. 대신 EVENT_TRACE_PROPERTIES 구조체의 EnableFlags 멤버를 사용하여 수신하려는 커널 이벤트를 지정합니다. StartTrace 함수는 지정한 사용 플래그를 사용하여 커널 공급자를 사용하도록 설정합니다.
NT 커널 로거 세션은 하나만 있습니다. 세션이 이미 사용 중인 경우 StartTrace 함수는 ERROR_ALREADY_EXISTS 반환합니다.
이벤트 추적 세션 시작에 대한 자세한 내용은 이벤트 추적 세션 구성 및 시작을 참조하세요.
프라이빗 로거 세션 시작에 대한 자세한 내용은 프라이빗 로거 세션 구성 및 시작을 참조하세요.
전역 로거 세션 시작에 대한 자세한 내용은 전역 로거 세션 구성 및 시작을 참조하세요.
AutoLogger 세션 시작에 대한 자세한 내용은 AutoLogger 세션 구성 및 시작을 참조하세요.
다음 예제에서는 네트워크 TCP/IP 커널 이벤트를 수집하고 5MB 순환 파일에 쓰는 NT 커널 로거 세션을 구성하고 시작하는 방법을 보여 줍니다.
#define INITGUID // Include this #define to use SystemTraceControlGuid in Evntrace.h.
#include <windows.h>
#include <stdio.h>
#include <conio.h>
#include <strsafe.h>
#include <wmistr.h>
#include <evntrace.h>
#define LOGFILE_PATH L"<FULLPATHTOTHELOGFILE.etl>"
void wmain(void)
{
ULONG status = ERROR_SUCCESS;
TRACEHANDLE SessionHandle = 0;
EVENT_TRACE_PROPERTIES* pSessionProperties = NULL;
ULONG BufferSize = 0;
// Allocate memory for the session properties. The memory must
// be large enough to include the log file name and session name,
// which get appended to the end of the session properties structure.
BufferSize = sizeof(EVENT_TRACE_PROPERTIES) + sizeof(LOGFILE_PATH) + sizeof(KERNEL_LOGGER_NAME);
pSessionProperties = (EVENT_TRACE_PROPERTIES*) malloc(BufferSize);
if (NULL == pSessionProperties)
{
wprintf(L"Unable to allocate %d bytes for properties structure.\n", BufferSize);
goto cleanup;
}
// Set the session properties. You only append the log file name
// to the properties structure; the StartTrace function appends
// the session name for you.
ZeroMemory(pSessionProperties, BufferSize);
pSessionProperties->Wnode.BufferSize = BufferSize;
pSessionProperties->Wnode.Flags = WNODE_FLAG_TRACED_GUID;
pSessionProperties->Wnode.ClientContext = 1; //QPC clock resolution
pSessionProperties->Wnode.Guid = SystemTraceControlGuid;
pSessionProperties->EnableFlags = EVENT_TRACE_FLAG_NETWORK_TCPIP;
pSessionProperties->LogFileMode = EVENT_TRACE_FILE_MODE_CIRCULAR;
pSessionProperties->MaximumFileSize = 5; // 5 MB
pSessionProperties->LoggerNameOffset = sizeof(EVENT_TRACE_PROPERTIES);
pSessionProperties->LogFileNameOffset = sizeof(EVENT_TRACE_PROPERTIES) + sizeof(KERNEL_LOGGER_NAME);
StringCbCopy((LPWSTR)((char*)pSessionProperties + pSessionProperties->LogFileNameOffset), sizeof(LOGFILE_PATH), LOGFILE_PATH);
// Create the trace session.
status = StartTrace((PTRACEHANDLE)&SessionHandle, KERNEL_LOGGER_NAME, pSessionProperties);
if (ERROR_SUCCESS != status)
{
if (ERROR_ALREADY_EXISTS == status)
{
wprintf(L"The NT Kernel Logger session is already in use.\n");
}
else
{
wprintf(L"EnableTrace() failed with %lu\n", status);
}
goto cleanup;
}
wprintf(L"Press any key to end trace session ");
_getch();
cleanup:
if (SessionHandle)
{
status = ControlTrace(SessionHandle, KERNEL_LOGGER_NAME, pSessionProperties, EVENT_TRACE_CONTROL_STOP);
if (ERROR_SUCCESS != status)
{
wprintf(L"ControlTrace(stop) failed with %lu\n", status);
}
}
if (pSessionProperties)
free(pSessionProperties);
}
관련 항목