gpt4 book ai didi

c++ - 带有/SAFESEH 的自定义 SEH 处理程序

转载 作者:可可西里 更新时间:2023-11-01 13:32:34 37 4
gpt4 key购买 nike

我目前正在尝试用 C++ 创建一个编译器,它可以在运行时生成机器代码。但是,我目前正在尝试启用安全异常处理(使用/SAFESEH 进行编译)。我的自定义异常处理程序在 Debug模式下工作,但是当我在 Release模式下运行相同的代码时,我的进程就终止了。

我很确定问题是我未能像这样注册我的自定义异常处理程序,因为当我使用/SAFESEH:NO 编译我的代码时,即使在 Release模式下一切正常。

我的自定义异常处理程序是用我的其他 C++ 代码编写的,我试图通过向我的项目添加一个 .asm 文件来将其注册为异常处理程序,内容如下:

.386
.model flat
_MyExceptionHandler@16 proto
.safeseh _MyExceptionHandler@16
end

描述here .然后使用/safeseh 选项(以及其他选项)组装 asm 文件。

我的处理程序函数当前具有以下声明:

extern "C" EXCEPTION_DISPOSITION __stdcall MyExceptionHandler(struct
_EXCEPTION_RECORD *ExceptionRecord, void * EstablisherFrame, struct
_CONTEXT *ContextRecord, void * DispatcherContext);

将此函数注册为异常处理程序的正确方法是什么?

感谢您的任何建议!

最佳答案

我终于找到了一个描述问题的页面:here .但是,页面中的代码示例未经修改无法正常工作。

问题似乎是将外部程序注册为异常处理程序并没有按预期工作,因此您必须改为将本地程序集程序注册为异常处理程序。

根据前面提到的页面上给出的示例,这就是我最终得到的:

.386
.model flat, stdcall
option casemap :none

extern MyExceptionHandler@16:near

MyExceptionHandlerAsm proto
.SAFESEH MyExceptionHandlerAsm

.code
MyExceptionHandlerAsm proc
jmp MyExceptionHandler@16
MyExceptionHandlerAsm endp
end

这似乎可行,但很可能不是最优雅的解决方案。例如:为了避免在从 C/C++ 引用 MyExceptionHandlerAsm 时出现链接错误,我必须将其声明为:

extern "C" int __stdcall MyExceptionHandlerAsm();

如果有人试图从 C/C++ 调用 MyExceptionHandlerAsm,就会崩溃,因为参数的数量与 MyExceptionHandler 的数量不匹配。

关于c++ - 带有/SAFESEH 的自定义 SEH 处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12019689/

37 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com