You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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_HEADER
  • EVENT_TRACE
  • EVENT_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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 07:06:04