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