ReactOS  0.4.15-dev-1150-g593bcce
dllmain.c
Go to the documentation of this file.
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>
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 extern int BlockEnvToEnvironA(void);
33 extern int BlockEnvToEnvironW(void);
34 extern void FreeEnvironment(char **environment);
35 
36 extern unsigned int _osver;
37 extern unsigned int _winminor;
38 extern unsigned int _winmajor;
39 extern unsigned int _winver;
40 
41 unsigned int CRTDLL__basemajor_dll = 0;
42 unsigned int CRTDLL__baseminor_dll = 0;
43 unsigned int CRTDLL__baseversion_dll = 0;
44 unsigned int CRTDLL__cpumode_dll = 0;
45 unsigned int CRTDLL__osmajor_dll = 0;
46 unsigned int CRTDLL__osminor_dll = 0;
47 unsigned int CRTDLL__osmode_dll = 0;
48 unsigned int CRTDLL__osversion_dll = 0;
50 
51 extern char* _acmdln; /* pointer to ascii command line */
52 extern wchar_t* _wcmdln; /* pointer to wide character command line */
53 #undef _environ
54 extern char** _environ; /* pointer to environment block */
55 extern char** __initenv; /* pointer to initial environment block */
56 extern wchar_t** _wenviron; /* pointer to environment block */
57 extern wchar_t** __winitenv; /* pointer to initial environment block */
58 
59 /* dev_t is a short in crtdll but an unsigned int in msvcrt */
60 typedef short crtdll_dev_t;
61 
63 {
66  unsigned short st_mode;
67  short st_nlink;
68  short st_uid;
69  short st_gid;
75 };
76 
77 /* convert struct _stat from crtdll format to msvcrt format */
78 static void convert_struct_stat( struct crtdll_stat *dst, const struct _stat *src )
79 {
80  dst->st_dev = src->st_dev;
81  dst->st_ino = src->st_ino;
82  dst->st_mode = src->st_mode;
83  dst->st_nlink = src->st_nlink;
84  dst->st_uid = src->st_uid;
85  dst->st_gid = src->st_gid;
86  dst->st_rdev = src->st_rdev;
87  dst->st_size = src->st_size;
88  dst->st_atime = src->st_atime;
89  dst->st_mtime = src->st_mtime;
90  dst->st_ctime = src->st_ctime;
91 }
92 
93 /* LIBRARY ENTRY POINT ********************************************************/
94 
95 BOOL
96 WINAPI
98 {
99  DWORD version;
100  switch (dwReason)
101  {
102  case DLL_PROCESS_ATTACH:
103  version = GetVersion();
104 
105  /* initialize version info */
106  CRTDLL__basemajor_dll = (version >> 24) & 0xFF;
107  CRTDLL__baseminor_dll = (version >> 16) & 0xFF;
109  CRTDLL__cpumode_dll = 1; /* FIXME */
110  CRTDLL__osmajor_dll = (version >>8) & 0xFF;
111  CRTDLL__osminor_dll = (version & 0xFF);
112  CRTDLL__osmode_dll = 1; /* FIXME */
113  CRTDLL__osversion_dll = (version & 0xFFFF);
114 
115  _winmajor = (_osver >> 8) & 0xFF;
116  _winminor = _osver & 0xFF;
117  _winver = (_winmajor << 8) + _winminor;
118  _osver = (_osver >> 16) & 0xFFFF;
119 
120  /* create tls stuff */
121  if (!msvcrt_init_tls())
122  return FALSE;
123 
124  if (BlockEnvToEnvironA() < 0)
125  return FALSE;
126 
127  if (BlockEnvToEnvironW() < 0)
128  {
130  return FALSE;
131  }
132 
135 
136  /* Initialization of the WINE code */
138  //if(!msvcrt_init_locale()) {
139  //msvcrt_free_mt_locks();
140  // msvcrt_free_tls_mem();
141  //return FALSE;
142  //}
143  //msvcrt_init_math();
144  msvcrt_init_io();
145  //msvcrt_init_console();
146  //msvcrt_init_args();
147  //msvcrt_init_signals();
149  TRACE("Attach done\n");
150  break;
151  case DLL_THREAD_ATTACH:
152  break;
153 
154  case DLL_THREAD_DETACH:
156  break;
157 
158  case DLL_PROCESS_DETACH:
159  TRACE("Detach\n");
160  /* Deinit of the WINE code */
161  msvcrt_free_io();
162  if (reserved) break;
165  //msvcrt_free_console();
166  //msvcrt_free_args();
167  //msvcrt_free_signals();
169  if (!msvcrt_free_tls())
170  return FALSE;
171  //MSVCRT__free_locale(MSVCRT_locale);
172 
173  if (__winitenv && __winitenv != _wenviron)
174  FreeEnvironment((char**)__winitenv);
175  if (_wenviron)
176  FreeEnvironment((char**)_wenviron);
177 
178  if (__initenv && __initenv != _environ)
180  if (_environ)
182 
183  TRACE("Detach done\n");
184  break;
185  }
186 
187  return TRUE;
188 }
189 
190 
191 /*********************************************************************
192  * __GetMainArgs (CRTDLL.@)
193  */
194 void __GetMainArgs( int *argc, char ***argv, char ***envp, int expand_wildcards )
195 {
196  int new_mode = 0;
197  __getmainargs( argc, argv, envp, expand_wildcards, &new_mode );
198 }
199 
200 
201 /*********************************************************************
202  * _fstat (CRTDLL.@)
203  */
204 int CRTDLL__fstat(int fd, struct crtdll_stat* buf)
205 {
206  extern int _fstat(int,struct _stat*);
207  struct _stat st;
208  int ret;
209 
210  if (!(ret = _fstat( fd, &st ))) convert_struct_stat( buf, &st );
211  return ret;
212 }
213 
214 
215 /*********************************************************************
216  * _stat (CRTDLL.@)
217  */
218 int CRTDLL__stat(const char* path, struct crtdll_stat * buf)
219 {
220  extern int _stat(const char*,struct _stat*);
221  struct _stat st;
222  int ret;
223 
224  if (!(ret = _stat( path, &st ))) convert_struct_stat( buf, &st );
225  return ret;
226 }
227 
228 
229 /*********************************************************************
230  * _strdec (CRTDLL.@)
231  */
232 char *_strdec(const char *str1, const char *str2)
233 {
234  return (char *)(str2 - 1);
235 }
236 
237 
238 /*********************************************************************
239  * _strinc (CRTDLL.@)
240  */
241 char *_strinc(const char *str)
242 {
243  return (char *)(str + 1);
244 }
245 
246 
247 /*********************************************************************
248  * _strncnt (CRTDLL.@)
249  */
250 size_t _strncnt(const char *str, size_t maxlen)
251 {
252  size_t len = strlen(str);
253  return (len > maxlen) ? maxlen : len;
254 }
255 
256 
257 /*********************************************************************
258  * _strnextc (CRTDLL.@)
259  */
260 unsigned int _strnextc(const char *str)
261 {
262  return (unsigned int)str[0];
263 }
264 
265 
266 /*********************************************************************
267  * _strninc (CRTDLL.@)
268  */
269 char *_strninc(const char *str, size_t len)
270 {
271  return (char *)(str + len);
272 }
273 
274 
275 /*********************************************************************
276  * _strspnp (CRTDLL.@)
277  */
278 char *_strspnp( const char *str1, const char *str2)
279 {
280  str1 += strspn( str1, str2 );
281  return *str1 ? (char*)str1 : NULL;
282 }
283 
284 /* EOF */
short st_uid
Definition: dllmain.c:68
static int argc
Definition: ServiceArgs.c:12
time_t st_mtime
Definition: dllmain.c:73
unsigned int CRTDLL__osversion_dll
Definition: dllmain.c:48
unsigned int _strnextc(const char *str)
Definition: dllmain.c:260
int CRTDLL__stat(const char *path, struct crtdll_stat *buf)
Definition: dllmain.c:218
unsigned int CRTDLL__cpumode_dll
Definition: dllmain.c:44
void msvcrt_free_io(void)
Definition: file.c:1100
wchar_t ** _wenviron
Definition: environ.c:23
ACPI_SIZE strlen(const char *String)
Definition: utclib.c:269
GLenum GLuint GLenum GLsizei const GLchar * buf
Definition: glext.h:7751
#define TRUE
Definition: types.h:120
#define DLL_THREAD_ATTACH
Definition: compat.h:132
unsigned int CRTDLL__basemajor_dll
Definition: dllmain.c:41
void msvcrt_free_tls_mem(void)
Definition: tls.c:51
crtdll_dev_t st_rdev
Definition: dllmain.c:70
Definition: stat.h:40
unsigned int CRTDLL__osmode_dll
Definition: dllmain.c:47
_Check_return_ _CRTIMP size_t __cdecl strspn(_In_z_ const char *_Str, _In_z_ const char *_Control)
static int fd
Definition: io.c:51
#define DLL_PROCESS_ATTACH
Definition: compat.h:131
void msvcrt_init_io(void)
Definition: file.c:457
BOOL WINAPI DllMain(HINSTANCE hDLLInst, DWORD fdwReason, LPVOID lpvReserved)
Definition: dllmain.c:52
#define argv
Definition: mplay32.c:18
#define _strdup
Definition: debug_ros.c:7
char * _strinc(const char *str)
Definition: dllmain.c:241
#define DLL_THREAD_DETACH
Definition: compat.h:133
DWORD WINAPI GetVersion(VOID)
Definition: version.c:22
unsigned int _winminor
Definition: environ.c:12
wchar_t ** __winitenv
Definition: environ.c:25
void msvcrt_free_popen_data(void)
Definition: popen.c:29
unsigned int CRTDLL__baseminor_dll
Definition: dllmain.c:42
BOOL msvcrt_free_tls(void)
Definition: tls.c:21
DWORD dwReason
Definition: misc.cpp:154
char ** _environ
Definition: environ.c:22
unsigned short st_mode
Definition: dllmain.c:66
#define FALSE
Definition: types.h:117
unsigned int BOOL
Definition: ntddk_ex.h:94
LPWSTR WINAPI GetCommandLineW(VOID)
Definition: proc.c:2015
r reserved
Definition: btrfs.c:2940
unsigned short _ino_t
Definition: types.h:17
const WCHAR * str
short crtdll_dev_t
Definition: dllmain.c:60
smooth NULL
Definition: ftsmooth.c:416
static const WCHAR version[]
Definition: asmname.c:66
char * _acmdln
Definition: environ.c:18
unsigned int _osver
Definition: environ.c:11
#define DLL_PROCESS_DETACH
Definition: compat.h:130
void msvcrt_free_mt_locks(void)
Definition: lock.c:77
#define TRACE(s)
Definition: solgame.cpp:4
_ino_t st_ino
Definition: dllmain.c:65
char * _strninc(const char *str, size_t len)
Definition: dllmain.c:269
unsigned int _winmajor
Definition: environ.c:13
static void convert_struct_stat(struct crtdll_stat *dst, const struct _stat *src)
Definition: dllmain.c:78
void __getmainargs(int *argc, char ***argv, char ***envp, int expand_wildcards, int *new_mode)
Definition: getargs.c:182
int __cdecl _setmbcp(int)
Definition: _setmbcp.c:218
#define WINAPI
Definition: msvc.h:6
size_t _strncnt(const char *str, size_t maxlen)
Definition: dllmain.c:250
unsigned long DWORD
Definition: ntddk_ex.h:95
time_t st_atime
Definition: dllmain.c:72
BOOL msvcrt_init_tls(void)
Definition: tls.c:9
unsigned int _winver
Definition: environ.c:14
LPSTR WINAPI GetCommandLineA(VOID)
Definition: proc.c:2005
int ret
#define _MB_CP_LOCALE
Definition: msvcrt.h:831
char ** __initenv
Definition: environ.c:24
time_t st_ctime
Definition: dllmain.c:74
GLenum GLsizei len
Definition: glext.h:6722
short st_nlink
Definition: dllmain.c:67
char * _strdec(const char *str1, const char *str2)
Definition: dllmain.c:232
GLenum src
Definition: glext.h:6340
_CRTIMP int __cdecl _stat(_In_z_ const char *_Name, _Out_ struct _stat *_Stat)
wchar_t * _wcmdln
Definition: environ.c:19
void FreeEnvironment(char **environment)
Definition: environ.c:190
_CRTIMP int __cdecl _fstat(_In_ int _FileDes, _Out_ struct _stat *_Stat)
void __GetMainArgs(int *argc, char ***argv, char ***envp, int expand_wildcards)
Definition: dllmain.c:194
char * _strspnp(const char *str1, const char *str2)
Definition: dllmain.c:278
__kernel_time_t time_t
Definition: linux.h:252
_off_t st_size
Definition: dllmain.c:71
WINE_DEFAULT_DEBUG_CHANNEL(crtdll)
GLenum GLenum dst
Definition: glext.h:6340
unsigned int CRTDLL__osmajor_dll
Definition: dllmain.c:45
int BlockEnvToEnvironW(void)
Definition: environ.c:86
unsigned int CRTDLL__baseversion_dll
Definition: dllmain.c:43
int _fileinfo_dll
Definition: dllmain.c:49
long _off_t
Definition: stdio.h:81
short st_gid
Definition: dllmain.c:69
unsigned int ULONG
Definition: retypes.h:1
int CRTDLL__fstat(int fd, struct crtdll_stat *buf)
Definition: dllmain.c:204
_Check_return_ _CRTIMP wchar_t *__cdecl _wcsdup(_In_z_ const wchar_t *_Str)
int BlockEnvToEnvironA(void)
Definition: environ.c:34
unsigned int CRTDLL__osminor_dll
Definition: dllmain.c:46
void msvcrt_init_mt_locks(void)
Definition: lock.c:54
crtdll_dev_t st_dev
Definition: dllmain.c:64