/********************************************************************* * Init */ BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) { TRACE("(%p, %s, %p) pid(%x), tid(%x), tls(%u)\n", hinstDLL, msvcrt_get_reason(fdwReason), lpvReserved, GetCurrentProcessId(), GetCurrentThreadId(), msvcrt_tls_index); switch (fdwReason) { case DLL_PROCESS_ATTACH: msvcrt_init_exception(hinstDLL); if (!msvcrt_init_tls()) return FALSE; msvcrt_init_mt_locks(); if(!msvcrt_init_locale()) { msvcrt_free_mt_locks(); msvcrt_free_tls_mem(); return FALSE; } msvcrt_init_math(); msvcrt_init_io(); msvcrt_init_console(); msvcrt_init_args(); msvcrt_init_signals(); #if _MSVCR_VER == 0 /* don't allow unloading msvcrt, we can't setup file handles twice */ LdrAddRefDll( LDR_ADDREF_DLL_PIN, hinstDLL ); #elif _MSVCR_VER >= 80 MSVCRT__set_printf_count_output(0); #endif TRACE("finished process init\n"); break; case DLL_THREAD_ATTACH: break; case DLL_PROCESS_DETACH: msvcrt_free_io(); if (lpvReserved) break; msvcrt_free_popen_data(); msvcrt_free_mt_locks(); msvcrt_free_console(); msvcrt_free_args(); msvcrt_free_signals(); msvcrt_free_tls_mem(); if (!msvcrt_free_tls()) return FALSE; MSVCRT__free_locale(MSVCRT_locale); TRACE("finished process free\n"); break; case DLL_THREAD_DETACH: msvcrt_free_tls_mem(); TRACE("finished thread free\n"); break; } return TRUE; }
/********************************************************************* * Init */ BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) { thread_data_t *tls; TRACE("(%p, %s, %p) pid(%lx), tid(%lx), tls(%ld)\n", hinstDLL, msvcrt_get_reason(fdwReason), lpvReserved, GetCurrentProcessId(), GetCurrentThreadId(), (long)msvcrt_tls_index); switch (fdwReason) { case DLL_PROCESS_ATTACH: if (!msvcrt_init_tls()) return FALSE; msvcrt_init_mt_locks(); msvcrt_init_io(); msvcrt_init_console(); msvcrt_init_args(); msvcrt_init_signals(); MSVCRT_setlocale(0, "C"); TRACE("finished process init\n"); break; case DLL_THREAD_ATTACH: break; case DLL_PROCESS_DETACH: msvcrt_free_mt_locks(); msvcrt_free_io(); msvcrt_free_console(); msvcrt_free_args(); msvcrt_free_signals(); if (!msvcrt_free_tls()) return FALSE; TRACE("finished process free\n"); break; case DLL_THREAD_DETACH: /* Free TLS */ tls = TlsGetValue(msvcrt_tls_index); if (tls) { HeapFree(GetProcessHeap(),0,tls->efcvt_buffer); HeapFree(GetProcessHeap(),0,tls->asctime_buffer); HeapFree(GetProcessHeap(),0,tls->wasctime_buffer); HeapFree(GetProcessHeap(),0,tls->strerror_buffer); } HeapFree(GetProcessHeap(), 0, tls); TRACE("finished thread free\n"); break; } return TRUE; }
/********************************************************************* * Init */ BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) { TRACE("(%p, %s, %p) pid(%x), tid(%x), tls(%u)\n", hinstDLL, msvcrt_get_reason(fdwReason), lpvReserved, GetCurrentProcessId(), GetCurrentThreadId(), msvcrt_tls_index); switch (fdwReason) { case DLL_PROCESS_ATTACH: if (!msvcrt_init_tls()) return FALSE; msvcrt_init_mt_locks(); if(!MSVCRT_setlocale(0, "C")) { msvcrt_free_mt_locks(); msvcrt_free_tls_mem(); return FALSE; } msvcrt_init_math(); msvcrt_init_io(); msvcrt_init_console(); msvcrt_init_args(); msvcrt_init_signals(); _setmbcp(_MB_CP_LOCALE); /* don't allow unloading msvcrt, we can't setup file handles twice */ LdrAddRefDll( 0, hinstDLL ); TRACE("finished process init\n"); break; case DLL_THREAD_ATTACH: break; case DLL_PROCESS_DETACH: msvcrt_free_mt_locks(); msvcrt_free_io(); msvcrt_free_console(); msvcrt_free_args(); msvcrt_free_signals(); msvcrt_free_tls_mem(); if (!msvcrt_free_tls()) return FALSE; MSVCRT__free_locale(MSVCRT_locale); TRACE("finished process free\n"); break; case DLL_THREAD_DETACH: msvcrt_free_tls_mem(); TRACE("finished thread free\n"); break; } return TRUE; }