2011-12-19 87 views
2

我正在嘗試加載.dll文件,並在加載時顯示消息框。根據我的理解,一旦加載了.dll,它會撥打電話dllmain()並切換到DLL_PROCESS_ATTACH選項。我已經編寫了.dll和加載它的.exe的代碼。 .exe可以正確加載並打印出已加載dll的地址,但我看不到正在顯示的消息框。我在Microsoft.com上的某個地方讀到,dll在加載時會進入「鎖定」狀態,以防止爲了安全目的而執行某些功能或代碼。此功能是否阻止顯示消息框?有沒有像升級的特權,系統等等的工作?我不確定DEP是否也有影響,我已經設置爲只保護關鍵的Windows進程。DLL_PROCESS_ATTACH無法在Windows 7上執行C++

調用進程:

#include <iostream> 
#include <windows.h> 
int main() 
{ 
    HMODULE hDll = LoadLibraryA("dll.dll"); 
    if (hDll == NULL) 
     std::cerr << "Unable to load dll"; 
    else 
     std::cout << "Dll loaded @ " << hDll; 
    FreeLibrary(hDll); 
} 

DLL文件:

#include <windows.h> 
BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) 
{ 
    switch (fdwReason) 
    { 
     case DLL_PROCESS_ATTACH: 
      MessageBox(NULL, "Dll has been loaded.", "Loaded", MB_OK); 
      break; 
    } 
    return TRUE; 
} 

我認爲它可以幫助我,如果我有辦法運行.dll雖然一個調試器,看看有什麼MessageBox()返回,但我不知道該怎麼做。謝謝!

+0

只是猜測在這裏,但你*實際上沒有做任何事情*除了名爲「加載」它的DLL以外 - 你可能會發現Windows在你第一次做大量事情時會懶惰地調用'DllMain'圖書館。 – 2011-12-19 04:06:51

+0

@coolcoder:你說得對,使用調試器會有幫助。 – bk1e 2011-12-19 08:59:45

回答

5

雷蒙德陳有話要說這在他的博客文章標題爲Some reasons not to do anything scary in your DllMain

而且絕對在任何情況下,你應該做什麼瘋狂的你DLL_PROCESS_ATTACH內創建一個窗口。除了線程相關性問題外,還有全局鉤子的問題。在裝載機鎖內運行的掛鉤是災難的祕訣。如果您的機器發生死鎖,請不要感到驚訝。

+1

+1,我打算鏈接到相同的博客文章 – 2011-12-19 03:44:36

1

除了博客文章Greg鏈接,也有對loader lock和東西you shouldnot doin DllMain其他幾個翔實的帖子。

一般而言,您應該只調用kernel32中不創建線程/窗口,使用COM或調用LoadLibrary(或涉及加載程序鎖定的其他函數)的函數。一個合理的安全事件列表恕我直言:DisableThreadLibraryCalls,Tls *,InitializeCriticalSection和你的情況(用於調試目的); OutputDebugString