读书人

从一个dll中失去的函数调用成功无

发布时间: 2012-10-18 13:46:55 作者: rapoo

从一个dll中得到的函数,调用成功,无法返回
是调用intel的显卡驱动的某个函数出粗,代码如下:

C/C++ code
HMODULE hMoudle2=LoadLibraryEx("C:\\WINDOWS\\system32\\igxpgd32.dll",        NULL,DONT_RESOLVE_DLL_REFERENCES);         DWORD dwErrNum=0;    if   (hMoudle   ==   NULL)         dwErrNum=GetLastError(); //__stdcall wrong,FAR PASCAL wrong,__cdcel wrong//project page:stdcall(/gz) wrong,__cdecl (/Gd) wrong,fastcall :buffer overrun        typedef BOOL (*pDrvEnableDriver)(        ULONG iEngineVersion,        ULONG cj,        DRVENABLEDATA *pded        );    pDrvEnableDriver pMyDrvEnableDriver=(pDrvEnableDriver)GetProcAddress(hMoudle2,"DrvEnableDriver");    DRVENABLEDATA DrvData;    try    {        BOOL bRe=pMyDrvEnableDriver(DDI_DRIVER_VERSION_NT5,sizeof(DRVENABLEDATA),&DrvData); /* DrvData被赋值,bRe没有变化,函数无法返回,错误:Unhandled exception at 0x00024374 in graphedt.exe: 0xC0000005: Access violation reading location 0x00024374. */    dwErrNum=GetLastError();      //无法执行到这里        }catch(...)        {}



我晕了,改了各种调用方式都错。
反汇编部分如下:
Assembly code
HMODULE hMoudle2=LoadLibraryEx("C:\\WINDOWS\\system32\\igxpgd32.dll",        NULL,DONT_RESOLVE_DLL_REFERENCES);     100699FD  mov         esi,esp 100699FF  push        1    10069A01  push        0    10069A03  push        offset string "C:\\WINDOWS\\system32\\igxpgd32.dll"... (101184A4h) 10069A08  call        dword ptr [__imp__LoadLibraryExA@12 (1014C728h)] 10069A0E  cmp         esi,esp 10069A10  call        @ILT+9915(__RTC_CheckEsp) (1005C6C0h) 10069A15  mov         dword ptr [ebp-1CD8h],eax     DWORD dwErrNum=0;10069A1B  mov         dword ptr [ebp-1CE4h],0     if   (hMoudle   ==   NULL) 10069A25  cmp         dword ptr [ebp-1CCCh],0 10069A2C  jne         CVideoProcessorFilter::LoadProcessorModule+3B3h (10069A43h)         dwErrNum=GetLastError(); 10069A2E  mov         esi,esp 10069A30  call        dword ptr [__imp__GetLastError@0 (1014C724h)] 10069A36  cmp         esi,esp 10069A38  call        @ILT+9915(__RTC_CheckEsp) (1005C6C0h) 10069A3D  mov         dword ptr [ebp-1CE4h],eax //__stdcall wrong,FAR PASCAL wrong,__cdcel wrong//project page:stdcall(/gz) wrong,__cdecl (/Gd) wrong,fastcall :buffer overrun        typedef BOOL (*pDrvEnableDriver)(        ULONG iEngineVersion,        ULONG cj,        DRVENABLEDATA *pded        );    pDrvEnableDriver pMyDrvEnableDriver=(pDrvEnableDriver)GetProcAddress(hMoudle2,"DrvEnableDriver");10069A43  mov         esi,esp 10069A45  push        offset string "DrvEnableDriver" (10118490h) 10069A4A  mov         eax,dword ptr [ebp-1CD8h] 10069A50  push        eax  10069A51  call        dword ptr [__imp__GetProcAddress@8 (1014C720h)] 10069A57  cmp         esi,esp 10069A59  call        @ILT+9915(__RTC_CheckEsp) (1005C6C0h) 10069A5E  mov         dword ptr [ebp-1CF0h],eax 10069A64  mov         dword ptr [ebp-4],0     DRVENABLEDATA DrvData;    try    {        BOOL bRe=pMyDrvEnableDriver(DDI_DRIVER_VERSION_NT5,sizeof(DRVENABLEDATA),&DrvData);10069A6B  mov         esi,esp 10069A6D  lea         eax,[ebp-1D04h] 10069A73  push        eax  10069A74  push        0Ch  10069A76  push        30000h 10069A7B  call        dword ptr [ebp-1CF0h] 10069A81  cmp         esi,esp 10069A83  call        @ILT+9915(__RTC_CheckEsp) (1005C6C0h) 10069A88  mov         dword ptr [ebp-3680h],eax 10069A8E  mov         ecx,dword ptr [ebp-3680h] 10069A94  mov         dword ptr [bRe],ecx 


[解决办法]
Access violation reading location 0x00024374. ?
应该是GetProcAddress那里就出错了
[解决办法]
试试把DONT_RESOLVE_DLL_REFERENCES去掉,可能这个DLL必须执行DllMain的一些函数


[解决办法]
加 WINAPI 试试看,估计是调用方式不对出错了

typedef BOOL (WINAPI*pDrvEnableDriver)(
ULONG iEngineVersion,
ULONG cj,
DRVENABLEDATA *pded
);

[解决办法]
这个DLL里面会不会有什么问题呢?比如多线程什么的导致不能返回

读书人网 >VC/MFC

热点推荐