ReactOS 0.4.16-dev-2104-gb84fa49
main.c
Go to the documentation of this file.
1/*
2 * msvcrt.dll initialisation functions
3 *
4 * Copyright 2000 Jon Griffiths
5 *
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
10 *
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
15 *
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
19 */
20#include <locale.h>
21#include "msvcrt.h"
22#include "winternl.h"
23
24#include "wine/debug.h"
25
27
28/* Index to TLS */
30
31static const char* msvcrt_get_reason(DWORD reason)
32{
33 switch (reason)
34 {
35 case DLL_PROCESS_ATTACH: return "DLL_PROCESS_ATTACH";
36 case DLL_PROCESS_DETACH: return "DLL_PROCESS_DETACH";
37 case DLL_THREAD_ATTACH: return "DLL_THREAD_ATTACH";
38 case DLL_THREAD_DETACH: return "DLL_THREAD_DETACH";
39 }
40 return "UNKNOWN";
41}
42
43static inline BOOL msvcrt_init_tls(void)
44{
46
48 {
49 ERR("TlsAlloc() failed!\n");
50 return FALSE;
51 }
52 return TRUE;
53}
54
55static inline BOOL msvcrt_free_tls(void)
56{
58 {
59 ERR("TlsFree() failed!\n");
60 return FALSE;
61 }
62 return TRUE;
63}
64
65static inline void msvcrt_free_tls_mem(void)
66{
68
69 if (tls)
70 {
71 free(tls->efcvt_buffer);
72 free(tls->asctime_buffer);
73 free(tls->wasctime_buffer);
74 free(tls->strerror_buffer);
75 free(tls->wcserror_buffer);
76 free(tls->time_buffer);
77 free(tls->tmpnam_buffer);
78 free(tls->wtmpnam_buffer);
79 if(tls->locale_flags & LOCALE_FREE) {
80 free_locinfo(tls->locinfo);
81 free_mbcinfo(tls->mbcinfo);
82 }
83 }
85}
86
87/*********************************************************************
88 * Init
89 */
91{
92 TRACE("(%p, %s, %p) pid(%lx), tid(%lx), tls(%lu)\n",
96
97 switch (fdwReason)
98 {
100 msvcrt_init_exception(hinstDLL);
101 if(!msvcrt_init_heap())
102 return FALSE;
103 if(!msvcrt_init_tls()) {
105 return FALSE;
106 }
108 if(!msvcrt_init_locale()) {
112 return FALSE;
113 }
114#if defined(__x86_64__) && _MSVCR_VER>=140
115 if(!msvcrt_init_handler4()) {
120 return FALSE;
121 }
122#endif
123 msvcrt_init_math(hinstDLL);
127#if _MSVCR_VER >= 100 && _MSVCR_VER <= 120
128 msvcrt_init_concurrency(hinstDLL);
129#endif
130#if _MSVCR_VER == 0
131 /* don't allow unloading msvcrt, we can't setup file handles twice */
132 LdrAddRefDll( LDR_ADDREF_DLL_PIN, hinstDLL );
133#elif _MSVCR_VER >= 80
135#endif
137 TRACE("finished process init\n");
138 break;
140#if defined(__x86_64__) && _MSVCR_VER>=140
141 msvcrt_attach_handler4();
142#endif
143 break;
146 if (lpvReserved) break;
153 if (!msvcrt_free_tls())
154 return FALSE;
155#if defined(__x86_64__) && _MSVCR_VER>=140
156 msvcrt_free_handler4();
157#endif
159#if _MSVCR_VER >= 100 && _MSVCR_VER <= 120
160 msvcrt_free_scheduler_thread();
161 msvcrt_free_concurrency();
162#endif
164 TRACE("finished process free\n");
165 break;
168#if _MSVCR_VER >= 100 && _MSVCR_VER <= 120
169 msvcrt_free_scheduler_thread();
170#endif
171 TRACE("finished thread free\n");
172 break;
173 }
174 return TRUE;
175}
static DWORD const fdwReason
#define WINE_DEFAULT_DEBUG_CHANNEL(t)
Definition: precomp.h:23
BOOL NTAPI DllMain(_In_ HINSTANCE hDll, _In_ ULONG dwReason, _In_opt_ PVOID pReserved)
Definition: main.c:33
#define ERR(fmt,...)
Definition: precomp.h:57
#define free
Definition: debug_ros.c:5
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
static WCHAR reason[MAX_STRING_RESOURCE_LEN]
Definition: object.c:1904
#define GetProcessHeap()
Definition: compat.h:736
#define DLL_THREAD_DETACH
Definition: compat.h:133
#define DLL_PROCESS_ATTACH
Definition: compat.h:131
#define DLL_PROCESS_DETACH
Definition: compat.h:130
#define HeapFree(x, y, z)
Definition: compat.h:735
#define DLL_THREAD_ATTACH
Definition: compat.h:132
LPVOID WINAPI TlsGetValue(IN DWORD Index)
Definition: thread.c:1240
BOOL WINAPI TlsFree(IN DWORD Index)
Definition: thread.c:1166
DWORD WINAPI DECLSPEC_HOTPATCH TlsAlloc(void)
Definition: thread.c:657
void msvcrt_free_console(void)
Definition: console.c:68
void msvcrt_free_args(void)
Definition: data.c:462
void msvcrt_init_args(void)
Definition: data.c:404
void msvcrt_free_signals(void)
Definition: except.c:640
void msvcrt_init_signals(void)
Definition: except.c:635
void msvcrt_init_io(void)
Definition: file.c:720
void msvcrt_free_io(void)
Definition: file.c:1392
BOOL msvcrt_init_heap(void)
Definition: heap.c:830
void msvcrt_destroy_heap(void)
Definition: heap.c:840
_ACRTIMP void __cdecl _free_locale(_locale_t)
Definition: locale.c:1183
_ACRTIMP int __cdecl _set_printf_count_output(int)
Definition: stubs.c:10
void free_mbcinfo(pthreadmbcinfo mbcinfo)
Definition: locale.c:1138
void free_locinfo(pthreadlocinfo locinfo)
Definition: locale.c:1061
BOOL msvcrt_init_locale(void)
Definition: locale.c:2151
void msvcrt_init_mt_locks(void)
Definition: lock.c:66
void msvcrt_free_locks(void)
Definition: lock.c:149
static void msvcrt_free_tls_mem(void)
Definition: main.c:65
static const char * msvcrt_get_reason(DWORD reason)
Definition: main.c:31
DWORD msvcrt_tls_index
Definition: main.c:29
static BOOL msvcrt_init_tls(void)
Definition: main.c:43
static BOOL msvcrt_free_tls(void)
Definition: main.c:55
void msvcrt_init_exception(void *)
void msvcrt_free_popen_data(void)
Definition: process.c:1034
void msvcrt_init_clock(void)
Definition: time.c:49
#define LOCALE_FREE
Definition: msvcrt.h:172
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
NTSTATUS NTAPI LdrAddRefDll(_In_ ULONG Flags, _In_ PVOID BaseAddress)
Definition: ldrapi.c:1205
#define LDR_ADDREF_DLL_PIN
Definition: ldrtypes.h:75
static IN DWORD IN LPVOID lpvReserved
void msvcrt_init_math(void)
#define MSVCRT_locale
Definition: locale.h:80
static DWORD tls
Definition: sock.c:229
#define TRACE(s)
Definition: solgame.cpp:4
DWORD WINAPI GetCurrentThreadId(void)
Definition: thread.c:459
DWORD WINAPI GetCurrentProcessId(void)
Definition: proc.c:1158
#define TLS_OUT_OF_INDEXES
Definition: winbase.h:529
#define WINAPI
Definition: msvc.h:6