x64 DLL的一个很奇怪问题 简单的一个hello world也能出错!!!

没原来那个名字长了 2018-05-03 03:19:16
DLL中用到了asm内联汇编,从汇编call TestFun创建线程啥的没问题运行正常,但调用OutputDebugString或MessageBox都会出错,不知道哪里写的不对,还请指教
DLL的代码如下:

DWORD WINAPI TestShow(LPVOID lpParameter)
{
while(1)
{
Sleep(1000);
OutputDebugString("Test Sleep");
}

return 0;
}
EXTERN_C void TestFun()
{
//OutputDebugString("TestFun");//============就是这里出错了
//MessageBox(0,"TestFun","成功",0);
::CreateThread(NULL,0,TestShow,NULL,0,NULL);
return ;
}
BOOL APIENTRY DllMain( HMODULE hModule,DWORD ul_reason_for_call,LPVOID lpReserved)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
{
AsmFun();
break;
}
case DLL_THREAD_ATTACH:
break;
case DLL_THREAD_DETACH:
break;
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}

asm的代码如下:

extrn TestFun:proc

.CODE

AsmFun PROC
call TestFun
ret
AsmFun ENDP

END

用内联汇编调用TestFun这个函数弹个hello world都不行,,,这是为啥???创建线程然后在线程里弹就没事
...全文
582 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
我还是没能调用成功,,,,老师讲的太深了不会设置 链接:https://pan.baidu.com/s/1Xk_z3NG75GGvxP-YbVSQvA 密码:oay4 这个是我的源码 vs2010创建的
  • 打赏
  • 举报
回复
还是直接上intel编译器方便内联,,,受不了这个vs,,,,,,结贴
赵4老师 2018-05-03
  • 打赏
  • 举报
回复
http://edu.csdn.net/course/detail/2344 C语言指针与汇编内存地址-一.代码要素 调用约定 https://msdn.microsoft.com/zh-cn/magazine/9b372w95.aspx
hhhh63 2018-05-03
  • 打赏
  • 举报
回复
应该是调用的地址有问题,单步走一下试试。
boylafong 2018-05-03
  • 打赏
  • 举报
回复
提示什么错误?
赵4老师 2018-05-03
  • 打赏
  • 举报
回复
在参考该list汇编文件改写你的汇编文件。 纠正为 再编译,生成并参考该list汇编文件改写你的汇编文件。
赵4老师 2018-05-03
  • 打赏
  • 举报
回复
你先用C/CPP写一个空函数,其原型和你计划用汇编代替的原型相同。 再设置编译选项生成中间list汇编文件 在参考该list汇编文件改写你的汇编文件。 把大象装进冰箱,一共分以上三步。
  • 打赏
  • 举报
回复
没有错误提示,,,直接DLL不执行了 调用的地址没问题哦,,,,,因为注解掉MessageBox就正常了,x64dbg单步走进入MessageBox系统代码段F9出错 c000000005内存不可读 查看内存部局dll已经没有了 应该是赵4老师说的调用约定的问题,,因为我把call改成jmp后正常 ,,,但jmp过去不会自动返回啊

extern TestFun:proc

.CODE

AsmFun PROC
jmp TestFun ;这里改jmp可以调用成功
ret
AsmFun ENDP

END
话说这个调用约定怎么设置 extern "C" void __fastcall TestFun(); //cpp里可以这样设置 但asm文件里根本编译不过去 这个是我asm文件自定义的生成命令行:ml64 /Fo $(IntDir)%(fileName).obj /c %(fileName).asm 参考以前的.model flat,stdcall 改.model flat,fastcallcall 也不行 .model ml64根本不认识啊啊啊 业余选手就是这样 基本语法不懂啊 求各位大神补充

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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