2011-04-11 127 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