Объявление HMODULE вызывает исключение во время выполнения - PullRequest
0 голосов
/ 06 января 2012

Я пишу C ++ DLL, которая загружает другую DLL во время выполнения одной из своих функций. Однако, когда я пытаюсь запустить его, он падает, когда я впервые объявляю свою переменную HMODULE, даже прежде, чем я пытаюсь вызвать LoadLibrary.

В частности, мой код:

HMODULE my_hmod;
my_hmod = LoadLibrary("C:\\path_to_dll");

он падает между этими двумя строками (я прошел через него и заметил, что он падает в "ostream", если это полезно).

Исключение составляют следующие:

Необработанное исключение в 0x00a7392d (d3d9.dll) в PixelMotionBlur.exe: 0xC0000005: расположение чтения нарушения доступа 0x00000000.

Любая помощь будет принята с благодарностью! Я опубликую больше кода / отладочной информации, если это необходимо.

РЕДАКТИРОВАТЬ: вот фактический код функции:

    D3D9Wrapper::IDirect3D9* WINAPI Direct3DCreate9(UINT Version)
{
    InitializeDLL();
    HMODULE hD3D;
    if(IsWow64())
    {
        hD3D = LoadLibrary("C:\\Windows\\SysWOW64\\d3d9.dll");
    }
    else
    {
        hD3D = LoadLibrary(g_Globals.RealD3D9DLL.CString());
    }

    if( hD3D == NULL )
    {
        g_Globals.ErrorFile() << "LoadLibrary on d3d9.dll failed\n";
        return NULL;
    }

    D3D9Wrapper::D3DCREATE pCreate = (D3D9Wrapper::D3DCREATE)GetProcAddress(hD3D, _T("Direct3DCreate9"));
    if( pCreate == NULL )
    {
        g_Globals.ErrorFile() << "coud not find Direct3DCreate9 in d3d9.dll\n";
        return NULL;
    }

    D3D9Base::LPDIRECT3D9 pD3D = pCreate(D3D_SDK_VERSION);
    if( pD3D == NULL )
    {
        return NULL;
    }

    //return (D3D9Wrapper::IDirect3D9*)pD3D;
    return D3D9Wrapper::IDirect3D9::GetDirect3D(pD3D);
}

В случае, если это помогает, функция этой DLL (в большинстве случаев это не мой код, а используемый с разрешения) - перехватывать все вызовы d3d9.dll, помещая новую dll с именем d3d9 в папку с целевым файлом .exe. (сейчас я тестирую его с образцом .exes из Direct X 9 SDK).

РЕДАКТИРОВАТЬ 2: вот полная разборка функции:

    D3D9Wrapper::IDirect3D9* WINAPI Direct3DCreate9(UINT Version)
{
008B6960  push        ebp  
008B6961  mov         ebp,esp  
008B6963  and         esp,0FFFFFFF8h  
008B6966  sub         esp,8  
    InitializeDLL();
008B6969  cmp         byte ptr [g_Globals (8CAC40h)],0  
008B6970  push        esi  
008B6971  push        edi  
008B6972  jne         Direct3DCreate9+48h (8B69A8h)  
008B6974  mov         edi,offset g_Globals (8CAC40h)  
008B6979  call        Globals::Init (8B6A80h)  
008B697E  mov         eax,dword ptr [g_Globals+34h (8CAC74h)]  
008B6983  push        8C0D98h  
008B6988  push        eax  
008B6989  call        std::operator<<<std::char_traits<char> > (8938F0h)  
008B698E  call        dword ptr [__imp_D3D9CallbackInitialize (8B81A4h)]  
008B6994  mov         ecx,dword ptr [g_Globals+34h (8CAC74h)]  
008B699A  push        8C0DB0h  
008B699F  push        ecx  
008B69A0  call        std::operator<<<std::char_traits<char> > (8938F0h)  
008B69A5  add         esp,10h  
    HMODULE hD3D;
    if(IsWow64())
008B69A8  push        8C0E60h  
008B69AD  push        8C0E70h  
008B69B2  mov         dword ptr [esp+14h],0  
008B69BA  call        dword ptr [__imp__GetModuleHandleA@4 (8B80D0h)]  
008B69C0  mov         edi,dword ptr [__imp__GetProcAddress@8 (8B80C4h)]  
008B69C6  push        eax  
008B69C7  call        edi  
008B69C9  mov         esi,eax  
008B69CB  test        esi,esi  
008B69CD  je          Direct3DCreate9+94h (8B69F4h)  
008B69CF  lea         edx,[esp+0Ch]  
008B69D3  push        edx  
008B69D4  call        dword ptr [__imp__GetCurrentProcess@0 (8B80B8h)]  
008B69DA  push        eax  
008B69DB  call        esi  
008B69DD  test        eax,eax  
008B69DF  jne         Direct3DCreate9+94h (8B69F4h)  
008B69E1  mov         eax,dword ptr [g_Globals+3Ch (8CAC7Ch)]  
008B69E6  push        8C0E7Ch  
008B69EB  push        eax  
008B69EC  call        std::operator<<<std::char_traits<char> > (8938F0h)  
008B69F1  add         esp,8  
008B69F4  cmp         dword ptr [esp+0Ch],0  
008B69F9  je          Direct3DCreate9+0A2h (8B6A02h)  
    {
        hD3D = LoadLibrary("C:\\Windows\\SysWOW64\\d3d9.dll");
008B69FB  push        8C0E98h  
    }
    else
008B6A00  jmp         Direct3DCreate9+0B1h (8B6A11h)  
    {
        hD3D = LoadLibrary(g_Globals.RealD3D9DLL.CString());
008B6A02  mov         eax,dword ptr [g_Globals+1Ch (8CAC5Ch)]  
008B6A07  test        eax,eax  
008B6A09  jne         Direct3DCreate9+0B0h (8B6A10h)  
008B6A0B  mov         eax,offset g_Globals+1Ch (8CAC5Ch)  
008B6A10  push        eax  
008B6A11  call        dword ptr [__imp__LoadLibraryA@4 (8B80CCh)]  
    }

    if( hD3D == NULL )
008B6A17  test        eax,eax  
008B6A19  jne         Direct3DCreate9+0D9h (8B6A39h)  
    {
        g_Globals.ErrorFile() << "LoadLibrary on d3d9.dll failed\n";
008B6A1B  mov         ecx,dword ptr [g_Globals+3Ch (8CAC7Ch)]  
008B6A21  push        8C0EB8h  
008B6A26  push        ecx  
008B6A27  call        std::operator<<<std::char_traits<char> > (8938F0h)  
008B6A2C  add         esp,8  
        return NULL;
008B6A2F  xor         eax,eax  
}
008B6A31  pop         edi  
008B6A32  pop         esi  
008B6A33  mov         esp,ebp  
008B6A35  pop         ebp  
008B6A36  ret         4  
    }
    D3D9Wrapper::D3DCREATE pCreate = (D3D9Wrapper::D3DCREATE)GetProcAddress(hD3D, _T("Direct3DCreate9"));
008B6A39  push        8C0ED8h  
008B6A3E  push        eax  
008B6A3F  call        edi  
    if( pCreate == NULL )
008B6A41  test        eax,eax  
008B6A43  jne         Direct3DCreate9+103h (8B6A63h)  
    {
        g_Globals.ErrorFile() << "coud not find Direct3DCreate9 in d3d9.dll\n";
008B6A45  mov         edx,dword ptr [g_Globals+3Ch (8CAC7Ch)]  
008B6A4B  push        8C0EE8h  
008B6A50  push        edx  
008B6A51  call        std::operator<<<std::char_traits<char> > (8938F0h)  
008B6A56  add         esp,8  
        return NULL;
008B6A59  xor         eax,eax  
}
008B6A5B  pop         edi  
008B6A5C  pop         esi  
008B6A5D  mov         esp,ebp  
008B6A5F  pop         ebp  
008B6A60  ret         4  
    }

РЕДАКТИРОВАТЬ 3: стек вызовов на исключение:

>   d3d9.dll!std::operator<<<std::char_traits<char> >(std::basic_ostream<char,std::char_traits<char> > & _Ostr, const char * _Val)  Line 773 + 0x3 bytes    C++
    d3d9.dll!InitializeDLL()  Line 70 + 0x15 bytes  C++
    d3d9.dll!Direct3DCreate9(unsigned int Version)  Line 141    C++
    PixelMotionBlur.exe!DXUT_Dynamic_Direct3DCreate9(unsigned int SDKVersion)  Line 714 + 0xc bytes C++
    PixelMotionBlur.exe!DXUTDelayLoadD3D9()  Line 2706 + 0xa bytes  C++
    PixelMotionBlur.exe!DXUTGetD3D9Object()  Line 712 + 0x23 bytes  C++
    PixelMotionBlur.exe!CD3D9Enumeration::Enumerate(bool (_D3DCAPS9 *, _D3DFORMAT, _D3DFORMAT, bool, void *)* IsD3D9DeviceAcceptableFunc, void * pIsD3D9DeviceAcceptableFuncUserContext)  Line 309 + 0x5 bytes  C++
    PixelMotionBlur.exe!DXUTGetD3D9Enumeration(bool bForceEnumerate)  Line 255  C++
    PixelMotionBlur.exe!DXUTFindValidDeviceSettings(DXUTDeviceSettings * pOut, DXUTDeviceSettings * pIn, DXUTMatchOptions * pMatchOptions)  Line 174    C++
    PixelMotionBlur.exe!DXUTCreateDevice(bool bWindowed, int nSuggestedWidth, int nSuggestedHeight)  Line 2010 + 0x17 bytes C++
    PixelMotionBlur.exe!wWinMain(HINSTANCE__ * __formal, HINSTANCE__ * __formal, HINSTANCE__ * __formal, HINSTANCE__ * __formal)  Line 207  C++
    PixelMotionBlur.exe!__tmainCRTStartup()  Line 547 + 0x2c bytes  C
    PixelMotionBlur.exe!wWinMainCRTStartup()  Line 371  C
    kernel32.dll!75e1339a()     
    [Frames below may be incorrect and/or missing, no symbols loaded for kernel32.dll]  
    ntdll.dll!77829ed2()    
    ntdll.dll!77829ea5()    

Ответы [ 2 ]

2 голосов
/ 06 января 2012

В зависимости от стека вызовов, ошибка в функции InitializeDLL.Не могу сказать наверняка, не увидев исходный код этой функции, но, поскольку это исключение NULL-указателя через std :: ostream, я бы поспорил, что вы пытаетесь отправить строку NULL в std :: cout или что-то подобное.

Проверьте строку 70 исходного файла, в которой находится InitializeDLL. Если вы не видите проблему, отправьте код из InintializeDLL.

0 голосов
/ 06 января 2012

Убедитесь, что вы работаете и собираете отладочную версию вашей программы. В VS2010 убедитесь, что у вас выбрана конфигурация сборки «Debug», и в меню отладчика убедитесь, что вы работаете с исключениями C ++.

Вы правы - я могу сделать следующее очень хорошо.

HMODULE hD3D = LoadLibrary(L"C:\\Windows\\SysWOW64\\d3d9.dll");
...