异常机制不起作用

时间:2017-05-21 14:04:02

标签: c++ exception portable-executable loadlibrary

我有一个简单的dll项目,当加载dll时,它会创建带代码的线程:

try
{
    throw std::exception("Not working");
}
catch (std::exception &err)
{
    printf("error %s\n", err.what());
}
catch (...)
{
    printf("unhandled\n");
}

但是这段代码不起作用,它仍然告诉我未处理的异常 我也应该在装载机中说出问题 我使用自己的pe-mapper加载没有LoadLibrary的dll 所以相同的代码工作在单独的exe或甚至简单的注入 显然,由于某种原因机制被打破,我之前解决了问题,例如用fmath 问题是如何使异常机制起作用? LoadLibrary有什么条件吗?

1 个答案:

答案 0 :(得分:1)

  

另外我应该说我的装载机中的问题我正在使用自己的pe-mapper   哪个加载DLL没有LoadLibrary

这正是导致任何异常处理程序无法在您的代码中运行的原因。您只需使用LoadLibraryLdrLoadDll进行例外工作。但即使只有LoadLibrary存在的方式只能从内存加载文件 - 而不是从磁盘加载,但这是另一个故事

为什么?你可以问。因为 RtlDispatchException - 执行异常调度的api - 不是无条件地调用异常处理程序,而是在此之前做了很多检查。它检查一些 DLL 中的处理程序的地址。如果是,并且此 DLL 具有safe SEH - 是已注册的处理程序地址。如果不在任何 DLL 中 - 处理器位于部分中的内存(win32语言中的文件映射)并且此部分映射作为图像(使用SEC_IMAGE属性) - 否则将忽略此处理程序。如果是x64 - 处理程序根本没有在 TEB 中注册,而只在 DLL 部分注册(查看RUNTIME_FUNCTION)。所以系统按照找到的处理程序地址加载的 DLL 列表 - 查找RtlLookupFunctionEntry - 所以如果你的代码不在 DLL 列表系统中根本找不到你的经纪人。

再次异常处理无效,因为您没有使用LoadLibrary

加载代码