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

标签 c++ windows visual-studio-2008 assembly

我目前正在尝试用 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/

相关文章:

c++ - "Rock, paper, scissors"C++ 代码有问题

c++ - 将#warning 放入#define 的正文中

windows - 如何在 firefox 和 chrome 中安装解压的扩展?

c# - 如何通过 C# 使用 Java Applet?

c++ - C++中两个字符串的比较

c++ - 为什么不使用 std::is_constructible 编译?

c - 如何在 Windows 上安装 JudyArrays(C 库)

windows - 无法使用 python2.7 在 Windows 上启动 boa 构造函数

asp.net - 将生成后事件添加到Visual Studio 2008中的网站

visual-studio-2008 - 为什么 Visual Studio 占用我其他程序的热键?