ReactOS  0.4.15-dev-3299-gbe8e5fc
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,
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  {
241  buffer[bufferIndex++] = _acmdln[i];
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 
289  buffer[bufferIndex++] = _acmdln[i];
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 }
char ** _environ
Definition: environ.c:22
int __argc
Definition: getargs.c:21
static int argc
Definition: ServiceArgs.c:12
char * _acmdln
Definition: environ.c:18
char ** __argv
Definition: getargs.c:18
ACPI_SIZE strlen(const char *String)
Definition: utclib.c:269
#define TRUE
Definition: types.h:120
#define free
Definition: debug_ros.c:5
BOOL WINAPI HeapValidate(HANDLE hHeap, DWORD dwFlags, LPCVOID lpMem)
Definition: heapmem.c:156
GLuint buffer
Definition: glext.h:5915
#define argv
Definition: mplay32.c:18
#define _strdup
Definition: debug_ros.c:7
DWORD WINAPI GetModuleFileNameA(HINSTANCE hModule, LPSTR lpFilename, DWORD nSize)
Definition: loader.c:539
#define FALSE
Definition: types.h:117
GLuint bufferIndex
Definition: glext.h:7857
#define GetProcessHeap()
Definition: compat.h:595
#define MAX_PATH
Definition: compat.h:34
int aexpand(char *name, int expand_wildcards)
Definition: getargs.c:132
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
char * strndup(char const *name, size_t len)
Definition: getargs.c:25
char * _pgmptr
Definition: environ.c:27
#define NULL
Definition: types.h:112
static LPCWSTR LPCWSTR LPCWSTR env
Definition: db.cpp:170
#define malloc
Definition: debug_ros.c:4

Referenced by __GetMainArgs(), and pre_cpp_init().

◆ __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
#define argv
Definition: mplay32.c:18
void __getmainargs(int *argc, char ***argv, char ***envp, int expand_wildcards, int *new_mode)
Definition: getargs.c:182

◆ _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 }
ACPI_SIZE strlen(const char *String)
Definition: utclib.c:269
const WCHAR * str
GLenum GLsizei len
Definition: glext.h:6722

◆ _strnextc()

unsigned int _strnextc ( const char str)

Definition at line 226 of file dllmain.c.

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

◆ _strninc()

char* _strninc ( const char str,
size_t  len 
)

Definition at line 235 of file dllmain.c.

236 {
237  return (char *)(str + len);
238 }
const WCHAR * str
GLenum GLsizei len
Definition: glext.h:6722

◆ _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)
#define NULL
Definition: types.h:112

◆ 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 20 of file crt_init.c.

21 {
23 
24  /* initialize version info */
32 
33  /* create tls stuff */
34  if (!msvcrt_init_tls())
35  return FALSE;
36 
37  if (BlockEnvToEnvironA() < 0)
38  return FALSE;
39 
40  if (BlockEnvToEnvironW() < 0)
41  {
43  return FALSE;
44  }
45 
48 
49  /* Initialization of the WINE code */
51 
52  //msvcrt_init_math();
54  //msvcrt_init_console();
55  //msvcrt_init_args();
56  //msvcrt_init_signals();
57 
58  return TRUE;
59 }
ULONG dwMajorVersion
Definition: rtltypes.h:238
int BlockEnvToEnvironA(void)
Definition: environ.c:34
OSVERSIONINFO osvi
Definition: ver.c:28
#define TRUE
Definition: types.h:120
void msvcrt_init_mt_locks(void)
Definition: lock.c:54
unsigned int _winminor
Definition: environ.c:12
if(dx==0 &&dy==0)
Definition: linetemp.h:174
BOOL WINAPI GetVersionExW(IN LPOSVERSIONINFOW lpVersionInformation)
Definition: version.c:37
#define _strdup
Definition: debug_ros.c:7
wchar_t * _wcmdln
Definition: environ.c:19
#define FALSE
Definition: types.h:117
LPWSTR WINAPI GetCommandLineW(VOID)
Definition: proc.c:2014
int BlockEnvToEnvironW(void)
Definition: environ.c:86
void FreeEnvironment(char **environment)
Definition: environ.c:190
ULONG dwOSVersionInfoSize
Definition: rtltypes.h:237
ULONG dwBuildNumber
Definition: rtltypes.h:240
void msvcrt_init_io(void)
Definition: file.c:457
BOOL msvcrt_init_tls(void)
Definition: tls.c:9
unsigned int _osplatform
Definition: environ.c:10
struct _OSVERSIONINFOW OSVERSIONINFOW
LPSTR WINAPI GetCommandLineA(VOID)
Definition: proc.c:2004
ULONG dwMinorVersion
Definition: rtltypes.h:239
unsigned int _osver
Definition: environ.c:11
ULONG dwPlatformId
Definition: rtltypes.h:241
unsigned int _winmajor
Definition: environ.c:13
unsigned int _winver
Definition: environ.c:14
char * _acmdln
Definition: environ.c:18
_Check_return_ _CRTIMP wchar_t *__cdecl _wcsdup(_In_z_ const wchar_t *_Str)
char ** _environ
Definition: environ.c:22

Referenced by DllMain().

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

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

◆ DllMain()

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

Definition at line 91 of file dllmain.c.

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;
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:
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;
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 
139  if (__winitenv && __winitenv != _wenviron)
140  FreeEnvironment((char**)__winitenv);
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 }
unsigned int CRTDLL__osversion_dll
Definition: dllmain.c:44
unsigned int CRTDLL__cpumode_dll
Definition: dllmain.c:40
void msvcrt_free_io(void)
Definition: file.c:1100
wchar_t ** _wenviron
Definition: environ.c:23
#define TRUE
Definition: types.h:120
#define DLL_THREAD_ATTACH
Definition: compat.h:132
unsigned int CRTDLL__basemajor_dll
Definition: dllmain.c:37
void msvcrt_free_tls_mem(void)
Definition: tls.c:51
unsigned int CRTDLL__osmode_dll
Definition: dllmain.c:43
#define DLL_PROCESS_ATTACH
Definition: compat.h:131
BOOL crt_process_init(void)
Definition: crt_init.c:20
#define DLL_THREAD_DETACH
Definition: compat.h:133
DWORD WINAPI GetVersion(VOID)
Definition: version.c:22
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:38
BOOL msvcrt_free_tls(void)
Definition: tls.c:21
DWORD dwReason
Definition: misc.cpp:154
char ** _environ
Definition: environ.c:22
#define FALSE
Definition: types.h:117
r reserved
Definition: btrfs.c:2940
static const WCHAR version[]
Definition: asmname.c:66
#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
unsigned long DWORD
Definition: ntddk_ex.h:95
char ** __initenv
Definition: environ.c:24
void FreeEnvironment(char **environment)
Definition: environ.c:190
#define ERR(fmt,...)
Definition: debug.h:110
unsigned int CRTDLL__osmajor_dll
Definition: dllmain.c:41
unsigned int CRTDLL__baseversion_dll
Definition: dllmain.c:39
unsigned int CRTDLL__osminor_dll
Definition: dllmain.c:42

◆ 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 }
#define free
Definition: debug_ros.c:5
#define NULL
Definition: types.h:112

Referenced by DllMain().

◆ WINE_DEFAULT_DEBUG_CHANNEL()

WINE_DEFAULT_DEBUG_CHANNEL ( crtdll  )

Variable Documentation

◆ __initenv

char** __initenv

Definition at line 24 of file environ.c.

Referenced by DllMain(), and Test___initenv().

◆ __winitenv

wchar_t** __winitenv

Definition at line 25 of file environ.c.

Referenced by DllMain(), and Test___winitenv().

◆ _environ

char** _environ

Definition at line 22 of file environ.c.

Referenced by DllMain(), and Test__environ().

◆ _fileinfo_dll

int _fileinfo_dll

Definition at line 45 of file dllmain.c.

◆ _wenviron

wchar_t** _wenviron

Definition at line 23 of file environ.c.

Referenced by DllMain(), Test__tzname(), 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().