2011-04-11 87 views
1

我嘗試註冊一個名爲的Mix DLL.dll MixBox.dll。我發現了它所依賴的所有dll。當第一次執行DllMain時,它會凍結並永遠不會返回。這似乎是一個僵局,但我不打電話給任何LoadLibrary,它從不執行到DllMain。這種情況還有其他原因嗎?這就是DllMain完全相同的樣子:DllMain freeze當註冊一個COM DLL時

BOOL APIENTRY DllMain(HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) 
{ 
    switch(ul_reason_for_call) 
    { 
     case DLL_PROCESS_ATTACH: 
      g_hinstDLL = hModule; 
      LOG(INFO) <<"--------------Begin Logging--------------"; 
      return DllEntryPoint((HINSTANCE)hModule, ul_reason_for_call, lpReserved); 
     case DLL_THREAD_ATTACH: 
      break; 
     case DLL_THREAD_DETACH: 
      break; 
     case DLL_PROCESS_DETACH: 
      LOG(INFO) << "--------------End Logging--------------"; 
      break; 
    } 
    return true; 
} 

我登錄使用的Dependency Walker在整個執行過程中,日誌的重要組成部分是:

LoadLibraryExW("MixCenter.dll", 0x00000000, LOAD_WITH_ALTERED_SEARCH_PATH) called from "REGSVR32.EXE" at address 0x003920FF by thread 1. 
Loaded "MIXCENTER.DLL" at address 0x10000000 by thread 1. Successfully hooked module. 
Loaded "MSVCR80.DLL" at address 0x6F250000 by thread 1. Successfully hooked module. 
Loaded "D3D9.DLL" at address 0x6C130000 by thread 1. Successfully hooked module. 
Loaded "D3D8THK.DLL" at address 0x73490000 by thread 1. Successfully hooked module. 
Loaded "D3DX9_40.DLL" at address 0x69B00000 by thread 1. Successfully hooked module. 
Loaded "MSVCP80.DLL" at address 0x71430000 by thread 1. Successfully hooked module. 
DllMain(0x6F250000, DLL_PROCESS_ATTACH, 0x00000000) in "MSVCR80.DLL" called by thread 1. 
GetProcAddress(0x75C90000 [KERNEL32.DLL], "FlsAlloc") called from "MSVCR80.DLL" at address 0x6F253001 and returned 0x75CE8731 by thread 1. 
GetProcAddress(0x75C90000 [KERNEL32.DLL], "FlsGetValue") called from "MSVCR80.DLL" at address 0x6F25300E and returned 0x75CE0DC7 by thread 1. 
GetProcAddress(0x75C90000 [KERNEL32.DLL], "FlsSetValue") called from "MSVCR80.DLL" at address 0x6F25301B and returned 0x75CE2904 by thread 1. 
GetProcAddress(0x75C90000 [KERNEL32.DLL], "FlsFree") called from "MSVCR80.DLL" at address 0x6F253028 and returned 0x75CE2AD7 by thread 1. 
GetProcAddress(0x75C90000 [KERNEL32.DLL], "EncodePointer") called from "MSVCR80.DLL" at address 0x6F252BBC and returned 0x77603275 by thread 1. 
GetProcAddress(0x75C90000 [KERNEL32.DLL], "EncodePointer") called from "MSVCR80.DLL" at address 0x6F252BBC and returned 0x77603275 by thread 1. 
GetProcAddress(0x75C90000 [KERNEL32.DLL], "EncodePointer") called from "MSVCR80.DLL" at address 0x6F252BBC and returned 0x77603275 by thread 1. 
GetProcAddress(0x75C90000 [KERNEL32.DLL], "EncodePointer") called from "MSVCR80.DLL" at address 0x6F252BBC and returned 0x77603275 by thread 1. 
GetProcAddress(0x75C90000 [KERNEL32.DLL], "EncodePointer") called from "MSVCR80.DLL" at address 0x6F252BBC and returned 0x77603275 by thread 1. 
GetProcAddress(0x75C90000 [KERNEL32.DLL], "EncodePointer") called from "MSVCR80.DLL" at address 0x6F252BBC and returned 0x77603275 by thread 1. 
GetProcAddress(0x75C90000 [KERNEL32.DLL], "EncodePointer") called from "MSVCR80.DLL" at address 0x6F252BBC and returned 0x77603275 by thread 1. 
GetProcAddress(0x75C90000 [KERNEL32.DLL], "DecodePointer") called from "MSVCR80.DLL" at address 0x6F252C33 and returned 0x775FF050 by thread 1. 
GetProcAddress(0x75C90000 [KERNEL32.DLL], "InitializeCriticalSectionAndSpinCount") called from "MSVCR80.DLL" at address 0x6F259668 and returned 0x75CE0D2B by thread 1. 
GetProcAddress(0x75C90000 [KERNEL32.DLL], "EncodePointer") called from "MSVCR80.DLL" at address 0x6F252BBC and returned 0x77603275 by thread 1. 
GetProcAddress(0x75C90000 [KERNEL32.DLL], "DecodePointer") called from "MSVCR80.DLL" at address 0x6F252C33 and returned 0x775FF050 by thread 1. 
GetProcAddress(0x75C90000 [KERNEL32.DLL], "DecodePointer") called from "MSVCR80.DLL" at address 0x6F252C33 and returned 0x775FF050 by thread 1. 
GetProcAddress(0x75C90000 [KERNEL32.DLL], "DecodePointer") called from "MSVCR80.DLL" at address 0x6F252C33 and returned 0x775FF050 by thread 1. 
GetProcAddress(0x75C90000 [KERNEL32.DLL], "DecodePointer") called from "MSVCR80.DLL" at address 0x6F252C33 and returned 0x775FF050 by thread 1. 
GetProcAddress(0x75C90000 [KERNEL32.DLL], "DecodePointer") called from "MSVCR80.DLL" at address 0x6F252C33 and returned 0x775FF050 by thread 1. 
GetProcAddress(0x75C90000 [KERNEL32.DLL], "DecodePointer") called from "MSVCR80.DLL" at address 0x6F252C33 and returned 0x775FF050 by thread 1.  
GetProcAddress(0x75C90000 [KERNEL32.DLL], "DecodePointer") called from "MSVCR80.DLL" at address 0x6F252C33 and returned 0x775FF050 by thread 1. 
GetProcAddress(0x75C90000 [KERNEL32.DLL], "DecodePointer") called from "MSVCR80.DLL" at address 0x6F252C33 and returned 0x775FF050 by thread 1. 
GetProcAddress(0x75C90000 [KERNEL32.DLL], "DecodePointer") called from "MSVCR80.DLL" at address 0x6F252C33 and returned 0x775FF050 by thread 1. 
GetProcAddress(0x75C90000 [KERNEL32.DLL], "DecodePointer") called from "MSVCR80.DLL" at address 0x6F252C33 and returned 0x775FF050 by thread 1. 
GetProcAddress(0x75C90000 [KERNEL32.DLL], "DecodePointer") called from "MSVCR80.DLL" at address 0x6F252C33 and returned 0x775FF050 by thread 1. 
GetProcAddress(0x75C90000 [KERNEL32.DLL], "DecodePointer") called from "MSVCR80.DLL" at address 0x6F252C33 and returned 0x775FF050 by thread 1. 
GetProcAddress(0x75C90000 [KERNEL32.DLL], "DecodePointer") called from "MSVCR80.DLL" at address 0x6F252C33 and returned 0x775FF050 by thread 1. 
GetProcAddress(0x75C90000 [KERNEL32.DLL], "DecodePointer") called from "MSVCR80.DLL" at address 0x6F252C33 and returned 0x775FF050 by thread 1. 
GetProcAddress(0x75C90000 [KERNEL32.DLL], "DecodePointer") called from "MSVCR80.DLL" at address 0x6F252C33 and returned 0x775FF050 by thread 1. 
GetProcAddress(0x75C90000 [KERNEL32.DLL], "EncodePointer") called from "MSVCR80.DLL" at address 0x6F252D3A and returned 0x77603275 by thread 1. 
GetProcAddress(0x75C90000 [KERNEL32.DLL], "DecodePointer") called from "MSVCR80.DLL" at address 0x6F252D4A and returned 0x775FF050 by thread 1. 
GetProcAddress(0x75C90000 [KERNEL32.DLL], "IsProcessorFeaturePresent") called from "MSVCR80.DLL" at address 0x6F26A967 and returned 0x75CE0DD4 by thread 1. 
GetProcAddress(0x75BC0000 [MSVCRT.DLL], "_set_error_mode") called from "MSVCR80.DLL" at address 0x6F254447 and returned 0x75BD4A3D by thread 1. 
GetProcAddress(0x75BC0000 [MSVCRT.DLL], "[email protected]@[email protected]") called from "MSVCR80.DLL" at address 0x6F254463 and returned 0x75BEEBB7 by thread 1. 
GetProcAddress(0x75BC0000 [MSVCRT.DLL], "_get_terminate") called from "MSVCR80.DLL" at address 0x6F25447F and returned NULL by thread 1. Error: (127). 
GetProcAddress(0x75C90000 [KERNEL32.DLL], "FindActCtxSectionStringW") called from "MSVCR80.DLL" at address 0x6F251DBE and returned 0x75CE18F9 by thread 1. 
GetProcAddress(0x75C90000 [KERNEL32.DLL], "GetSystemWindowsDirectoryW") called from "MSVCR80.DLL" at address 0x6F251F1A and returned 0x75CE0E64 by thread 1. 
DllMain(0x6F250000, DLL_PROCESS_ATTACH, 0x00000000) in "MSVCR80.DLL" returned 1 (0x1) by thread 1. 
DllMain(0x73490000, DLL_PROCESS_ATTACH, 0x00000000) in "D3D8THK.DLL" called by thread 1. 
DllMain(0x73490000, DLL_PROCESS_ATTACH, 0x00000000) in "D3D8THK.DLL" returned 1 (0x1) by thread 1. 
DllMain(0x6C130000, DLL_PROCESS_ATTACH, 0x00000000) in "D3D9.DLL" called by thread 1. 
DllMain(0x6C130000, DLL_PROCESS_ATTACH, 0x00000000) in "D3D9.DLL" returned 1 (0x1) by thread 1. 
DllMain(0x69B00000, DLL_PROCESS_ATTACH, 0x00000000) in "D3DX9_40.DLL" called by thread 1. 
DllMain(0x69B00000, DLL_PROCESS_ATTACH, 0x00000000) in "D3DX9_40.DLL" returned 1 (0x1) by thread 1. 
DllMain(0x71430000, DLL_PROCESS_ATTACH, 0x00000000) in "MSVCP80.DLL" called by thread 1. 
DllMain(0x71430000, DLL_PROCESS_ATTACH, 0x00000000) in "MSVCP80.DLL" returned 1 (0x1) by thread 1. 
DllMain(0x10000000, DLL_PROCESS_ATTACH, 0x00000000) in "MIXCENTER.DLL" called by thread 1. 

回答

5

有很多的事情可以不做在DllMain。你不僅可以自己不打電話LoadLibrary,但你不能做任何會導致LoadLibrary被調用的事情,並且註冊一個COM服務器聽起來像在某個時候很容易做到LoadLibrary

但這不是你在DllMain中無法做到的程度。該列表很長且很複雜,因此最好的做法是使用兩階段初始化方案,其中DllMain只需設置一個標誌,然後DLL中的其他代碼將執行復雜的初始化。這個「其他代碼」可能是DLL的另一個線程,或者它可能僅僅是DLL的主要例程在調用時調用的一個Init()函數。

+0

在您的指導下,我找到了DllMain禁止列表的部分內容:1.無法調用User32。 2.不能使用帶有動態鏈接庫的CRT內存管理。猜猜這可以解釋這種奇怪的情況。 – Nickolas 2011-04-12 06:07:29