2 * msvcrt.dll initialisation functions
4 * Copyright 2000 Jon Griffiths
8 #include "msvcrt/locale.h"
9 #include "msvcrt/stdio.h"
11 #include "wine/debug.h"
13 WINE_DEFAULT_DEBUG_CHANNEL(msvcrt);
16 DWORD MSVCRT_tls_index;
18 static inline BOOL msvcrt_init_tls(void);
19 static inline BOOL msvcrt_free_tls(void);
20 const char* msvcrt_get_reason(DWORD reason) WINE_UNUSED;
22 void msvcrt_init_io(void);
23 void msvcrt_init_console(void);
24 void msvcrt_free_console(void);
25 void msvcrt_init_args(void);
26 void msvcrt_free_args(void);
27 void msvcrt_init_vtables(void);
29 typedef void* (*MSVCRT_malloc_func)(unsigned int);
30 typedef void (*MSVCRT_free_func)(void*);
32 /*********************************************************************
35 BOOL WINAPI MSVCRT_Init(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
37 MSVCRT_thread_data *tls;
39 TRACE("(0x%08x, %s, %p) pid(%ld), tid(%ld), tls(%ld)\n",
40 hinstDLL, msvcrt_get_reason(fdwReason), lpvReserved,
41 (long)GetCurrentProcessId(), (long)GetCurrentThreadId(),
42 (long)MSVCRT_tls_index);
46 case DLL_PROCESS_ATTACH:
47 if (!msvcrt_init_tls())
49 msvcrt_init_mt_locks();
50 msvcrt_init_vtables();
52 msvcrt_init_console();
54 MSVCRT_setlocale(0, "C");
55 TRACE("finished process init\n");
56 /* FALL THROUGH for Initial TLS allocation!! */
57 case DLL_THREAD_ATTACH:
58 TRACE("starting thread init\n");
60 tls = (MSVCRT_thread_data*) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,
61 sizeof(MSVCRT_thread_data));
62 if (!tls || !TlsSetValue(MSVCRT_tls_index, tls))
64 ERR("TLS init failed! error = %ld\n", GetLastError());
67 TRACE("finished thread init\n");
69 case DLL_PROCESS_DETACH:
70 msvcrt_free_mt_locks();
72 msvcrt_free_console();
74 if (!msvcrt_free_tls())
76 TRACE("finished process free\n");
78 case DLL_THREAD_DETACH:
80 tls = TlsGetValue(MSVCRT_tls_index);
84 ERR("TLS free failed! error = %ld\n", GetLastError());
87 HeapFree(GetProcessHeap(), 0, tls);
88 TRACE("finished thread free\n");
94 static inline BOOL msvcrt_init_tls(void)
96 MSVCRT_tls_index = TlsAlloc();
98 if (MSVCRT_tls_index == TLS_OUT_OF_INDEXES)
100 ERR("TlsAlloc() failed!\n");
106 static inline BOOL msvcrt_free_tls(void)
108 if (!TlsFree(MSVCRT_tls_index))
110 ERR("TlsFree() failed!\n");
116 const char* msvcrt_get_reason(DWORD reason)
120 case DLL_PROCESS_ATTACH: return "DLL_PROCESS_ATTACH";
121 case DLL_PROCESS_DETACH: return "DLL_PROCESS_DETACH";
122 case DLL_THREAD_ATTACH: return "DLL_THREAD_ATTACH";
123 case DLL_THREAD_DETACH: return "DLL_THREAD_DETACH";
129 /*********************************************************************
130 * $I10_OUTPUT (MSVCRT.@)
131 * Function not really understood but needed to make the DLL work
133 void MSVCRT_I10_OUTPUT(void)
135 /* FIXME: This is probably data, not a function */
139 /*********************************************************************
140 * __unDName (MSVCRT.@)
141 * Function not really understood but needed to make the DLL work
143 char* MSVCRT___unDName(int unknown, const char* mangled,
144 MSVCRT_malloc_func memget,
145 MSVCRT_free_func memfree,
150 FIXME("(%d,%s,%p,%p,%x) stub!\n", unknown, mangled, memget, memfree, flags);
152 /* Experimentation reveals the following flag meanings when set:
153 * 0x0001 - Dont show __ in calling convention
154 * 0x0002 - Dont show calling convention at all
155 * 0x0004 - Dont show function/method return value
156 * 0x0010 - Same as 0x1
157 * 0x0080 - Dont show access specifier (public/protected/private)
158 * 0x0200 - Dont show static specifier
159 * 0x1000 - Only report the variable/class name
161 /* Duplicate the mangled name; for comparisons it doesn't matter anyway */
162 ret = memget(strlen(mangled) + 1);
163 strcpy(ret, mangled);
168 /*********************************************************************
169 * __unDNameEx (MSVCRT.@)
170 * Function not really understood but needed to make the DLL work
172 char* MSVCRT___unDNameEx(void)