异常机制不起作用

Exception mechanism not working

我有一个简单的 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 有什么条件呢?

Also I should say that problem in my loader I'm using own pe-mapper which loading dll without LoadLibrary

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


为什么?你可以问。因为 RtlDispatchException - api 执行异常调度 - 不是无条件地调用异常处理程序,而是在此之前进行许多检查。它检查的是某些 DLL 中处理程序的地址。如果是并且这个 DLLsafe SEH - are handler address registered. if not in any DLL - are memory in where handler is in section (file mapping on win32 language) and are this section mapped as image (with SEC_IMAGE attribute) - otherwise this handler will be ignored. in case x64 - handlers at all not registred in TEB but in DLL section only (look RUNTIME_FUNCTION ). so system walk by list of DLL loaded for found handler address - look for RtlLookupFunctionEntry - 所以如果你的代码不在 DLL 列表系统中根本找不到你的处理程序。

再次异常处理不起作用,因为且仅因为您没有使用 LoadLibrary

加载代码