xref: /reactos/dll/win32/msvcrt20/msvcrt20.c (revision 85fc290b)
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 
57 extern BOOL msvcrt_init_heap(void);
58 extern void CDECL __getmainargs(int *argc, char** *argv, char** *envp,
59                                 int expand_wildcards, int *new_mode);
60 extern void CDECL __wgetmainargs(int *argc, WCHAR** *wargv, WCHAR** *wenvp,
61                                  int expand_wildcards, int *new_mode);
62 
63 /* LIBRARY ENTRY POINT ********************************************************/
64 
65 BOOL
66 WINAPI
67 DllMain(PVOID hinstDll, ULONG dwReason, PVOID reserved)
68 {
69     OSVERSIONINFOW osvi;
70     switch (dwReason)
71     {
72     case DLL_PROCESS_ATTACH:
73         /* initialize version info */
74         TRACE("Process Attach\n");
75         osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOW);
76         GetVersionExW( &osvi );
77         _winver     = (osvi.dwMajorVersion << 8) | osvi.dwMinorVersion;
78         _winmajor   = osvi.dwMajorVersion;
79         _winminor   = osvi.dwMinorVersion;
80         _osplatform = osvi.dwPlatformId;
81         _osver      = osvi.dwBuildNumber;
82 
83         /* create tls stuff */
84         if (!msvcrt_init_tls())
85           return FALSE;
86 
87         if (!msvcrt_init_heap())
88             return FALSE;
89 
90         if (BlockEnvToEnvironA() < 0)
91             return FALSE;
92 
93         if (BlockEnvToEnvironW() < 0)
94         {
95             FreeEnvironment(_environ);
96             return FALSE;
97         }
98 
99         _acmdln = _strdup(GetCommandLineA());
100         _wcmdln = _wcsdup(GetCommandLineW());
101 
102         /* Initialization of the WINE code */
103         msvcrt_init_mt_locks();
104         //msvcrt_init_math();
105         msvcrt_init_io();
106         //msvcrt_init_console();
107         //msvcrt_init_args();
108         //msvcrt_init_signals();
109         TRACE("Attach done\n");
110         break;
111 
112     case DLL_THREAD_ATTACH:
113         //msvcrt_get_thread_data creates data when first called
114         break;
115 
116     case DLL_THREAD_DETACH:
117         msvcrt_free_tls_mem();
118         break;
119 
120     case DLL_PROCESS_DETACH:
121         TRACE("Detach\n");
122         /* Deinit of the WINE code */
123         msvcrt_free_io();
124         if (reserved) break;
125         msvcrt_free_popen_data();
126         msvcrt_free_mt_locks();
127         //msvcrt_free_console();
128         //msvcrt_free_args();
129         //msvcrt_free_signals();
130         msvcrt_free_tls_mem();
131         if (!msvcrt_free_tls())
132           return FALSE;
133         if(global_locale)
134           MSVCRT__free_locale(global_locale);
135 
136         if (__winitenv && __winitenv != _wenviron)
137             FreeEnvironment((char**)__winitenv);
138         if (_wenviron)
139             FreeEnvironment((char**)_wenviron);
140 
141         if (__initenv && __initenv != _environ)
142             FreeEnvironment(__initenv);
143         if (_environ)
144             FreeEnvironment(_environ);
145 
146         TRACE("Detach done\n");
147         break;
148     }
149 
150     return TRUE;
151 }
152 
153 /* LIBRARY EXPORTS ************************************************************/
154 
155 /*********************************************************************
156  *		__getmainargs (MSVCRT20.@)
157  *
158  * new_mode is not a pointer in msvcrt20.
159  */
160 void CDECL MSVCRT20__getmainargs( int *argc, char** *argv, char** *envp,
161                                   int expand_wildcards, int new_mode )
162 {
163     __getmainargs( argc, argv, envp, expand_wildcards, &new_mode );
164 }
165 
166 /*********************************************************************
167  *		__wgetmainargs (MSVCRT20.@)
168  *
169  * new_mode is not a pointer in msvcrt20.
170  */
171 void CDECL MSVCRT20__wgetmainargs( int *argc, WCHAR** *wargv, WCHAR** *wenvp,
172                                    int expand_wildcards, int new_mode )
173 {
174     __wgetmainargs( argc, wargv, wenvp, expand_wildcards, &new_mode );
175 }
176 
177 /* EOF */
178