void LOADCallDllMain(DWORD dwReason, LPVOID lpReserved) { MODSTRUCT *module = nullptr; BOOL InLoadOrder = TRUE; /* true if in load order, false for reverse */ CPalThread *pThread; pThread = InternalGetCurrentThread(); if (UserCreatedThread != pThread->GetThreadType()) { return; } /* Validate dwReason */ switch(dwReason) { case DLL_PROCESS_ATTACH: ASSERT("got called with DLL_PROCESS_ATTACH parameter! Why?\n"); break; case DLL_PROCESS_DETACH: ASSERT("got called with DLL_PROCESS_DETACH parameter! Why?\n"); InLoadOrder = FALSE; break; case DLL_THREAD_ATTACH: TRACE("Calling DllMain(DLL_THREAD_ATTACH) on all known modules.\n"); break; case DLL_THREAD_DETACH: TRACE("Calling DllMain(DLL_THREAD_DETACH) on all known modules.\n"); InLoadOrder = FALSE; break; default: ASSERT("LOADCallDllMain called with unknown parameter %d!\n", dwReason); return; } LockModuleList(); module = &exe_module; do { if (!InLoadOrder) module = module->prev; if (module->threadLibCalls) { if (module->pDllMain) { LOADCallDllMainSafe(module, dwReason, lpReserved); } } if (InLoadOrder) module = module->next; } while (module != &exe_module); UnlockModuleList(); }
void LOADCallDllMain(DWORD dwReason, LPVOID lpReserved) { MODSTRUCT *module = NULL; BOOL InLoadOrder = TRUE; /* true if in load order, false for reverse */ CPalThread *pThread; pThread = InternalGetCurrentThread(); if (UserCreatedThread != pThread->GetThreadType()) { return; } /* Validate dwReason */ switch(dwReason) { case DLL_PROCESS_ATTACH: ASSERT("got called with DLL_PROCESS_ATTACH parameter! Why?\n"); break; case DLL_PROCESS_DETACH: ASSERT("got called with DLL_PROCESS_DETACH parameter! Why?\n"); InLoadOrder = FALSE; break; case DLL_THREAD_ATTACH: TRACE("Calling DllMain(DLL_THREAD_ATTACH) on all known modules.\n"); break; case DLL_THREAD_DETACH: TRACE("Calling DllMain(DLL_THREAD_DETACH) on all known modules.\n"); InLoadOrder = FALSE; break; default: ASSERT("LOADCallDllMain called with unknown parameter %d!\n", dwReason); return; } LockModuleList(); module = &exe_module; do { if (!InLoadOrder) module = module->prev; if (module->threadLibCalls) { if (module->pDllMain) { #if !_NO_DEBUG_MESSAGES_ /* reset ENTRY nesting level back to zero while inside the callback... */ int old_level; old_level = DBG_change_entrylevel(0); #endif /* !_NO_DEBUG_MESSAGES_ */ { // This module may be foreign to our PAL, so leave our PAL. // If it depends on us, it will re-enter. PAL_LeaveHolder holder; module->pDllMain(module->hinstance, dwReason, lpReserved); } #if !_NO_DEBUG_MESSAGES_ /* ...and set nesting level back to what it was */ DBG_change_entrylevel(old_level); #endif /* !_NO_DEBUG_MESSAGES_ */ } } if (InLoadOrder) module = module->next; } while (module != &exe_module); UnlockModuleList(); }