ReactOS  0.4.15-dev-1054-gd029a62
msvcrt20.c File Reference
#include <stdio.h>
#include <internal/tls.h>
#include <internal/wine/msvcrt.h>
#include <internal/locale.h>
#include <wine/debug.h>
Include dependency graph for msvcrt20.c:

Go to the source code of this file.

Macros

#define WIN32_NO_STATUS
 
#define _CRT_PRECOMP_H
 

Functions

 WINE_DEFAULT_DEBUG_CHANNEL (msvcrt)
 
int BlockEnvToEnvironA (void)
 
int BlockEnvToEnvironW (void)
 
void FreeEnvironment (char **environment)
 
void CDECL __getmainargs (int *argc, char ***argv, char ***envp, int expand_wildcards, int *new_mode)
 
void CDECL __wgetmainargs (int *argc, WCHAR ***wargv, WCHAR ***wenvp, int expand_wildcards, int *new_mode)
 
BOOL WINAPI DllMain (PVOID hinstDll, ULONG dwReason, PVOID reserved)
 
void CDECL MSVCRT20__getmainargs (int *argc, char ***argv, char ***envp, int expand_wildcards, int new_mode)
 
void CDECL MSVCRT20__wgetmainargs (int *argc, WCHAR ***wargv, WCHAR ***wenvp, int expand_wildcards, int new_mode)
 

Variables

unsigned int _osplatform
 
unsigned int _osver
 
unsigned int _winminor
 
unsigned int _winmajor
 
unsigned int _winver
 
char_acmdln
 
wchar_t_wcmdln
 
char ** _environ
 
char ** __initenv
 
wchar_t ** _wenviron
 
wchar_t ** __winitenv
 

Macro Definition Documentation

◆ _CRT_PRECOMP_H

#define _CRT_PRECOMP_H

Definition at line 24 of file msvcrt20.c.

◆ WIN32_NO_STATUS

#define WIN32_NO_STATUS

Definition at line 21 of file msvcrt20.c.

Function Documentation

◆ __getmainargs()

void CDECL __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
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
#define FALSE
Definition: types.h:117
GLuint bufferIndex
Definition: glext.h:7857
smooth NULL
Definition: ftsmooth.c:416
#define GetProcessHeap()
Definition: compat.h:484
#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
char * strndup(char const *name, size_t len)
Definition: getargs.c:25
char * _pgmptr
Definition: environ.c:27
static LPCWSTR LPCWSTR LPCWSTR env
Definition: db.cpp:168
#define malloc
Definition: debug_ros.c:4

Referenced by MSVCRT20__getmainargs().

◆ __wgetmainargs()

void CDECL __wgetmainargs ( int argc,
WCHAR ***  wargv,
WCHAR ***  wenvp,
int  expand_wildcards,
int new_mode 
)

◆ BlockEnvToEnvironA()

int BlockEnvToEnvironA ( void  )

Definition at line 34 of file environ.c.

35 {
36  char *ptr, *environment_strings;
37  char **envptr;
38  int count = 1;
39  size_t len;
40 
41  TRACE("BlockEnvToEnvironA()\n");
42 
43  environment_strings = GetEnvironmentStringsA();
44  if (environment_strings == NULL) {
45  return -1;
46  }
47 
48  for (ptr = environment_strings; *ptr; ptr += len)
49  {
50  len = strlen(ptr) + 1;
51  /* Skip drive letter settings. */
52  if (*ptr != '=')
53  count++;
54  }
55 
56  __initenv = _environ = malloc(count * sizeof(char*));
57  if (_environ)
58  {
59  for (ptr = environment_strings, envptr = _environ; count > 1; ptr += len)
60  {
61  len = strlen(ptr) + 1;
62  /* Skip drive letter settings. */
63  if (*ptr != '=')
64  {
65  if ((*envptr = malloc(len)) == NULL)
66  {
67  for (envptr--; envptr >= _environ; envptr--)
68  free(*envptr);
69  FreeEnvironmentStringsA(environment_strings);
70  free(_environ);
72  return -1;
73  }
74  memcpy(*envptr++, ptr, len);
75  count--;
76  }
77  }
78  /* Add terminating NULL entry. */
79  *envptr = NULL;
80  }
81 
82  FreeEnvironmentStringsA(environment_strings);
83  return _environ ? 0 : -1;
84 }
ACPI_SIZE strlen(const char *String)
Definition: utclib.c:269
GLuint GLuint GLsizei count
Definition: gl.h:1545
#define free
Definition: debug_ros.c:5
BOOL WINAPI FreeEnvironmentStringsA(IN LPSTR EnvironmentStrings)
Definition: environ.c:379
char ** _environ
Definition: environ.c:22
char ** __initenv
Definition: environ.c:24
static PVOID ptr
Definition: dispmode.c:27
smooth NULL
Definition: ftsmooth.c:416
#define TRACE(s)
Definition: solgame.cpp:4
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
GLenum GLsizei len
Definition: glext.h:6722
LPSTR WINAPI GetEnvironmentStringsA(VOID)
Definition: environ.c:293
#define malloc
Definition: debug_ros.c:4

Referenced by DllMain().

◆ BlockEnvToEnvironW()

int BlockEnvToEnvironW ( void  )

Definition at line 86 of file environ.c.

87 {
88  wchar_t *ptr, *environment_strings;
89  wchar_t **envptr;
90  int count = 1;
91  size_t len;
92 
93  TRACE("BlockEnvToEnvironW()\n");
94 
95  environment_strings = GetEnvironmentStringsW();
96  if (environment_strings == NULL) {
97  return -1;
98  }
99 
100  for (ptr = environment_strings; *ptr; ptr += len)
101  {
102  len = wcslen(ptr) + 1;
103  /* Skip drive letter settings. */
104  if (*ptr != '=')
105  count++;
106  }
107 
108  __winitenv = _wenviron = malloc(count * sizeof(wchar_t*));
109  if (_wenviron)
110  {
111  for (ptr = environment_strings, envptr = _wenviron; count > 1; ptr += len)
112  {
113  len = wcslen(ptr) + 1;
114  /* Skip drive letter settings. */
115  if (*ptr != '=')
116  {
117  if ((*envptr = malloc(len * sizeof(wchar_t))) == NULL)
118  {
119  for (envptr--; envptr >= _wenviron; envptr--)
120  free(*envptr);
121  FreeEnvironmentStringsW(environment_strings);
122  free(_wenviron);
124  return -1;
125  }
126  memcpy(*envptr++, ptr, len * sizeof(wchar_t));
127  count--;
128  }
129  }
130  /* Add terminating NULL entry. */
131  *envptr = NULL;
132  }
133 
134  FreeEnvironmentStringsW(environment_strings);
135  return _wenviron ? 0 : -1;
136 }
GLuint GLuint GLsizei count
Definition: gl.h:1545
#define free
Definition: debug_ros.c:5
static PVOID ptr
Definition: dispmode.c:27
smooth NULL
Definition: ftsmooth.c:416
wchar_t ** _wenviron
Definition: environ.c:23
#define TRACE(s)
Definition: solgame.cpp:4
BOOL WINAPI FreeEnvironmentStringsW(IN LPWSTR EnvironmentStrings)
Definition: environ.c:389
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
GLenum GLsizei len
Definition: glext.h:6722
LPWSTR WINAPI GetEnvironmentStringsW(VOID)
Definition: environ.c:344
wchar_t ** __winitenv
Definition: environ.c:25
#define malloc
Definition: debug_ros.c:4
size_t __cdecl wcslen(_In_z_ const wchar_t *_Str)

Referenced by DllMain().

◆ DllMain()

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

Definition at line 65 of file msvcrt20.c.

66 {
68  switch (dwReason)
69  {
70  case DLL_PROCESS_ATTACH:
71  /* initialize version info */
72  TRACE("Process Attach\n");
74  GetVersionExW( &osvi );
80 
81  /* create tls stuff */
82  if (!msvcrt_init_tls())
83  return FALSE;
84 
85  if (BlockEnvToEnvironA() < 0)
86  return FALSE;
87 
88  if (BlockEnvToEnvironW() < 0)
89  {
91  return FALSE;
92  }
93 
96 
97  /* Initialization of the WINE code */
99  //msvcrt_init_math();
100  msvcrt_init_io();
101  //msvcrt_init_console();
102  //msvcrt_init_args();
103  //msvcrt_init_signals();
104  TRACE("Attach done\n");
105  break;
106 
107  case DLL_THREAD_ATTACH:
108  //msvcrt_get_thread_data creates data when first called
109  break;
110 
111  case DLL_THREAD_DETACH:
113  break;
114 
115  case DLL_PROCESS_DETACH:
116  TRACE("Detach\n");
117  /* Deinit of the WINE code */
118  msvcrt_free_io();
119  if (reserved) break;
122  //msvcrt_free_console();
123  //msvcrt_free_args();
124  //msvcrt_free_signals();
126  if (!msvcrt_free_tls())
127  return FALSE;
128  if(global_locale)
130 
131  if (__winitenv && __winitenv != _wenviron)
132  FreeEnvironment((char**)__winitenv);
133  if (_wenviron)
134  FreeEnvironment((char**)_wenviron);
135 
136  if (__initenv && __initenv != _environ)
138  if (_environ)
140 
141  TRACE("Detach done\n");
142  break;
143  }
144 
145  return TRUE;
146 }
ULONG dwMajorVersion
Definition: rtltypes.h:238
void msvcrt_free_io(void)
Definition: file.c:1100
char ** __initenv
Definition: environ.c:24
OSVERSIONINFO osvi
Definition: ver.c:28
#define TRUE
Definition: types.h:120
#define DLL_THREAD_ATTACH
Definition: compat.h:132
void msvcrt_free_tls_mem(void)
Definition: tls.c:51
unsigned int _winminor
Definition: environ.c:12
#define DLL_PROCESS_ATTACH
Definition: compat.h:131
int BlockEnvToEnvironW(void)
Definition: environ.c:86
void msvcrt_init_io(void)
Definition: file.c:457
int BlockEnvToEnvironA(void)
Definition: environ.c:34
void FreeEnvironment(char **environment)
Definition: environ.c:190
BOOL WINAPI GetVersionExW(IN LPOSVERSIONINFOW lpVersionInformation)
Definition: version.c:37
#define _strdup
Definition: debug_ros.c:7
#define DLL_THREAD_DETACH
Definition: compat.h:133
char ** _environ
Definition: environ.c:22
void msvcrt_free_popen_data(void)
Definition: popen.c:29
BOOL msvcrt_free_tls(void)
Definition: tls.c:21
DWORD dwReason
Definition: misc.cpp:154
#define FALSE
Definition: types.h:117
LPWSTR WINAPI GetCommandLineW(VOID)
Definition: proc.c:2015
r reserved
Definition: btrfs.c:2940
ULONG dwOSVersionInfoSize
Definition: rtltypes.h:237
#define DLL_PROCESS_DETACH
Definition: compat.h:130
ULONG dwBuildNumber
Definition: rtltypes.h:240
void msvcrt_free_mt_locks(void)
Definition: lock.c:77
#define TRACE(s)
Definition: solgame.cpp:4
if(!(yy_init))
Definition: macro.lex.yy.c:714
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:2005
MSVCRT__locale_t global_locale
Definition: locale.c:1495
ULONG dwMinorVersion
Definition: rtltypes.h:239
wchar_t * _wcmdln
Definition: environ.c:19
wchar_t ** _wenviron
Definition: environ.c:23
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
void __cdecl MSVCRT__free_locale(MSVCRT__locale_t)
Definition: locale.c:711
_Check_return_ _CRTIMP wchar_t *__cdecl _wcsdup(_In_z_ const wchar_t *_Str)
wchar_t ** __winitenv
Definition: environ.c:25
void msvcrt_init_mt_locks(void)
Definition: lock.c:54

◆ 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
smooth NULL
Definition: ftsmooth.c:416

Referenced by DllMain().

◆ MSVCRT20__getmainargs()

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

Definition at line 155 of file msvcrt20.c.

157 {
158  __getmainargs( argc, argv, envp, expand_wildcards, &new_mode );
159 }
static int argc
Definition: ServiceArgs.c:12
#define argv
Definition: mplay32.c:18
void CDECL __getmainargs(int *argc, char ***argv, char ***envp, int expand_wildcards, int *new_mode)
Definition: getargs.c:182

◆ MSVCRT20__wgetmainargs()

void CDECL MSVCRT20__wgetmainargs ( int argc,
WCHAR ***  wargv,
WCHAR ***  wenvp,
int  expand_wildcards,
int  new_mode 
)

Definition at line 166 of file msvcrt20.c.

168 {
169  __wgetmainargs( argc, wargv, wenvp, expand_wildcards, &new_mode );
170 }
static int argc
Definition: ServiceArgs.c:12
void CDECL __wgetmainargs(int *argc, WCHAR ***wargv, WCHAR ***wenvp, int expand_wildcards, int *new_mode)

◆ WINE_DEFAULT_DEBUG_CHANNEL()

WINE_DEFAULT_DEBUG_CHANNEL ( msvcrt  )

Variable Documentation

◆ __initenv

char** __initenv

Definition at line 24 of file environ.c.

Referenced by DllMain().

◆ __winitenv

wchar_t** __winitenv

Definition at line 25 of file environ.c.

Referenced by DllMain().

◆ _acmdln

char* _acmdln

Definition at line 18 of file environ.c.

Referenced by DllMain().

◆ _environ

char** _environ

Definition at line 22 of file environ.c.

Referenced by DllMain().

◆ _osplatform

unsigned int _osplatform

Definition at line 10 of file environ.c.

Referenced by DllMain().

◆ _osver

unsigned int _osver

Definition at line 11 of file environ.c.

Referenced by DllMain().

◆ _wcmdln

wchar_t* _wcmdln

Definition at line 19 of file environ.c.

Referenced by DllMain().

◆ _wenviron

wchar_t** _wenviron

Definition at line 23 of file environ.c.

Referenced by DllMain().

◆ _winmajor

unsigned int _winmajor

Definition at line 13 of file environ.c.

Referenced by DllMain().

◆ _winminor

unsigned int _winminor

Definition at line 12 of file environ.c.

Referenced by DllMain().

◆ _winver

unsigned int _winver

Definition at line 14 of file environ.c.

Referenced by DllMain().