2 * msvcrt.dll initialisation functions
4 * Copyright 2000 Jon Griffiths
8 #include "msvcrt/locale.h"
9 #include "msvcrt/stdio.h"
12 #include "wine/debug.h"
14 WINE_DEFAULT_DEBUG_CHANNEL(msvcrt);
17 DWORD MSVCRT_tls_index;
20 CRITICAL_SECTION MSVCRT_heap_cs;
21 CRITICAL_SECTION MSVCRT_file_cs;
22 CRITICAL_SECTION MSVCRT_exit_cs;
23 CRITICAL_SECTION MSVCRT_console_cs;
24 CRITICAL_SECTION MSVCRT_locale_cs;
26 static inline BOOL msvcrt_init_tls(void);
27 static inline BOOL msvcrt_free_tls(void);
28 static inline void msvcrt_init_critical_sections(void);
29 static inline void msvcrt_free_critical_sections(void);
30 const char* msvcrt_get_reason(DWORD reason) WINE_UNUSED;
32 void msvcrt_init_io(void);
33 void msvcrt_init_console(void);
34 void msvcrt_free_console(void);
35 void msvcrt_init_args(void);
36 void msvcrt_free_args(void);
37 void msvcrt_init_vtables(void);
39 typedef void* (*MSVCRT_malloc_func)(unsigned int);
40 typedef void (*MSVCRT_free_func)(void*);
42 /*********************************************************************
45 BOOL WINAPI MSVCRT_Init(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
47 MSVCRT_thread_data *tls;
49 TRACE("(0x%08x, %s, %p) pid(%ld), tid(%ld), tls(%ld)\n",
50 hinstDLL, msvcrt_get_reason(fdwReason), lpvReserved,
51 (long)GetCurrentProcessId(), (long)GetCurrentThreadId(),
52 (long)MSVCRT_tls_index);
56 case DLL_PROCESS_ATTACH:
57 if (!msvcrt_init_tls())
59 msvcrt_init_vtables();
60 msvcrt_init_critical_sections();
62 msvcrt_init_console();
64 MSVCRT_setlocale(0, "C");
65 TRACE("finished process init\n");
66 /* FALL THROUGH for Initial TLS allocation!! */
67 case DLL_THREAD_ATTACH:
68 TRACE("starting thread init\n");
70 tls = (MSVCRT_thread_data*) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,
71 sizeof(MSVCRT_thread_data));
72 if (!tls || !TlsSetValue(MSVCRT_tls_index, tls))
74 ERR("TLS init failed! error = %ld\n", GetLastError());
77 TRACE("finished thread init\n");
79 case DLL_PROCESS_DETACH:
80 msvcrt_free_critical_sections();
82 msvcrt_free_console();
84 if (!msvcrt_free_tls())
86 TRACE("finished process free\n");
88 case DLL_THREAD_DETACH:
90 tls = TlsGetValue(MSVCRT_tls_index);
94 ERR("TLS free failed! error = %ld\n", GetLastError());
97 HeapFree(GetProcessHeap(), 0, tls);
98 TRACE("finished thread free\n");
104 static inline BOOL msvcrt_init_tls(void)
106 MSVCRT_tls_index = TlsAlloc();
108 if (MSVCRT_tls_index == TLS_OUT_OF_INDEXES)
110 ERR("TlsAlloc() failed!\n");
116 static inline BOOL msvcrt_free_tls(void)
118 if (!TlsFree(MSVCRT_tls_index))
120 ERR("TlsFree() failed!\n");
126 static inline void msvcrt_init_critical_sections(void)
128 InitializeCriticalSectionAndSpinCount(&MSVCRT_heap_cs, 4000);
129 InitializeCriticalSection(&MSVCRT_file_cs);
130 InitializeCriticalSection(&MSVCRT_exit_cs);
131 InitializeCriticalSection(&MSVCRT_console_cs);
132 InitializeCriticalSection(&MSVCRT_locale_cs);
135 static inline void msvcrt_free_critical_sections(void)
137 DeleteCriticalSection(&MSVCRT_locale_cs);
138 DeleteCriticalSection(&MSVCRT_console_cs);
139 DeleteCriticalSection(&MSVCRT_exit_cs);
140 DeleteCriticalSection(&MSVCRT_file_cs);
141 DeleteCriticalSection(&MSVCRT_heap_cs);
144 const char* msvcrt_get_reason(DWORD reason)
148 case DLL_PROCESS_ATTACH: return "DLL_PROCESS_ATTACH";
149 case DLL_PROCESS_DETACH: return "DLL_PROCESS_DETACH";
150 case DLL_THREAD_ATTACH: return "DLL_THREAD_ATTACH";
151 case DLL_THREAD_DETACH: return "DLL_THREAD_DETACH";
157 /*********************************************************************
158 * $I10_OUTPUT (MSVCRT.@)
159 * Function not really understood but needed to make the DLL work
161 void MSVCRT_I10_OUTPUT(void)
163 /* FIXME: This is probably data, not a function */
167 /*********************************************************************
168 * __unDName (MSVCRT.@)
169 * Function not really understood but needed to make the DLL work
171 char* MSVCRT___unDName(int unknown, const char* mangled,
172 MSVCRT_malloc_func memget,
173 MSVCRT_free_func memfree,
178 FIXME("(%d,%s,%p,%p,%x) stub!\n", unknown, mangled, memget, memfree, flags);
180 /* Experimentation reveals the following flag meanings when set:
181 * 0x0001 - Dont show __ in calling convention
182 * 0x0002 - Dont show calling convention at all
183 * 0x0004 - Dont show function/method return value
184 * 0x0010 - Same as 0x1
185 * 0x0080 - Dont show access specifier (public/protected/private)
186 * 0x0200 - Dont show static specifier
187 * 0x1000 - Only report the variable/class name
189 /* Duplicate the mangled name; for comparisons it doesn't matter anyway */
190 ret = memget(strlen(mangled) + 1);
191 strcpy(ret, mangled);
196 /*********************************************************************
197 * __unDNameEx (MSVCRT.@)
198 * Function not really understood but needed to make the DLL work
200 char* MSVCRT___unDNameEx(void)