xref: /reactos/dll/win32/msvcrt20/msvcrt20.c (revision c2c66aff)
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 */
173