ReactOS 0.4.16-dev-125-g798ea90
dllmain.c File Reference
#include "precomp.h"
#include <mbctype.h>
#include <sys/stat.h>
#include <internal/wine/msvcrt.h>
#include <wine/debug.h>
Include dependency graph for dllmain.c:

Go to the source code of this file.

Classes

struct  crtdll_stat
 

Typedefs

typedef short crtdll_dev_t
 

Functions

 WINE_DEFAULT_DEBUG_CHANNEL (crtdll)
 
void __getmainargs (int *argc, char ***argv, char ***envp, int expand_wildcards, int *new_mode)
 
BOOL crt_process_init (void)
 
void FreeEnvironment (char **environment)
 
static void convert_struct_stat (struct crtdll_stat *dst, const struct _stat *src)
 
BOOL WINAPI DllMain (PVOID hinstDll, ULONG dwReason, PVOID reserved)
 
void __GetMainArgs (int *argc, char ***argv, char ***envp, int expand_wildcards)
 
int CRTDLL__fstat (int fd, struct crtdll_stat *buf)
 
int CRTDLL__stat (const char *path, struct crtdll_stat *buf)
 
char_strdec (const char *str1, const char *str2)
 
char_strinc (const char *str)
 
size_t _strncnt (const char *str, size_t maxlen)
 
unsigned int _strnextc (const char *str)
 
char_strninc (const char *str, size_t len)
 
char_strspnp (const char *str1, const char *str2)
 

Variables

unsigned int CRTDLL__basemajor_dll = 0
 
unsigned int CRTDLL__baseminor_dll = 0
 
unsigned int CRTDLL__baseversion_dll = 0
 
unsigned int CRTDLL__cpumode_dll = 0
 
unsigned int CRTDLL__osmajor_dll = 0
 
unsigned int CRTDLL__osminor_dll = 0
 
unsigned int CRTDLL__osmode_dll = 0
 
unsigned int CRTDLL__osversion_dll = 0
 
int _fileinfo_dll
 
char ** _environ
 
char ** __initenv
 
wchar_t ** _wenviron
 
wchar_t ** __winitenv
 

Typedef Documentation

◆ crtdll_dev_t

Definition at line 54 of file dllmain.c.

Function Documentation

◆ __GetMainArgs()

void __GetMainArgs ( int argc,
char ***  argv,
char ***  envp,
int  expand_wildcards 
)

Definition at line 160 of file dllmain.c.

161{
162 int new_mode = 0;
163 __getmainargs( argc, argv, envp, expand_wildcards, &new_mode );
164}
static int argc
Definition: ServiceArgs.c:12
void __getmainargs(int *argc, char ***argv, char ***envp, int expand_wildcards, int *new_mode)
Definition: getargs.c:182
#define argv
Definition: mplay32.c:18

◆ __getmainargs()

void __getmainargs ( int argc,
char ***  argv,
char ***  envp,
int  expand_wildcards,
int new_mode 
)

Definition at line 182 of file getargs.c.

183{
184 int i, doexpand, slashesAdded, escapedQuote, inQuotes, bufferIndex, anyLetter;
185 size_t len;
186 char* buffer;
187
188 /* missing threading init */
189
190 i = 0;
191 doexpand = expand_wildcards;
192 escapedQuote = FALSE;
193 anyLetter = FALSE;
194 slashesAdded = 0;
195 inQuotes = 0;
196 bufferIndex = 0;
197
198 if (__argv && _environ)
199 {
200 *argv = __argv;
201 *env = _environ;
202 *argc = __argc;
203 return;
204 }
205
206 __argc = 0;
207
208 len = strlen(_acmdln);
209 buffer = malloc(sizeof(char) * len);
210
211 // Reference: https://msdn.microsoft.com/en-us/library/a1y7w461.aspx
212 while (TRUE)
213 {
214 // Arguments are delimited by white space, which is either a space or a tab.
215 if (i >= len || ((_acmdln[i] == ' ' || _acmdln[i] == '\t') && !inQuotes))
216 {
217 // Handle the case when empty spaces are in the end of the cmdline
218 if (anyLetter)
219 {
220 aexpand(strndup(buffer, bufferIndex), doexpand);
221 }
222 // Copy the last element from buffer and quit the loop
223 if (i >= len)
224 {
225 break;
226 }
227
228 while (_acmdln[i] == ' ' || _acmdln[i] == '\t')
229 ++i;
230 anyLetter = FALSE;
231 bufferIndex = 0;
232 slashesAdded = 0;
233 escapedQuote = FALSE;
234 continue;
235 }
236
237 anyLetter = TRUE;
238
239 if (_acmdln[i] == '\\')
240 {
242 ++slashesAdded;
243 ++i;
244 escapedQuote = FALSE;
245 continue;
246 }
247
248 if (_acmdln[i] == '\"')
249 {
250 if (slashesAdded > 0)
251 {
252 if (slashesAdded % 2 == 0)
253 {
254 // If an even number of backslashes is followed by a double quotation mark, then one backslash (\‍)
255 // is placed in the argv array for every pair of backslashes (\\‍), and the double quotation mark (")
256 // is interpreted as a string delimiter.
257 bufferIndex -= slashesAdded / 2;
258 }
259 else
260 {
261 // If an odd number of backslashes is followed by a double quotation mark, then one backslash (\‍)
262 // is placed in the argv array for every pair of backslashes (\\‍) and the double quotation mark is
263 // interpreted as an escape sequence by the remaining backslash, causing a literal double quotation mark (")
264 // to be placed in argv.
265 bufferIndex -= slashesAdded / 2 + 1;
266 buffer[bufferIndex++] = '\"';
267 slashesAdded = 0;
268 escapedQuote = TRUE;
269 ++i;
270 continue;
271 }
272 slashesAdded = 0;
273 }
274 else if (!inQuotes && i > 0 && _acmdln[i - 1] == '\"' && !escapedQuote)
275 {
276 buffer[bufferIndex++] = '\"';
277 ++i;
278 escapedQuote = TRUE;
279 continue;
280 }
281 slashesAdded = 0;
282 escapedQuote = FALSE;
283 inQuotes = !inQuotes;
284 doexpand = inQuotes ? FALSE : expand_wildcards;
285 ++i;
286 continue;
287 }
288
290 slashesAdded = 0;
291 escapedQuote = FALSE;
292 ++i;
293 }
294
295 /* Free the temporary buffer. */
296 free(buffer);
297
298 *argc = __argc;
299 if (__argv == NULL)
300 {
301 __argv = (char**)malloc(sizeof(char*));
302 __argv[0] = 0;
303 }
304 *argv = __argv;
305 *env = _environ;
306
307 _pgmptr = malloc(MAX_PATH * sizeof(char));
308 if (_pgmptr)
309 {
311 _pgmptr[0] = '\0';
312 else
313 _pgmptr[MAX_PATH - 1] = '\0';
314 }
315 else
316 {
317 _pgmptr = _strdup(__argv[0]);
318 }
319
321
322 // if (new_mode) _set_new_mode(*new_mode);
323}
ACPI_SIZE strlen(const char *String)
Definition: utclib.c:269
static LPCWSTR LPCWSTR LPCWSTR env
Definition: db.cpp:170
#define free
Definition: debug_ros.c:5
#define _strdup
Definition: debug_ros.c:7
#define malloc
Definition: debug_ros.c:4
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
#define GetProcessHeap()
Definition: compat.h:736
#define MAX_PATH
Definition: compat.h:34
DWORD WINAPI GetModuleFileNameA(HINSTANCE hModule, LPSTR lpFilename, DWORD nSize)
Definition: loader.c:539
GLuint buffer
Definition: glext.h:5915
GLuint bufferIndex
Definition: glext.h:7857
GLenum GLsizei len
Definition: glext.h:6722
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
BOOL WINAPI HeapValidate(HANDLE hHeap, DWORD dwFlags, LPCVOID lpMem)
Definition: heapmem.c:156
char * _acmdln
Definition: environ.c:18
char ** __argv
Definition: getargs.c:18
int aexpand(char *name, int expand_wildcards)
Definition: getargs.c:132
int __argc
Definition: getargs.c:21
char * strndup(char const *name, size_t len)
Definition: getargs.c:25
char * _pgmptr
Definition: environ.c:27
char ** _environ
Definition: environ.c:22

Referenced by __GetMainArgs().

◆ _strdec()

char * _strdec ( const char str1,
const char str2 
)

Definition at line 198 of file dllmain.c.

199{
200 return (char *)(str2 - 1);
201}

◆ _strinc()

char * _strinc ( const char str)

Definition at line 207 of file dllmain.c.

208{
209 return (char *)(str + 1);
210}
const WCHAR * str

◆ _strncnt()

size_t _strncnt ( const char str,
size_t  maxlen 
)

Definition at line 216 of file dllmain.c.

217{
218 size_t len = strlen(str);
219 return (len > maxlen) ? maxlen : len;
220}

◆ _strnextc()

unsigned int _strnextc ( const char str)

Definition at line 226 of file dllmain.c.

227{
228 return (unsigned int)str[0];
229}

◆ _strninc()

char * _strninc ( const char str,
size_t  len 
)

Definition at line 235 of file dllmain.c.

236{
237 return (char *)(str + len);
238}

◆ _strspnp()

char * _strspnp ( const char str1,
const char str2 
)

Definition at line 244 of file dllmain.c.

245{
246 str1 += strspn( str1, str2 );
247 return *str1 ? (char*)str1 : NULL;
248}
_Check_return_ _CRTIMP size_t __cdecl strspn(_In_z_ const char *_Str, _In_z_ const char *_Control)

◆ convert_struct_stat()

static void convert_struct_stat ( struct crtdll_stat dst,
const struct _stat src 
)
static

Definition at line 72 of file dllmain.c.

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}
GLenum src
Definition: glext.h:6340
GLenum GLenum dst
Definition: glext.h:6340

Referenced by CRTDLL__fstat(), and CRTDLL__stat().

◆ crt_process_init()

BOOL crt_process_init ( void  )

Definition at line 21 of file crt_init.c.

22{
24
25 /* initialize version info */
33
34 /* create tls stuff */
36 return FALSE;
37
38 if (!msvcrt_init_heap())
39 return FALSE;
40
41 if (BlockEnvToEnvironA() < 0)
42 return FALSE;
43
44 if (BlockEnvToEnvironW() < 0)
45 {
47 return FALSE;
48 }
49
52
53 /* Initialization of the WINE code */
55
56 //msvcrt_init_math();
58 //msvcrt_init_console();
59 //msvcrt_init_args();
60 //msvcrt_init_signals();
61
62 return TRUE;
63}
char * _acmdln
Definition: environ.c:18
void msvcrt_init_io(void)
Definition: file.c:456
void msvcrt_init_mt_locks(void)
Definition: lock.c:54
int BlockEnvToEnvironA(void)
Definition: environ.c:34
void FreeEnvironment(char **environment)
Definition: environ.c:190
BOOL msvcrt_init_heap(void)
Definition: heap.c:895
wchar_t * _wcmdln
Definition: environ.c:19
int BlockEnvToEnvironW(void)
Definition: environ.c:86
char ** _environ
Definition: environ.c:22
LPSTR WINAPI GetCommandLineA(VOID)
Definition: proc.c:2009
LPWSTR WINAPI GetCommandLineW(VOID)
Definition: proc.c:2019
BOOL WINAPI GetVersionExW(IN LPOSVERSIONINFOW lpVersionInformation)
Definition: version.c:37
if(dx< 0)
Definition: linetemp.h:194
unsigned int _winminor
Definition: environ.c:12
unsigned int _winmajor
Definition: environ.c:13
unsigned int _osver
Definition: environ.c:11
unsigned int _osplatform
Definition: environ.c:10
unsigned int _winver
Definition: environ.c:14
_Check_return_ _CRTIMP wchar_t *__cdecl _wcsdup(_In_z_ const wchar_t *_Str)
BOOL msvcrt_init_tls(void)
Definition: tls.c:9
ULONG dwPlatformId
Definition: rtltypes.h:241
ULONG dwOSVersionInfoSize
Definition: rtltypes.h:237
ULONG dwMajorVersion
Definition: rtltypes.h:238
ULONG dwBuildNumber
Definition: rtltypes.h:240
ULONG dwMinorVersion
Definition: rtltypes.h:239
OSVERSIONINFO osvi
Definition: ver.c:28
struct _OSVERSIONINFOW OSVERSIONINFOW

Referenced by DllMain(), and msvcrt_init_exception().

◆ CRTDLL__fstat()

int CRTDLL__fstat ( int  fd,
struct crtdll_stat buf 
)

Definition at line 170 of file dllmain.c.

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}
static void convert_struct_stat(struct crtdll_stat *dst, const struct _stat *src)
Definition: dllmain.c:72
GLenum GLuint GLenum GLsizei const GLchar * buf
Definition: glext.h:7751
_CRTIMP int __cdecl _fstat(_In_ int _FileDes, _Out_ struct _stat *_Stat)
static int fd
Definition: io.c:51
Definition: stat.h:40
int ret

◆ CRTDLL__stat()

int CRTDLL__stat ( const char path,
struct crtdll_stat buf 
)

Definition at line 184 of file dllmain.c.

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}

◆ DllMain()

BOOL WINAPI DllMain ( PVOID  hinstDll,
ULONG  dwReason,
PVOID  reserved 
)

Definition at line 91 of file dllmain.c.

92{
94 switch (dwReason)
95 {
98
99 /* initialize version info */
100 CRTDLL__basemajor_dll = (version >> 24) & 0xFF;
101 CRTDLL__baseminor_dll = (version >> 16) & 0xFF;
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;
118 break;
119
122 break;
123
125 TRACE("Detach\n");
126 /* Deinit of the WINE code */
128 if (reserved) break;
131 //msvcrt_free_console();
132 //msvcrt_free_args();
133 //msvcrt_free_signals();
135 if (!msvcrt_free_tls())
136 return FALSE;
137 //MSVCRT__free_locale(MSVCRT_locale);
138
141 if (_wenviron)
142 FreeEnvironment((char**)_wenviron);
143
144 if (__initenv && __initenv != _environ)
146 if (_environ)
148
149 TRACE("Detach done\n");
150 break;
151 }
152
153 return TRUE;
154}
#define ERR(fmt,...)
Definition: precomp.h:57
DWORD dwReason
Definition: misc.cpp:141
unsigned int CRTDLL__osminor_dll
Definition: dllmain.c:42
unsigned int CRTDLL__cpumode_dll
Definition: dllmain.c:40
void FreeEnvironment(char **environment)
Definition: environ.c:190
char ** __initenv
Definition: environ.c:24
unsigned int CRTDLL__baseminor_dll
Definition: dllmain.c:38
wchar_t ** __winitenv
Definition: environ.c:25
wchar_t ** _wenviron
Definition: environ.c:23
unsigned int CRTDLL__osversion_dll
Definition: dllmain.c:44
unsigned int CRTDLL__basemajor_dll
Definition: dllmain.c:37
BOOL crt_process_init(void)
Definition: crt_init.c:21
unsigned int CRTDLL__baseversion_dll
Definition: dllmain.c:39
unsigned int CRTDLL__osmajor_dll
Definition: dllmain.c:41
unsigned int CRTDLL__osmode_dll
Definition: dllmain.c:43
char ** _environ
Definition: environ.c:22
#define DLL_THREAD_DETACH
Definition: compat.h:133
#define DLL_PROCESS_ATTACH
Definition: compat.h:131
#define DLL_PROCESS_DETACH
Definition: compat.h:130
#define DLL_THREAD_ATTACH
Definition: compat.h:132
static const WCHAR version[]
Definition: asmname.c:66
r reserved
Definition: btrfs.c:3006
unsigned long DWORD
Definition: ntddk_ex.h:95
void msvcrt_free_mt_locks(void)
Definition: lock.c:77
void msvcrt_free_io(void)
Definition: file.c:1100
DWORD WINAPI GetVersion()
Definition: redirtest.c:5
void msvcrt_free_tls_mem(void)
Definition: tls.c:51
BOOL msvcrt_free_tls(void)
Definition: tls.c:21
void msvcrt_free_popen_data(void)
Definition: popen.c:29
#define TRACE(s)
Definition: solgame.cpp:4

◆ FreeEnvironment()

void FreeEnvironment ( char **  environment)

Internal function to deallocate environment block. Although it's parameter are defined as char**, it's able to work also with wide character environment block which are of type wchar_t**.

Parameters
environmentEnvironment to free.

Definition at line 190 of file environ.c.

191{
192 char **envptr;
193 for (envptr = environment; *envptr != NULL; envptr++)
194 free(*envptr);
195 free(environment);
196}

Referenced by DllMain(), and msvcrt_init_exception().

◆ WINE_DEFAULT_DEBUG_CHANNEL()

WINE_DEFAULT_DEBUG_CHANNEL ( crtdll  )

Variable Documentation

◆ __initenv

char** __initenv
extern

Definition at line 24 of file environ.c.

Referenced by DllMain(), msvcrt_init_exception(), and Test___initenv().

◆ __winitenv

wchar_t** __winitenv
extern

Definition at line 25 of file environ.c.

Referenced by DllMain(), msvcrt_init_exception(), and Test___winitenv().

◆ _environ

char** _environ
extern

Definition at line 22 of file environ.c.

Referenced by DllMain(), msvcrt_init_exception(), and Test__environ().

◆ _fileinfo_dll

int _fileinfo_dll

Definition at line 45 of file dllmain.c.

◆ _wenviron

wchar_t** _wenviron
extern

Definition at line 23 of file environ.c.

Referenced by DllMain(), msvcrt_init_exception(), and Test__wenviron().

◆ CRTDLL__basemajor_dll

unsigned int CRTDLL__basemajor_dll = 0

Definition at line 37 of file dllmain.c.

Referenced by DllMain().

◆ CRTDLL__baseminor_dll

unsigned int CRTDLL__baseminor_dll = 0

Definition at line 38 of file dllmain.c.

Referenced by DllMain().

◆ CRTDLL__baseversion_dll

unsigned int CRTDLL__baseversion_dll = 0

Definition at line 39 of file dllmain.c.

Referenced by DllMain().

◆ CRTDLL__cpumode_dll

unsigned int CRTDLL__cpumode_dll = 0

Definition at line 40 of file dllmain.c.

Referenced by DllMain().

◆ CRTDLL__osmajor_dll

unsigned int CRTDLL__osmajor_dll = 0

Definition at line 41 of file dllmain.c.

Referenced by DllMain().

◆ CRTDLL__osminor_dll

unsigned int CRTDLL__osminor_dll = 0

Definition at line 42 of file dllmain.c.

Referenced by DllMain().

◆ CRTDLL__osmode_dll

unsigned int CRTDLL__osmode_dll = 0

Definition at line 43 of file dllmain.c.

Referenced by DllMain().

◆ CRTDLL__osversion_dll

unsigned int CRTDLL__osversion_dll = 0

Definition at line 44 of file dllmain.c.

Referenced by DllMain().