【问题标题】:DLL Proxy call LoadLibrary cause exception : Access violation reading location 0x00000250DLL 代理调用 LoadLibrary 导致异常:访问冲突读取位置 0x00000250
【发布时间】:2018-06-05 16:56:58
【问题描述】:

我正在尝试为 dinput8.dll 创建一个代理 dll。 .exe 加载我的自定义 dll(代理 dll)dinput8.dll。 dinput8_x86.dll 是我的代理 dll 加载的原始 .dll 的重命名版本。一切正常,但是当我删除 MessageBox 代码行,然后重建项目时,我得到了错误:

在 localhost_dinput8.exe 中的 0x772BBC61 处引发异常:0xC0000005: 访问冲突读取位置 0x00000250。

localhost_dinput8.exe 中 0x772BBC61 处的未处理异常: 0xC000041D:在用户过程中遇到未处理的异常 回调。

跟踪 LoadLibrary(_T(".\\dinput8_x86.dll")); 时抛出异常。我不知道为什么,谁能帮助我,我不想每次加载我的 dll 时都显示那个消息框。如果我放回代码行:MessageBox -> 例外是GONE。 这是我的代理 DLL 示例代码。

#include "stdafx.h"
#include <windows.h>
#include <stdio.h>
#include <tchar.h>
#pragma pack(1)

FARPROC p[5] = { 0 };

extern "C" BOOL WINAPI DllMain(HINSTANCE hInst, DWORD reason, LPVOID)
{
    static HINSTANCE hL;
    if (reason == DLL_PROCESS_ATTACH)
    {
        hL = LoadLibrary(_T(".\\dinput8_x86.dll")); // The exception at here
        if (!hL) return false;
        p[0] = GetProcAddress(hL, "DllGetClassObject");
        p[1] = GetProcAddress(hL, "DllCanUnloadNow");
        p[2] = GetProcAddress(hL, "DirectInput8Create");
        p[3] = GetProcAddress(hL, "DllRegisterServer");
        p[4] = GetProcAddress(hL, "DllUnregisterServer");
//MessageBox(NULL,_T("Hello World"),_T("Hi"),NULL);//Exception gone when uncomment this line
    }
    if (reason == DLL_PROCESS_DETACH)
        FreeLibrary(hL);
    return TRUE;
}

extern "C" __declspec(naked) void Proxy_DllGetClassObject()
{
    __asm
    {
        jmp p[0 * 4];
    }
}

extern "C" __declspec(naked) void Proxy_DllCanUnloadNow()
{
    __asm
    {
        jmp p[1 * 4];
    }
}

extern "C" __declspec(naked) void Proxy_DirectInput8Create()
{
    __asm
    {
        jmp p[2 * 4];
    }
}

extern "C" __declspec(naked) void Proxy_DllRegisterServer()
{
    __asm
    {
        jmp p[3 * 4];
    }
}

extern "C" __declspec(naked) void Proxy_DllUnregisterServer()
{
    __asm
    {
        jmp p[4 * 4];
    }
}

这是我的定义文件: dinput8.def

EXPORTS
DllGetClassObject=Proxy_DllGetClassObject @1
DllCanUnloadNow=Proxy_DllCanUnloadNow @2
DirectInput8Create=Proxy_DirectInput8Create @3
DllRegisterServer=Proxy_DllRegisterServer @4
DllUnregisterServer=Proxy_DllUnregisterServer @5

附加信息:

  • 我正在使用 Win7 Professional x64 更新完整版

  • Visual Studio 2015

  • 基于 win32 x86 配置文件构建的项目


编辑

我意识到如果我将 MessageBox 替换为 WinUser.h 中的任何其他 API,例如 MessageBeepShowCursor strong>,异常不再显示。但是如果我删除它,就会出现异常。我还是不知道为什么?

【问题讨论】:

    标签: c++ exception dll proxy hook


    【解决方案1】:

    来自Dynamic-Link Library Best Practices

    您不应该在DllMain 中执行以下任务:

    致电LoadLibraryLoadLibraryEx(直接或间接)。这可能会导致死锁或崩溃。

    【讨论】:

    • 你能指导我如何在 DllMain 之外调用 LoadLibrary 吗?我尝试创建一个函数来运行 LoadLibrary,但仍然导致异常。抱歉,如果我的问题很愚蠢,我是 C++ 新手:p
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-01
    • 2013-11-22
    • 1970-01-01
    • 2011-09-28
    • 2023-03-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多