如何为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
相关产品推荐
相关产品推荐

