从一个dll中得到的函数,调用成功,无法返回

神-气 2012-09-03 04:35:05
是调用intel的显卡驱动的某个函数出粗,代码如下:

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(...)
{}



我晕了,改了各种调用方式都错。
反汇编部分如下:

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
...全文
304 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
神-气 2012-09-04
  • 打赏
  • 举报
回复
算了,我懒得再试了,直接用

__try
{
}
__except(EXCEPTION_EXECUTE_HANDLER)
{
}

解决。
神-气 2012-09-04
  • 打赏
  • 举报
回复
我能跳过函数返回直接执行下面的代码吗?
神-气 2012-09-04
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 的回复:]

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

这个我也不清楚,因为DLL是Intel写的。我只能先找是不是其他原因。
w_xei 2012-09-04
  • 打赏
  • 举报
回复
这个DLL里面会不会有什么问题呢?比如多线程什么的导致不能返回
神-气 2012-09-04
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]

加 WINAPI 试试看,估计是调用方式不对出错了

typedef BOOL (WINAPI*pDrvEnableDriver)(
ULONG iEngineVersion,
ULONG cj,
DRVENABLEDATA *pded
);
[/Quote]

调用方式我换过好多种,都不行。
神-气 2012-09-04
  • 打赏
  • 举报
回复
很抱歉现在才看到你们的回复,非常感谢。

GetProcAddress是成功的,返回的hMoudle2 OK,然后pMyDrvEnableDriver也执行了,DrvData被赋值了,而且是合理的。
zgl7903 2012-09-03
  • 打赏
  • 举报
回复
加 WINAPI 试试看,估计是调用方式不对出错了

typedef BOOL (WINAPI*pDrvEnableDriver)(
ULONG iEngineVersion,
ULONG cj,
DRVENABLEDATA *pded
);
dickbarry 2012-09-03
  • 打赏
  • 举报
回复
另外,看看GetProcAddress返回是否成功
dickbarry 2012-09-03
  • 打赏
  • 举报
回复
试试把DONT_RESOLVE_DLL_REFERENCES去掉,可能这个DLL必须执行DllMain的一些函数
Gloveing 2012-09-03
  • 打赏
  • 举报
回复
Access violation reading location 0x00024374. ?
应该是GetProcAddress那里就出错了
Gloveing 2012-09-03
  • 打赏
  • 举报
回复
Access violation reading location 0x00024374. ?
应该是GetProcAddress那里就出错了
神-气 2012-09-03
  • 打赏
  • 举报
回复
求帮助...能有什么解决的方法吗?。。

19,463

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧