首页
社区
课程
招聘
[讨论]难道是微软的BUG
发表于: 2011-12-9 10:27 4326

[讨论]难道是微软的BUG

2011-12-9 10:27
4326
大家都写过DLL调用过自己的函数吧  我最近也写了个发现个问题

先说问题  函数大体结构在下面
问题 调用了函数  GetHookPortInfo(&buf,dwLen);
居然打印出来 &buf 自动偏移了 8个字节  希望高人指点咋回事

这是一次打印的内容           注释
aa buf 地址=00122ab0       EXE中  调用前 &buf
111buf 地址=00122ab0      DLL中  函数前 pBuf=&buf
222buf 地址=00122ab0      DLL中  函数末尾 pBuf==&buf
bb buf 地址=00122ab8      DLL函数调用结束 EXE中 pBuf!=&buf  这里

这个是DLL函数
bool  __stdcall          GetHookPortInfo(PVOID pBuf,DWORD nLen )
{
        printf("111buf 地址=%08x\n",(DWORD)pBuf);

        XXXXXX函数内容

printf("222buf 地址=%08x\n",(DWORD)pBuf);

        CloseHandle(DeviceHandle);
        return  true;
}

这个是 EXE调用DLL的地方

printf("aa buf 地址=%08x\n",&buf);
if( GetHookPortInfo( &buf,dwLen ) )
{
   XXX内容
}
printf("bb buf 地址=%08x\n",&buf);

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费
支持
分享
最新回复 (4)
雪    币: 1897
活跃值: (1971)
能力值: ( LV12,RANK:230 )
在线值:
发帖
回帖
粉丝
2
双方的调用约定不一致
2011-12-9 11:05
0
雪    币: 204
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
楼上一下就看出来了 真是高手  
但是 我2边都定义的是  __stdcall的呀
DLL中定义
bool  __stdcall          GetHookPortInfo(PVOID pBuf,DWORD nLen )
EXE中的声明      难道这个地方有问题
typedef  bool (*__stdcall        GETHOOKPORTINFO)(PVOID pBuf,DWORD nLen );

这个是我的 DEF文件
LIBRARY        "jahookportdll"
EXPORTS
                GetHookPortInfo
2011-12-9 11:09
0
雪    币: 204
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
我确认是 调用约定的问题了  把2个地方的 __stdcall 去掉就可以了

但是真不明白 为什么STDCALL 就会出问题
DLL中定义
bool __stdcall GetHookPortInfo(PVOID pBuf,DWORD nLen )
EXE中的声明 难道这个地方有问题
typedef bool (*__stdcall GETHOOKPORTINFO)(PVOID pBuf,DWORD nLen );

改成
bool   GetHookPortInfo(PVOID pBuf,DWORD nLen )
typedef bool (* GETHOOKPORTINFO)(PVOID pBuf,DWORD nLen );
2011-12-9 11:20
0
雪    币: 204
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
再次纠正错误

typedef bool (*__stdcall GETHOOKPORTINFO)(PVOID pBuf,DWORD nLen );

改成
typedef bool (__stdcall* GETHOOKPORTINFO)(PVOID pBuf,DWORD nLen );

居然这样会有这样的错误 ** 微软还不如直接让编译通不过算了
2011-12-10 08:50
0
游客
登录 | 注册 方可回帖
返回

账号登录
验证码登录

忘记密码?
没有账号?立即免费注册