[CRT/MINGW-W64]
[reactos.git] / reactos / lib / 3rdparty / mingw / crtdll.c
index 0c67416..001cbd7 100644 (file)
@@ -1,7 +1,7 @@
 /**
  * This file has no copyright assigned and is placed in the Public Domain.
  * This file is part of the w64 mingw-runtime package.
- * No warranty is given; refer to the file DISCLAIMER within this package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
  */
 
 #ifdef CRTDLL
@@ -40,6 +40,7 @@ extern _CRTALLOC(".CRT$XIZ") _PIFV __xi_z[];
 extern _CRTALLOC(".CRT$XCA") _PVFV __xc_a[];
 extern _CRTALLOC(".CRT$XCZ") _PVFV __xc_z[];
 
+/* TLS initialization hook.  */
 extern const PIMAGE_TLS_CALLBACK __dyn_tls_init_callback;
 
 static int __proc_attached = 0;
@@ -49,9 +50,9 @@ extern _PVFV *__onexitend;
 
 extern int mingw_app_type;
 
-extern BOOL WINAPI DllMain (HANDLE hDllHandle, DWORD dwReason, LPVOID lpreserved);
+extern WINBOOL WINAPI DllMain (HANDLE hDllHandle, DWORD dwReason, LPVOID lpreserved);
 
-extern BOOL WINAPI DllEntryPoint (HANDLE, DWORD, LPVOID);
+extern WINBOOL WINAPI DllEntryPoint (HANDLE, DWORD, LPVOID);
 
 static int pre_c_init (void);
 
@@ -71,7 +72,7 @@ pre_c_init (void)
   return 0;
 }
 
-BOOL WINAPI _CRT_INIT (HANDLE hDllHandle, DWORD dwReason, LPVOID lpreserved)
+WINBOOL WINAPI _CRT_INIT (HANDLE hDllHandle, DWORD dwReason, LPVOID lpreserved)
 {
   if (dwReason == DLL_PROCESS_DETACH)
     {
@@ -148,12 +149,12 @@ BOOL WINAPI _CRT_INIT (HANDLE hDllHandle, DWORD dwReason, LPVOID lpreserved)
   return TRUE;
 }
 
-static BOOL __DllMainCRTStartup (HANDLE, DWORD, LPVOID);
+static WINBOOL __DllMainCRTStartup (HANDLE, DWORD, LPVOID);
 
-BOOL WINAPI DllMainCRTStartup (HANDLE, DWORD, LPVOID);
+WINBOOL WINAPI DllMainCRTStartup (HANDLE, DWORD, LPVOID);
 int __mingw_init_ehandler (void);
 
-BOOL WINAPI
+WINBOOL WINAPI
 DllMainCRTStartup (HANDLE hDllHandle, DWORD dwReason, LPVOID lpreserved)
 {
   mingw_app_type = 0;
@@ -167,10 +168,10 @@ DllMainCRTStartup (HANDLE hDllHandle, DWORD dwReason, LPVOID lpreserved)
   return __DllMainCRTStartup (hDllHandle, dwReason, lpreserved);
 }
 
-__declspec(noinline) BOOL
+__declspec(noinline) WINBOOL
 __DllMainCRTStartup (HANDLE hDllHandle, DWORD dwReason, LPVOID lpreserved)
 {
-  BOOL retcode = TRUE;
+  WINBOOL retcode = TRUE;
 
   __native_dllmain_reason = dwReason;
   if (dwReason == DLL_PROCESS_DETACH && __proc_attached == 0)
@@ -178,34 +179,34 @@ __DllMainCRTStartup (HANDLE hDllHandle, DWORD dwReason, LPVOID lpreserved)
        retcode = FALSE;
        goto i__leave;
     }
+  _pei386_runtime_relocator ();
   if (dwReason == DLL_PROCESS_ATTACH || dwReason == DLL_THREAD_ATTACH)
     {
+        retcode = _CRT_INIT (hDllHandle, dwReason, lpreserved);
+        if (!retcode)
+          goto i__leave;
         retcode = DllEntryPoint (hDllHandle, dwReason, lpreserved);
-       if (retcode)
-         retcode = _CRT_INIT (hDllHandle, dwReason, lpreserved);
        if (! retcode)
-         goto i__leave;
+         {
+           if (dwReason == DLL_PROCESS_ATTACH)
+             _CRT_INIT (hDllHandle, DLL_PROCESS_DETACH, lpreserved);
+           goto i__leave;
+         }
     }
-  _pei386_runtime_relocator ();
-  if (retcode && dwReason == DLL_PROCESS_ATTACH)
+  if (dwReason == DLL_PROCESS_ATTACH)
     __main ();
   retcode = DllMain(hDllHandle,dwReason,lpreserved);
-  if ((dwReason == DLL_PROCESS_ATTACH) && ! retcode)
+  if (dwReason == DLL_PROCESS_ATTACH && ! retcode)
     {
        DllMain (hDllHandle, DLL_PROCESS_DETACH, lpreserved);
-       _CRT_INIT (hDllHandle, DLL_PROCESS_DETACH, lpreserved);
        DllEntryPoint (hDllHandle, DLL_PROCESS_DETACH, lpreserved);
+       _CRT_INIT (hDllHandle, DLL_PROCESS_DETACH, lpreserved);
     }
   if (dwReason == DLL_PROCESS_DETACH || dwReason == DLL_THREAD_DETACH)
     {
+        retcode = DllEntryPoint (hDllHandle, dwReason, lpreserved);
        if (_CRT_INIT (hDllHandle, dwReason, lpreserved) == FALSE)
-         {
-           retcode = FALSE;
-         }
-       if (retcode)
-         {
-           retcode = DllEntryPoint (hDllHandle, dwReason, lpreserved);
-         }
+         retcode = FALSE;
     }
 i__leave:
   __native_dllmain_reason = UINT_MAX;