1 /* 2 * dllmain.c 3 * 4 * ReactOS CRTDLL.DLL Compatibility Library 5 * 6 * THIS SOFTWARE IS NOT COPYRIGHTED 7 * 8 * This source code is offered for use in the public domain. You may 9 * use, modify or distribute it freely. 10 * 11 * This code is distributed in the hope that it will be useful but 12 * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY 13 * DISCLAMED. This includes but is not limited to warranties of 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 15 * 16 */ 17 18 #include "precomp.h" 19 #include <mbctype.h> 20 #include <sys/stat.h> 21 #include <internal/wine/msvcrt.h> 22 23 #include <wine/debug.h> 24 WINE_DEFAULT_DEBUG_CHANNEL(crtdll); 25 26 /* from msvcrt */ 27 extern void __getmainargs( int *argc, char ***argv, char ***envp, 28 int expand_wildcards, int *new_mode ); 29 30 /* EXTERNAL PROTOTYPES ********************************************************/ 31 32 BOOL crt_process_init(void); 33 34 extern void FreeEnvironment(char **environment); 35 36 37 unsigned int CRTDLL__basemajor_dll = 0; 38 unsigned int CRTDLL__baseminor_dll = 0; 39 unsigned int CRTDLL__baseversion_dll = 0; 40 unsigned int CRTDLL__cpumode_dll = 0; 41 unsigned int CRTDLL__osmajor_dll = 0; 42 unsigned int CRTDLL__osminor_dll = 0; 43 unsigned int CRTDLL__osmode_dll = 0; 44 unsigned int CRTDLL__osversion_dll = 0; 45 int _fileinfo_dll; 46 47 #undef _environ 48 extern char** _environ; /* pointer to environment block */ 49 extern char** __initenv; /* pointer to initial environment block */ 50 extern wchar_t** _wenviron; /* pointer to environment block */ 51 extern wchar_t** __winitenv; /* pointer to initial environment block */ 52 53 /* dev_t is a short in crtdll but an unsigned int in msvcrt */ 54 typedef short crtdll_dev_t; 55 56 struct crtdll_stat 57 { 58 crtdll_dev_t st_dev; 59 _ino_t st_ino; 60 unsigned short st_mode; 61 short st_nlink; 62 short st_uid; 63 short st_gid; 64 crtdll_dev_t st_rdev; 65 _off_t st_size; 66 time_t st_atime; 67 time_t st_mtime; 68 time_t st_ctime; 69 }; 70 71 /* convert struct _stat from crtdll format to msvcrt format */ 72 static void convert_struct_stat( struct crtdll_stat *dst, const struct _stat *src ) 73 { 74 dst->st_dev = src->st_dev; 75 dst->st_ino = src->st_ino; 76 dst->st_mode = src->st_mode; 77 dst->st_nlink = src->st_nlink; 78 dst->st_uid = src->st_uid; 79 dst->st_gid = src->st_gid; 80 dst->st_rdev = src->st_rdev; 81 dst->st_size = src->st_size; 82 dst->st_atime = src->st_atime; 83 dst->st_mtime = src->st_mtime; 84 dst->st_ctime = src->st_ctime; 85 } 86 87 /* LIBRARY ENTRY POINT ********************************************************/ 88 89 BOOL 90 WINAPI 91 DllMain(PVOID hinstDll, ULONG dwReason, PVOID reserved) 92 { 93 DWORD version; 94 switch (dwReason) 95 { 96 case DLL_PROCESS_ATTACH: 97 version = GetVersion(); 98 99 /* initialize version info */ 100 CRTDLL__basemajor_dll = (version >> 24) & 0xFF; 101 CRTDLL__baseminor_dll = (version >> 16) & 0xFF; 102 CRTDLL__baseversion_dll = (version >> 16); 103 CRTDLL__cpumode_dll = 1; /* FIXME */ 104 CRTDLL__osmajor_dll = (version >>8) & 0xFF; 105 CRTDLL__osminor_dll = (version & 0xFF); 106 CRTDLL__osmode_dll = 1; /* FIXME */ 107 CRTDLL__osversion_dll = (version & 0xFFFF); 108 109 if (!crt_process_init()) 110 { 111 ERR("crt_init() failed!\n"); 112 return FALSE; 113 } 114 115 TRACE("Attach done\n"); 116 break; 117 case DLL_THREAD_ATTACH: 118 break; 119 120 case DLL_THREAD_DETACH: 121 msvcrt_free_tls_mem(); 122 break; 123 124 case DLL_PROCESS_DETACH: 125 TRACE("Detach\n"); 126 /* Deinit of the WINE code */ 127 msvcrt_free_io(); 128 if (reserved) break; 129 msvcrt_free_popen_data(); 130 msvcrt_free_mt_locks(); 131 //msvcrt_free_console(); 132 //msvcrt_free_args(); 133 //msvcrt_free_signals(); 134 msvcrt_free_tls_mem(); 135 if (!msvcrt_free_tls()) 136 return FALSE; 137 //MSVCRT__free_locale(MSVCRT_locale); 138 139 if (__winitenv && __winitenv != _wenviron) 140 FreeEnvironment((char**)__winitenv); 141 if (_wenviron) 142 FreeEnvironment((char**)_wenviron); 143 144 if (__initenv && __initenv != _environ) 145 FreeEnvironment(__initenv); 146 if (_environ) 147 FreeEnvironment(_environ); 148 149 TRACE("Detach done\n"); 150 break; 151 } 152 153 return TRUE; 154 } 155 156 157 /********************************************************************* 158 * __GetMainArgs (CRTDLL.@) 159 */ 160 void __GetMainArgs( int *argc, char ***argv, char ***envp, int expand_wildcards ) 161 { 162 int new_mode = 0; 163 __getmainargs( argc, argv, envp, expand_wildcards, &new_mode ); 164 } 165 166 167 /********************************************************************* 168 * _fstat (CRTDLL.@) 169 */ 170 int CRTDLL__fstat(int fd, struct crtdll_stat* buf) 171 { 172 extern int _fstat(int,struct _stat*); 173 struct _stat st; 174 int ret; 175 176 if (!(ret = _fstat( fd, &st ))) convert_struct_stat( buf, &st ); 177 return ret; 178 } 179 180 181 /********************************************************************* 182 * _stat (CRTDLL.@) 183 */ 184 int CRTDLL__stat(const char* path, struct crtdll_stat * buf) 185 { 186 extern int _stat(const char*,struct _stat*); 187 struct _stat st; 188 int ret; 189 190 if (!(ret = _stat( path, &st ))) convert_struct_stat( buf, &st ); 191 return ret; 192 } 193 194 195 /********************************************************************* 196 * _strdec (CRTDLL.@) 197 */ 198 char *_strdec(const char *str1, const char *str2) 199 { 200 return (char *)(str2 - 1); 201 } 202 203 204 /********************************************************************* 205 * _strinc (CRTDLL.@) 206 */ 207 char *_strinc(const char *str) 208 { 209 return (char *)(str + 1); 210 } 211 212 213 /********************************************************************* 214 * _strncnt (CRTDLL.@) 215 */ 216 size_t _strncnt(const char *str, size_t maxlen) 217 { 218 size_t len = strlen(str); 219 return (len > maxlen) ? maxlen : len; 220 } 221 222 223 /********************************************************************* 224 * _strnextc (CRTDLL.@) 225 */ 226 unsigned int _strnextc(const char *str) 227 { 228 return (unsigned int)str[0]; 229 } 230 231 232 /********************************************************************* 233 * _strninc (CRTDLL.@) 234 */ 235 char *_strninc(const char *str, size_t len) 236 { 237 return (char *)(str + len); 238 } 239 240 241 /********************************************************************* 242 * _strspnp (CRTDLL.@) 243 */ 244 char *_strspnp( const char *str1, const char *str2) 245 { 246 str1 += strspn( str1, str2 ); 247 return *str1 ? (char*)str1 : NULL; 248 } 249 250 /* EOF */ 251