Correctly bugcheck if we aren't returning a usermode thread (#506)
[reactos.git] / dll / win32 / msvcrt20 / msvcrt20.c
1 /*
2 * msvcrt20 implementation
3 *
4 * Copyright 2002 Alexandre Julliard
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
21 #define WIN32_NO_STATUS
22
23 #include <stdio.h>
24 #define _CRT_PRECOMP_H
25 #include <internal/tls.h>
26 //#include <stdlib.h>
27 //#include <windows.h>
28 #include <internal/wine/msvcrt.h>
29 #include <internal/locale.h>
30 //#include <locale.h>
31 //#include <mbctype.h>
32
33 #include <wine/debug.h>
34 WINE_DEFAULT_DEBUG_CHANNEL(msvcrt);
35
36 /* EXTERNAL PROTOTYPES ********************************************************/
37
38 extern int BlockEnvToEnvironA(void);
39 extern int BlockEnvToEnvironW(void);
40 extern void FreeEnvironment(char **environment);
41
42 extern unsigned int _osplatform;
43 extern unsigned int _osver;
44 extern unsigned int _winminor;
45 extern unsigned int _winmajor;
46 extern unsigned int _winver;
47
48 extern char* _acmdln; /* pointer to ascii command line */
49 extern wchar_t* _wcmdln; /* pointer to wide character command line */
50 #undef _environ
51 extern char** _environ; /* pointer to environment block */
52 extern char** __initenv; /* pointer to initial environment block */
53 extern wchar_t** _wenviron; /* pointer to environment block */
54 extern wchar_t** __winitenv; /* pointer to initial environment block */
55
56 extern void CDECL __getmainargs(int *argc, char** *argv, char** *envp,
57 int expand_wildcards, int *new_mode);
58 extern void CDECL __wgetmainargs(int *argc, WCHAR** *wargv, WCHAR** *wenvp,
59 int expand_wildcards, int *new_mode);
60
61 /* LIBRARY ENTRY POINT ********************************************************/
62
63 BOOL
64 WINAPI
65 DllMain(PVOID hinstDll, ULONG dwReason, PVOID reserved)
66 {
67 OSVERSIONINFOW osvi;
68 switch (dwReason)
69 {
70 case DLL_PROCESS_ATTACH:
71 /* initialize version info */
72 TRACE("Process Attach\n");
73 osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOW);
74 GetVersionExW( &osvi );
75 _winver = (osvi.dwMajorVersion << 8) | osvi.dwMinorVersion;
76 _winmajor = osvi.dwMajorVersion;
77 _winminor = osvi.dwMinorVersion;
78 _osplatform = osvi.dwPlatformId;
79 _osver = osvi.dwBuildNumber;
80
81 /* create tls stuff */
82 if (!msvcrt_init_tls())
83 return FALSE;
84
85 if (BlockEnvToEnvironA() < 0)
86 return FALSE;
87
88 if (BlockEnvToEnvironW() < 0)
89 {
90 FreeEnvironment(_environ);
91 return FALSE;
92 }
93
94 _acmdln = _strdup(GetCommandLineA());
95 _wcmdln = _wcsdup(GetCommandLineW());
96
97 /* Initialization of the WINE code */
98 msvcrt_init_mt_locks();
99 //msvcrt_init_math();
100 msvcrt_init_io();
101 //msvcrt_init_console();
102 //msvcrt_init_args();
103 //msvcrt_init_signals();
104 TRACE("Attach done\n");
105 break;
106
107 case DLL_THREAD_ATTACH:
108 //msvcrt_get_thread_data creates data when first called
109 break;
110
111 case DLL_THREAD_DETACH:
112 msvcrt_free_tls_mem();
113 break;
114
115 case DLL_PROCESS_DETACH:
116 TRACE("Detach\n");
117 /* Deinit of the WINE code */
118 msvcrt_free_io();
119 if (reserved) break;
120 msvcrt_free_popen_data();
121 msvcrt_free_mt_locks();
122 //msvcrt_free_console();
123 //msvcrt_free_args();
124 //msvcrt_free_signals();
125 msvcrt_free_tls_mem();
126 if (!msvcrt_free_tls())
127 return FALSE;
128 if(global_locale)
129 MSVCRT__free_locale(global_locale);
130
131 if (__winitenv && __winitenv != _wenviron)
132 FreeEnvironment((char**)__winitenv);
133 if (_wenviron)
134 FreeEnvironment((char**)_wenviron);
135
136 if (__initenv && __initenv != _environ)
137 FreeEnvironment(__initenv);
138 if (_environ)
139 FreeEnvironment(_environ);
140
141 TRACE("Detach done\n");
142 break;
143 }
144
145 return TRUE;
146 }
147
148 /* LIBRARY EXPORTS ************************************************************/
149
150 /*********************************************************************
151 * __getmainargs (MSVCRT20.@)
152 *
153 * new_mode is not a pointer in msvcrt20.
154 */
155 void CDECL MSVCRT20__getmainargs( int *argc, char** *argv, char** *envp,
156 int expand_wildcards, int new_mode )
157 {
158 __getmainargs( argc, argv, envp, expand_wildcards, &new_mode );
159 }
160
161 /*********************************************************************
162 * __wgetmainargs (MSVCRT20.@)
163 *
164 * new_mode is not a pointer in msvcrt20.
165 */
166 void CDECL MSVCRT20__wgetmainargs( int *argc, WCHAR** *wargv, WCHAR** *wenvp,
167 int expand_wildcards, int new_mode )
168 {
169 __wgetmainargs( argc, wargv, wenvp, expand_wildcards, &new_mode );
170 }
171
172 /* EOF */