为什么这个C程序无限循环?
我编写了一个DLL文件,可以将其注入另一个进程。一旦注入,它应该创建一个消息框。它似乎创建了无限多的MessageBox,我的电脑崩溃了。有什么想法吗?另外,DLLIMPORT和DWORD WINAPI之间有什么区别?主管道是DLLIMPORT还是其他管道 dllmain.c为什么这个C程序无限循环?,c,winapi,dll,C,Winapi,Dll,我编写了一个DLL文件,可以将其注入另一个进程。一旦注入,它应该创建一个消息框。它似乎创建了无限多的MessageBox,我的电脑崩溃了。有什么想法吗?另外,DLLIMPORT和DWORD WINAPI之间有什么区别?主管道是DLLIMPORT还是其他管道 dllmain.c /* Replace "dll.h" with the name of your header */ #include "dll.h" #include <windows.h> DLLIMPORT void
/* Replace "dll.h" with the name of your header */
#include "dll.h"
#include <windows.h>
DLLIMPORT void HelloWorld() {
MessageBox(0,"Hello World from DLL!\n","Hi",MB_ICONINFORMATION);
}
int main() {
MessageBox(0,"Hello World from DLL!\n","Hi",MB_ICONINFORMATION);
}
DWORD WINAPI Main(LPVOID lpParam) {
main();
return S_OK;
}
BOOL WINAPI DllMain(
HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) {
switch(fdwReason) {
case DLL_PROCESS_ATTACH:
break;
case DLL_PROCESS_DETACH:
break;
case DLL_THREAD_ATTACH:
DisableThreadLibraryCalls(hinstDLL);
CreateThread(NULL, 0, &Main, NULL, 0, NULL);
break;
case DLL_THREAD_DETACH:
break;
}
return TRUE;
}
当DLL附加到进程而不是线程时执行线程:
...
case DLL_PROCESS_ATTACH:
DisableThreadLibraryCalls(hinstDLL);
CreateThread(NULL, 0, Main, NULL, 0, NULL);
break;
case DLL_PROCESS_DETACH:
break;
case DLL_THREAD_ATTACH:
break;
case DLL_THREAD_DETACH:
break;
...
然后检查传递给
CreateThread
的回调,它应该是Main
而不是&Main
,它已经是指针。可能DLL\u THREAD\u ATTACH中的CreateThread()会导致另一个线程附加事件,该事件调用DllMain(),从而启动递归。那只是我的猜测。我对纯Win32不太了解。@BSH:为什么Main已经是指针了?如果我理解正确的话,Main是一个双字。因此,它是一个无符号整数。@user2899050Main
是指向函数的指针、地址,因此这里不需要使用&Main
。我真的不知道DWORD是从哪里来的,但是Main
不是DWORD
,它是一个函数指针。如果你提到大小,地址是32位,DWORD
是32位类型,但在64位系统上不是这样,DWORD
是32位,Main
地址是64位。我相信在获取函数地址时,Main和&Main是等价的。其他任何东西的地址都是另一回事。
...
case DLL_PROCESS_ATTACH:
DisableThreadLibraryCalls(hinstDLL);
CreateThread(NULL, 0, Main, NULL, 0, NULL);
break;
case DLL_PROCESS_DETACH:
break;
case DLL_THREAD_ATTACH:
break;
case DLL_THREAD_DETACH:
break;
...