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 */
convert_struct_stat(struct crtdll_stat * dst,const struct _stat * src)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
DllMain(PVOID hinstDll,ULONG dwReason,PVOID reserved)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 */
__GetMainArgs(int * argc,char *** argv,char *** envp,int expand_wildcards)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 */
CRTDLL__fstat(int fd,struct crtdll_stat * buf)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 */
CRTDLL__stat(const char * path,struct crtdll_stat * buf)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 */
_strdec(const char * str1,const char * str2)198 char *_strdec(const char *str1, const char *str2)
199 {
200 return (char *)(str2 - 1);
201 }
202
203
204 /*********************************************************************
205 * _strinc (CRTDLL.@)
206 */
_strinc(const char * str)207 char *_strinc(const char *str)
208 {
209 return (char *)(str + 1);
210 }
211
212
213 /*********************************************************************
214 * _strncnt (CRTDLL.@)
215 */
_strncnt(const char * str,size_t maxlen)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 */
_strnextc(const char * str)226 unsigned int _strnextc(const char *str)
227 {
228 return (unsigned int)str[0];
229 }
230
231
232 /*********************************************************************
233 * _strninc (CRTDLL.@)
234 */
_strninc(const char * str,size_t len)235 char *_strninc(const char *str, size_t len)
236 {
237 return (char *)(str + len);
238 }
239
240
241 /*********************************************************************
242 * _strspnp (CRTDLL.@)
243 */
_strspnp(const char * str1,const char * str2)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