2013-10-20 72 views
2

我寫了一個DLL文件,我可以注入到另一個進程中。一旦注入,它應該創建一個消息框。它似乎創建了無限數量的消息框和我的電腦崩潰。有任何想法嗎?此外,DLLIMPORT和DWORD WINAPI有什麼區別?主要應該是DLLIMPORT還是其他?爲什麼這個C程序無限循環?

dllmain.c

/* 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.h

#ifndef _DLL_H_ 
#define _DLL_H_ 

#if BUILDING_DLL 
#define DLLIMPORT __declspec(dllexport) 
#else 
#define DLLIMPORT __declspec(dllimport) 
#endif 

DLLIMPORT void HelloWorld(); 

#endif 
+0

DLL_THREAD_ATTACH中的CreateThread()可能會導致另一個線程附加事件,該事件調用DllMain(),從而啓動遞歸。這只是我的猜測。我對純粹的Win32一無所知。 – siride

回答

2

執行線程當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,它已經是指針了。

+1

[雖然在'DllMain'中執行此操作可能不是一個好主意](http://blogs.msdn.com/b/oldnewthing/archive/2007/09/04/4731478.aspx)。 –

+0

@BSH:爲什麼Main已經是一個指針了?如果我理解正確,Main是一個DWORD。因此,它是一個無符號整數。 – user2899050

+0

@ user2899050'Main'是函數的指針,地址,所以在這裏沒有必要使用'&Main'。我真的不知道'DWORD'來自哪裏,但'Main'不是'DWORD',它是一個函數指針。如果參考大小,地址是32位,DWORD是32位類型,但64位系統不是這種情況,DWORD是32位,主地址是64位。 – 2013-10-20 03:09:22