[CRT/MINGW-W64]
[reactos.git] / reactos / lib / 3rdparty / mingw / crtdll.c
index c5bd195..001cbd7 100644 (file)
@@ -1,6 +1,14 @@
+/**
+ * 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.PD within this package.
+ */
+
 #ifdef CRTDLL
 #undef CRTDLL
+#ifndef _DLL
 #define _DLL
+#endif
 
 #include <oscalls.h>
 #include <internal.h>
@@ -32,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;
@@ -41,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);
 
@@ -63,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)
     {
@@ -102,10 +111,9 @@ BOOL WINAPI _CRT_INIT (HANDLE hDllHandle, DWORD dwReason, LPVOID lpreserved)
        }
       if (! nested)
        {
-         InterlockedExchangePointer ((volatile PVOID *) &__native_startup_lock, 0);
+         (void) InterlockedExchangePointer ((volatile PVOID *) &__native_startup_lock, 0);
        }
-      if (__dyn_tls_init_callback != NULL &&
-         _IsNonwritableInCurrentImage ((PBYTE) &__dyn_tls_init_callback))
+      if (__dyn_tls_init_callback != NULL)
        {
          __dyn_tls_init_callback (hDllHandle, DLL_THREAD_ATTACH, lpreserved);
        }
@@ -135,29 +143,35 @@ BOOL WINAPI _CRT_INIT (HANDLE hDllHandle, DWORD dwReason, LPVOID lpreserved)
              __onexitbegin = __onexitend = (_PVFV *) NULL;
            }
          __native_startup_state = __uninitialized;
-         InterlockedExchangePointer ((volatile PVOID *) &__native_startup_lock, 0);
+         (void) InterlockedExchangePointer ((volatile PVOID *) &__native_startup_lock, 0);
        }
     }
   return TRUE;
 }
 
-static BOOL __DllMainCRTStartup (HANDLE, DWORD, LPVOID);
+static WINBOOL __DllMainCRTStartup (HANDLE, DWORD, LPVOID);
 
-BOOL WINAPI
-DllMainCRTStartup(HANDLE hDllHandle,DWORD dwReason,LPVOID lpreserved)
+WINBOOL WINAPI DllMainCRTStartup (HANDLE, DWORD, LPVOID);
+int __mingw_init_ehandler (void);
+
+WINBOOL WINAPI
+DllMainCRTStartup (HANDLE hDllHandle, DWORD dwReason, LPVOID lpreserved)
 {
   mingw_app_type = 0;
   if (dwReason == DLL_PROCESS_ATTACH)
     {
       __security_init_cookie ();
+#ifdef _WIN64
+      __mingw_init_ehandler ();
+#endif
     }
   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)
@@ -165,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;