Windows ETW: OpenTrace/ProcessTrace无错但EVENT_CALLBACK回调未触发
问题根因与修复方案
你代码的核心错误集中在API定义、结构体对齐、常量定义三个方面,按以下步骤修复即可正常触发回调:
1. 修正OpenTraceW返回值定义
官方OpenTraceW返回64位的TRACEHANDLE类型,你错误声明为32位的Cardinal,64位编译环境下会直接截断句柄值,导致后续逻辑异常:
// 错误写法 // function OpenTraceW(var Logfile : EVENT_TRACE_LOGFILEW): Cardinal; stdcall; external advapi32 name 'OpenTraceW'; // 正确写法 function OpenTraceW(var Logfile : EVENT_TRACE_LOGFILEW): TRACEHANDLE; stdcall; external advapi32 name 'OpenTraceW';
2. 修正INVALID_PROCESSTRACE_HANDLE常量定义
你沿用了32位的无效句柄定义,64位下无效句柄值为全1的64位值:
// 错误写法,仅支持32位 // INVALID_PROCESSTRACE_HANDLE: TRACEHANDLE = INVALID_HANDLE_VALUE; // 正确写法,全平台兼容 INVALID_PROCESSTRACE_HANDLE: TRACEHANDLE = High(TRACEHANDLE);
3. 移除所有结构体的packed修饰符
packed会强制结构体按1字节对齐,覆盖你设置的{$ALIGN 8}全局对齐规则,导致结构体成员偏移和Windows API要求不符,系统无法正确读取你设置的回调函数地址。请移除以下结构体的packed修饰:
EVENT_TRACE_HEADEREVENT_TRACEEVENT_TRACE_LOGFILEW
示例修改:
// 错误写法 // EVENT_TRACE_HEADER = packed record // 正确写法 EVENT_TRACE_HEADER = record
可选优化:兼容新式ETL事件
如果你读取的是Windows 10之后生成的新式Manifest类型ETL事件,老的EVENT_CALLBACK默认不会触发,建议切换为EVENT_RECORD_CALLBACK回调,同时设置ProcessTraceMode为PROCESS_TRACE_MODE_EVENT_RECORD即可。
内容的提问来源于stack exchange,提问作者Ian Boyd
相关产品推荐
相关产品推荐

