如何为TraceLogging提供程序内核创建实时etw使用者?

问题描述

我正在尝试为在驱动程序中声明的TraceLogging提供者创建实时使用者:

TRACELOGGING_DECLARE_PROVIDER(g_etwProvider);
TRACELOGGING_DEFINE_PROVIDER(g_etwProvider,"TraceLoggingProvider",(/*my guid*/));

用户模式提供者:

EVENT_TRACE_LOGFILEA etwTraceSettings{};
char loggerName[]{"TraceLoggingProvider"};
etwTraceSettings.LoggerName = loggerName;
etwTraceSettings.ProcesstraceMode = PROCESS_TRACE_MODE_REAL_TIME | PROCESS_TRACE_MODE_EVENT_RECORD;
etwTraceSettings.EventRecordCallback = MyCallback;
TRACEHANDLE traceHandle = OpenTraceA(&etwTraceSettings);
Processtrace(&traceHandle,1,nullptr,nullptr);

ProcessTrace返回ERROR_WMI_INSTANCE_NOT_FOUND。我究竟做错了什么? 我尝试在驱动程序中的Processtrace之前和之后调用TraceLoggingRegister。结果是一样的。

例如,logman可以在提供者注册之前创建会话。我也想这样做我该怎么办?

解决方法

必须通过StartTraceEnableTrace函数在OpenTrace之前创建ETW会话。