ReactOS 0.4.16-dev-297-gc569aee
crtdll.c
Go to the documentation of this file.
1
7#ifdef CRTDLL
8#undef CRTDLL
9#ifndef _DLL
10#define _DLL
11#endif
12
13#include <oscalls.h>
14#include <internal.h>
15#include <stdlib.h>
16//#include <windows.h>
17#define _DECL_DLLMAIN
18#include <process.h>
19#include <crtdbg.h>
20
21#ifndef _CRTIMP
22#ifdef CRTDLL
23#define _CRTIMP __declspec(dllexport)
24#else
25#ifdef _DLL
26#define _CRTIMP __declspec(dllimport)
27#else
28#define _CRTIMP
29#endif
30#endif
31#endif
32#include <sect_attribs.h>
33#include <locale.h>
34
35extern void __cdecl _initterm(_PVFV *,_PVFV *);
36extern void __main ();
37extern void _pei386_runtime_relocator (void);
38extern _CRTALLOC(".CRT$XIA") _PIFV __xi_a[];
39extern _CRTALLOC(".CRT$XIZ") _PIFV __xi_z[];
40extern _CRTALLOC(".CRT$XCA") _PVFV __xc_a[];
41extern _CRTALLOC(".CRT$XCZ") _PVFV __xc_z[];
42
43/* TLS initialization hook. */
45
46static int __proc_attached = 0;
47
48extern _PVFV *__onexitbegin;
49extern _PVFV *__onexitend;
50
51extern int mingw_app_type;
52
53extern WINBOOL WINAPI DllMain (HANDLE hDllHandle, DWORD dwReason, LPVOID lpreserved);
54
56
57static int __cdecl pre_c_init (void);
58
59_CRTALLOC(".CRT$XIAA") _PIFV pcinit = pre_c_init;
60
61static int
63pre_c_init (void)
64{
66
67 return 0;
68}
69
70WINBOOL WINAPI _CRT_INIT (HANDLE hDllHandle, DWORD dwReason, LPVOID lpreserved)
71{
73 {
74 if (__proc_attached > 0)
75 __proc_attached--;
76 else
77 return FALSE;
78 }
80 {
81 void *lock_free = NULL;
82 void *fiberid = ((PNT_TIB)NtCurrentTeb ())->StackBase;
83 int nested = FALSE;
84
85 while ((lock_free = InterlockedCompareExchangePointer ((volatile PVOID *) &__native_startup_lock,
86 fiberid, 0)) != 0)
87 {
88 if (lock_free == fiberid)
89 {
90 nested = TRUE;
91 break;
92 }
93 Sleep(1000);
94 }
96 {
97 _amsg_exit (31);
98 }
100 {
102
103 _initterm ((_PVFV *) (void *) __xi_a, (_PVFV *) (void *) __xi_z);
104 }
106 {
107 _initterm (__xc_a, __xc_z);
109 }
110 if (! nested)
111 {
113 }
115 {
116 __dyn_tls_init_callback (hDllHandle, DLL_THREAD_ATTACH, lpreserved);
117 }
118 __proc_attached++;
119 }
120 else if (dwReason == DLL_PROCESS_DETACH)
121 {
122 void *lock_free = NULL;
123 while ((lock_free = InterlockedCompareExchangePointer ((volatile PVOID *) &__native_startup_lock,(PVOID) 1, 0)) != 0)
124 {
125 Sleep(1000);
126 }
128 {
129 _amsg_exit (31);
130 }
131 else
132 {
133 if (__onexitbegin)
134 {
135 _PVFV *onexitbegin = (_PVFV *) _decode_pointer (__onexitbegin);
136 _PVFV *onexitend = (_PVFV *) _decode_pointer (__onexitend);
137 while (--onexitend >= onexitbegin)
138 if (*onexitend != NULL)
139 (**onexitend) ();
140 if (!lpreserved)
141 free(onexitbegin);
143 }
146 }
147 }
148 return TRUE;
149}
150
151static WINBOOL __DllMainCRTStartup (HANDLE, DWORD, LPVOID);
152
153WINBOOL WINAPI DllMainCRTStartup (HANDLE, DWORD, LPVOID);
154int __mingw_init_ehandler (void);
155
157DllMainCRTStartup (HANDLE hDllHandle, DWORD dwReason, LPVOID lpreserved)
158{
159 mingw_app_type = 0;
161 {
163#ifdef _WIN64
165#endif
166 }
167 return __DllMainCRTStartup (hDllHandle, dwReason, lpreserved);
168}
169
171__DllMainCRTStartup (HANDLE hDllHandle, DWORD dwReason, LPVOID lpreserved)
172{
173 WINBOOL retcode = TRUE;
174
176 if (dwReason == DLL_PROCESS_DETACH && __proc_attached == 0)
177 {
178 retcode = FALSE;
179 goto i__leave;
180 }
183 {
184 retcode = _CRT_INIT (hDllHandle, dwReason, lpreserved);
185 if (!retcode)
186 goto i__leave;
187 retcode = DllEntryPoint (hDllHandle, dwReason, lpreserved);
188 if (! retcode)
189 {
191 _CRT_INIT (hDllHandle, DLL_PROCESS_DETACH, lpreserved);
192 goto i__leave;
193 }
194 }
196 __main ();
197 retcode = DllMain(hDllHandle,dwReason,lpreserved);
198 if (dwReason == DLL_PROCESS_ATTACH && ! retcode)
199 {
200 DllMain (hDllHandle, DLL_PROCESS_DETACH, lpreserved);
201 DllEntryPoint (hDllHandle, DLL_PROCESS_DETACH, lpreserved);
202 _CRT_INIT (hDllHandle, DLL_PROCESS_DETACH, lpreserved);
203 }
205 {
206 retcode = DllEntryPoint (hDllHandle, dwReason, lpreserved);
207 if (_CRT_INIT (hDllHandle, dwReason, lpreserved) == FALSE)
208 retcode = FALSE;
209 }
210i__leave:
212 return retcode ;
213}
214#endif
#define __cdecl
Definition: accygwin.h:79
_PVFV * __onexitend
Definition: atonexit.c:24
_PVFV * __onexitbegin
Definition: atonexit.c:23
DWORD dwReason
Definition: misc.cpp:141
int __mingw_init_ehandler(void)
Definition: mscmain.c:27
#define free
Definition: debug_ros.c:5
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
#define DLL_THREAD_DETACH
Definition: compat.h:133
#define DLL_PROCESS_ATTACH
Definition: compat.h:131
#define DLL_PROCESS_DETACH
Definition: compat.h:130
struct _NT_TIB * PNT_TIB
#define DLL_THREAD_ATTACH
Definition: compat.h:132
BOOL WINAPI DllEntryPoint(HANDLE, DWORD, LPVOID)
#define noinline
Definition: types.h:64
#define InterlockedExchangePointer(Target, Value)
Definition: dshow.h:45
unsigned long DWORD
Definition: ntddk_ex.h:95
__declspec(noinline)
Definition: floatconv.c:47
#define _CRTALLOC(x)
void __main(void)
Definition: gccmain.c:51
void CDECL _initterm(_INITTERMFUN *start, _INITTERMFUN *end)
Definition: initterm.c:10
#define InterlockedCompareExchangePointer
Definition: interlocked.h:129
#define UINT_MAX
Definition: intsafe.h:152
#define NtCurrentTeb
BOOL WINAPI DllMain(IN HINSTANCE hinstDLL, IN DWORD dwReason, IN LPVOID lpvReserved)
Definition: kbsdll.c:95
const PIMAGE_TLS_CALLBACK __dyn_tls_init_callback
Definition: tlssup.c:107
int mingw_app_type
Definition: mingw_helpers.c:31
UINT WINAPI nested(MSIHANDLE hinst)
Definition: custom.c:565
void __cdecl _amsg_exit(int errnum)
Definition: amsg.c:44
void _pei386_runtime_relocator(void)
Definition: mscmain.c:23
VOID(NTAPI * PIMAGE_TLS_CALLBACK)(PVOID DllHandle, ULONG Reason, PVOID Reserved)
Definition: ntimage.h:531
void __cdecl __security_init_cookie(void)
Definition: gs_support.c:55
volatile unsigned int __native_dllmain_reason
Definition: natstart.c:11
volatile void * __native_startup_lock
Definition: natstart.c:14
volatile __enative_startup_state __native_startup_state
Definition: natstart.c:13
@ __uninitialized
Definition: internal.h:149
@ __initialized
Definition: internal.h:149
@ __initializing
Definition: internal.h:149
int(__cdecl * _PIFV)(void)
Definition: internal.h:34
void *__cdecl _decode_pointer(void *)
Definition: mingw_helpers.c:19
void(__cdecl * _PVFV)(void)
Definition: internal.h:33
VOID WINAPI DECLSPEC_HOTPATCH Sleep(IN DWORD dwMilliseconds)
Definition: synch.c:790
int32_t WINBOOL
Definition: typedefs.h:58
#define WINAPI
Definition: msvc.h:6
#define const
Definition: zconf.h:233