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

如何为RtlUnwindEx调用正确填充EXCEPTION_RECORD结构体

关于STATUS_UNWIND_CONSOLIDATE的ExceptionInformation[0]取值问题

当使用STATUS_UNWIND_CONSOLIDATE触发合并展开时,EXCEPTION_RECORD.ExceptionInformation[0]需要填充指向原始异常记录的指针——也就是你的VEH处理函数中接收到的ex->ExceptionRecord的地址。

原因说明

STATUS_UNWIND_CONSOLIDATE的作用是告诉系统展开机制,将当前的 unwind 操作与最初触发的异常合并,确保后续的异常处理链(比如C++的catch块)能正确访问到原始异常的信息。这个参数是展开过程中定位原始异常上下文的关键。

修改后的代码片段

if (result == EXCEPTION_EXECUTE_HANDLER) {
    EXCEPTION_RECORD EH;
    EH.ExceptionCode = STATUS_UNWIND_CONSOLIDATE;
    EH.ExceptionFlags = EXCEPTION_NONCONTINUABLE;
    EH.NumberParameters = 1;
    // 填充原始EXCEPTION_RECORD的指针
    EH.ExceptionInformation[0] = reinterpret_cast<ULONG_PTR>(ex->ExceptionRecord);
    
    RtlUnwindEx((void*)establisher_frame, frames[i], &EH, NULL, ex->ContextRecord, NULL);
    return EXCEPTION_CONTINUE_EXECUTION;
}

额外注意事项

  • 确保ex->ExceptionRecord在RtlUnwindEx执行期间始终有效,不能提前释放或销毁
  • 由于设置了EXCEPTION_NONCONTINUABLE,后续不能尝试回到原始异常的执行路径
  • 要确认establisher_frame和frames[i](ControlPc)的正确性,这两个参数决定了展开操作的起点和目标指令位置

内容的提问来源于stack exchange,提问作者Hasakiss Haselioss

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 18:35:09