Windows 在手动加载的DLL中使用RtlAddFunctionTable的SEH

Windows 在手动加载的DLL中使用RtlAddFunctionTable的SEH,windows,exception,visual-c++,dll,Windows,Exception,Visual C++,Dll,我正在手动将dll映射到使用(/EHa)编译的进程中。这可以捕获下面这样的异常。问题是,由于im手动映射dll,因此未注册异常/函数,这会在执行时导致程序崩溃。为了解决这个问题,我得出结论,我需要使用这个函数“RtlAddFunctionTable(…)”。遗憾的是,我无法获得调用函数的前两个参数(FunctionTable和EntryCount)。有人能帮我一下,告诉我如何得到前两个参数吗 BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reas

我正在手动将dll映射到使用(/EHa)编译的进程中。这可以捕获下面这样的异常。问题是,由于im手动映射dll,因此未注册异常/函数,这会在执行时导致程序崩溃。为了解决这个问题,我得出结论,我需要使用这个函数“RtlAddFunctionTable(…)”。遗憾的是,我无法获得调用函数的前两个参数(FunctionTable和EntryCount)。有人能帮我一下,告诉我如何得到前两个参数吗

BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
{
    RUNTIME_FUNCTION runtimeFunction = ?;
    DWORD size = ?;

    RtlAddFunctionTable(&runtimeFunction, size, (DWORD64)hModule);

    try
    {
        int var = *reinterpret_cast<int*>(0xFFFF);
    }
    catch (...) 
    {
        cout << "Exception" << endl;
    }

    return TRUE;
}
BOOL APIENTRY DllMain(HMODULE HMODULE,DWORD ul_原因,用于呼叫,LPVOID lpReserved)
{
运行时函数runtimeFunction=?;
DWORD大小=?;
RtlAddFunctionTable(&runtimeFunction,size,(DWORD64)hModule);
尝试
{
int var=*重新解释(0xFFFF);
}
捕获(…)
{
不能重新开始);
如果(pNTHeader->Signature!=图像\u NT\u签名)
返回false;
pOptHeader=(PIMAGE\u可选的\u标题)&pNTHeader->OptionalHeader;
如果(pOptHeader->Magic!=图像\u NT\u可选\u HDR\u Magic)
返回false;
PruntTime_函数pFunctionTable=(PruntTime_函数)((DWORD64)pOptHeader->DATADORY[图像\u目录\u条目\u异常].VirtualAddress+moduleBase);

cout由于您是在启用SEH的情况下构建.DLL,因此您需要的信息应该已经在PE文件中

根据,PE中的静态表优先于动态添加的表


如果出于某种原因需要使用自定义表,则需要使用
VirtualAlloc
为表分配内存代码,因为地址是相对的(RVA)。

因为您在生成启用SEH的.DLL时,所需的信息应该已经在PE文件中

根据,PE中的静态表优先于动态添加的表


如果出于某种原因需要使用自定义表,则需要使用
VirtualAlloc
为表代码分配内存,因为地址是相对的(RVA)。

是的,信息应该在“.pdata”部分。因此,我需要调用RtlAddFunctionTable(pdataAddress、pDataArraySize、moduleBaseAddress)因为“.pdata”部分是一个运行时函数数组,但它似乎没有按预期工作,因为代码仍然崩溃,并且没有引发异常。是的,信息应该在“.pdata”部分。所以我需要调用RtlAddFunctionTable(pdataAddress、pDataArraySize、moduleBaseAddress),因为“.pdata”节是一个运行时函数数组,但它似乎没有按预期工作,因为代码仍然崩溃,并且没有引发异常。
bool EnableExceptions(DWORD64 moduleBase)
{
    PIMAGE_DOS_HEADER pDOSHeader;
    PIMAGE_NT_HEADERS pNTHeader;
    PIMAGE_OPTIONAL_HEADER pOptHeader;

    pDOSHeader = (PIMAGE_DOS_HEADER)moduleBase;
    if (pDOSHeader->e_magic != IMAGE_DOS_SIGNATURE)
        return false;

    pNTHeader = (PIMAGE_NT_HEADERS)((PBYTE)pDOSHeader + pDOSHeader->e_lfanew);
    if (pNTHeader->Signature != IMAGE_NT_SIGNATURE)
        return false;

    pOptHeader = (PIMAGE_OPTIONAL_HEADER)& pNTHeader->OptionalHeader;
    if (pOptHeader->Magic != IMAGE_NT_OPTIONAL_HDR_MAGIC)
        return false;

    PRUNTIME_FUNCTION pFunctionTable = (PRUNTIME_FUNCTION)((DWORD64)pOptHeader->DataDirectory[IMAGE_DIRECTORY_ENTRY_EXCEPTION].VirtualAddress + moduleBase);
    cout << "functionTable " << hex << functionTable << endl;

    DWORD sizeFunctionTable = (pOptHeader->DataDirectory[3].Size / (DWORD)sizeof(RUNTIME_FUNCTION));
    cout << "functionTableSize " << dec << functionTableSize << endl;

    BOOL success = RtlAddFunctionTable(pFunctionTable, sizeFunctionTable, moduleBase);
    cout << "RtlAddFunctionTable " << success << endl;

    return success;
}