ReactOS  0.4.15-dev-1171-gab82533
crtexe.c
Go to the documentation of this file.
1 
7 #undef CRTDLL
8 #ifndef _DLL
9 #define _DLL
10 #endif
11 
12 #define SPECIAL_CRTEXE
13 
14 #include <oscalls.h>
15 #include <internal.h>
16 #include <process.h>
17 #include <signal.h>
18 #include <math.h>
19 #include <stdlib.h>
20 #include <tchar.h>
21 #include <sect_attribs.h>
22 #include <locale.h>
23 #ifdef _MBCS
24 #include <mbstring.h>
25 #endif
26 
27 /* Special handling for ARM & ARM64, __winitenv & __initenv aren't present there. */
28 
29 #if !defined(__arm__) && !defined(__aarch64__)
30 
31 #ifndef __winitenv
32 extern wchar_t *** __MINGW_IMP_SYMBOL(__winitenv);
33 #define __winitenv (* __MINGW_IMP_SYMBOL(__winitenv))
34 #endif
35 
36 #ifndef __initenv
37 extern char *** __MINGW_IMP_SYMBOL(__initenv);
38 #define __initenv (* __MINGW_IMP_SYMBOL(__initenv))
39 #endif
40 
41 #endif
42 
43 /* Hack, for bug in ld. Will be removed soon. */
44 #if defined(__GNUC__)
45 #define __ImageBase __MINGW_LSYMBOL(_image_base__)
46 #endif
47 
48 /* This symbol is defined by ld. */
50 
51 extern void __cdecl _fpreset (void);
52 #define SPACECHAR _T(' ')
53 #define DQUOTECHAR _T('\"')
54 
55 extern int * __MINGW_IMP_SYMBOL(_fmode);
56 extern int * __MINGW_IMP_SYMBOL(_commode);
57 
58 #undef _fmode
59 extern int _fmode;
60 extern int * __MINGW_IMP_SYMBOL(_commode);
61 #define _commode (* __MINGW_IMP_SYMBOL(_commode))
62 extern int _dowildcard;
63 
64 extern _CRTIMP void __cdecl _initterm(_PVFV *, _PVFV *);
65 
66 static int __cdecl check_managed_app (void);
67 
68 extern _CRTALLOC(".CRT$XIA") _PIFV __xi_a[];
69 extern _CRTALLOC(".CRT$XIZ") _PIFV __xi_z[];
70 extern _CRTALLOC(".CRT$XCA") _PVFV __xc_a[];
71 extern _CRTALLOC(".CRT$XCZ") _PVFV __xc_z[];
72 
73 /* TLS initialization hook. */
75 
76 extern _PVFV *__onexitbegin;
77 extern _PVFV *__onexitend;
78 
79 extern int mingw_app_type;
80 
84 
85 static int argc;
86 extern void __main(void);
87 #ifdef WPRFLAG
88 static wchar_t **argv;
89 static wchar_t **envp;
90 #else
91 static char **argv;
92 static char **envp;
93 #endif
94 
95 static int argret;
96 static int mainret=0;
97 static int managedapp;
98 static int has_cctor = 0;
99 static _startupinfo startinfo;
101 
102 extern void _pei386_runtime_relocator (void);
103 long CALLBACK _gnu_exception_handler (EXCEPTION_POINTERS * exception_data);
104 #ifdef WPRFLAG
105 static void duplicate_ppstrings (int ac, wchar_t ***av);
106 #else
107 static void duplicate_ppstrings (int ac, char ***av);
108 #endif
109 
110 static int __cdecl pre_c_init (void);
111 static void __cdecl pre_cpp_init (void);
113 _CRTALLOC(".CRT$XIAA") _PIFV mingw_pcinit = pre_c_init;
115 
117 
118 static int __cdecl
119 pre_c_init (void)
120 {
121  managedapp = check_managed_app ();
122  if (mingw_app_type)
124  else
127 
130 
131 #ifdef WPRFLAG
132  _wsetargv();
133 #else
134  _setargv();
135 #endif
137  {
139  }
140 #ifndef __clang__ /* FIXME: CORE-14042 */
141  if (__globallocalestatus == -1)
142  {
143  }
144 #endif
145  return 0;
146 }
147 
148 static void __cdecl
150 {
151  startinfo.newmode = _newmode;
152 
153 #ifdef WPRFLAG
154  argret = __wgetmainargs(&argc,&argv,&envp,_dowildcard,&startinfo);
155 #else
156  argret = __getmainargs(&argc,&argv,&envp,_dowildcard,&startinfo);
157 #endif
158 }
159 
160 static int __cdecl __tmainCRTStartup (void);
161 
162 int __cdecl WinMainCRTStartup (void);
163 
165 {
166  int ret = 255;
167 #ifdef __SEH__
168  asm ("\t.l_startw:\n"
169  "\t.seh_handler __C_specific_handler, @except\n"
170  "\t.seh_handlerdata\n"
171  "\t.long 1\n"
172  "\t.rva .l_startw, .l_endw, _gnu_exception_handler ,.l_endw\n"
173  "\t.text"
174  );
175 #endif
176  mingw_app_type = 1;
178  ret = __tmainCRTStartup ();
179 #ifdef __SEH__
180  asm ("\tnop\n"
181  "\t.l_endw: nop\n");
182 #endif
183  return ret;
184 }
185 
186 int __cdecl mainCRTStartup (void);
187 
188 #ifdef _WIN64
189 int __mingw_init_ehandler (void);
190 #endif
191 
193 {
194  int ret = 255;
195 #ifdef __SEH__
196  asm ("\t.l_start:\n"
197  "\t.seh_handler __C_specific_handler, @except\n"
198  "\t.seh_handlerdata\n"
199  "\t.long 1\n"
200  "\t.rva .l_start, .l_end, _gnu_exception_handler ,.l_end\n"
201  "\t.text"
202  );
203 #endif
204  mingw_app_type = 0;
206  ret = __tmainCRTStartup ();
207 #ifdef __SEH__
208  asm ("\tnop\n"
209  "\t.l_end: nop\n");
210 #endif
211  return ret;
212 }
213 
214 static
216 int __cdecl
217 __tmainCRTStartup (void)
218 {
219  _TCHAR *lpszCommandLine = NULL;
220  STARTUPINFO StartupInfo;
221  WINBOOL inDoubleQuote = FALSE;
222  memset (&StartupInfo, 0, sizeof (STARTUPINFO));
223 
224 #ifndef _WIN64
225  /* We need to make sure that this function is build with frame-pointer
226  and that we align the stack to 16 bytes for the sake of SSE ops in main
227  or in functions inlined into main. */
228  lpszCommandLine = (_TCHAR *) alloca (32);
229  memset (lpszCommandLine, 0xcc, 32);
230 #ifdef __GNUC__
231  asm __volatile__ ("andl $-16, %%esp" : : : "%esp");
232 #endif
233 #endif
234 
235  if (mingw_app_type)
236  GetStartupInfo (&StartupInfo);
237  {
238  void *lock_free = NULL;
239  void *fiberid = ((PNT_TIB)NtCurrentTeb())->StackBase;
240  int nested = FALSE;
241  while((lock_free = InterlockedCompareExchangePointer ((volatile PVOID *) &__native_startup_lock,
242  fiberid, 0)) != 0)
243  {
244  if (lock_free == fiberid)
245  {
246  nested = TRUE;
247  break;
248  }
249  Sleep(1000);
250  }
252  {
253  _amsg_exit (31);
254  }
256  {
258  _initterm ((_PVFV *)(void *)__xi_a, (_PVFV *)(void *) __xi_z);
259  }
260  else
261  has_cctor = 1;
262 
264  {
265  _initterm (__xc_a, __xc_z);
267  }
269  if (! nested)
271 
274 
277 #ifdef _WIN64
279 #endif
281 
282  _fpreset ();
283 
284  if (mingw_app_type)
285  {
286 #ifdef WPRFLAG
287  lpszCommandLine = (_TCHAR *) _wcmdln;
288 #else
289  lpszCommandLine = (char *) _acmdln;
290 #endif
291  while (*lpszCommandLine > SPACECHAR || (*lpszCommandLine && inDoubleQuote))
292  {
293  if (*lpszCommandLine == DQUOTECHAR)
294  inDoubleQuote = !inDoubleQuote;
295 #ifdef _MBCS
296  if (_ismbblead (*lpszCommandLine))
297  {
298  if (lpszCommandLine) /* FIXME: Why this check? Should I check for *lpszCommandLine != 0 too? */
299  lpszCommandLine++;
300  }
301 #endif
302  ++lpszCommandLine;
303  }
304  while (*lpszCommandLine && (*lpszCommandLine <= SPACECHAR))
305  lpszCommandLine++;
306 
308  __mingw_winmain_lpCmdLine = lpszCommandLine;
310  StartupInfo.wShowWindow : SW_SHOWDEFAULT;
311  }
313  __main ();
314 #ifdef WPRFLAG
315 #if !defined(__arm__) && !defined(__aarch64__)
316  __winitenv = envp;
317 #endif
318  /* C++ initialization.
319  gcc inserts this call automatically for a function called main, but not for wmain. */
320  mainret = wmain (argc, argv, envp);
321 #else
322 #if !defined(__arm__) && !defined(__aarch64__)
323  __initenv = envp;
324 #endif
325  mainret = main (argc, argv, envp);
326 #endif
327  if (!managedapp)
328  exit (mainret);
329 
330  if (has_cctor == 0)
331  _cexit ();
332  }
333  return mainret;
334 }
335 
336 extern int mingw_initltsdrot_force;
337 extern int mingw_initltsdyn_force;
338 extern int mingw_initltssuo_force;
339 extern int mingw_initcharmax;
340 
341 static int __cdecl
343 {
344  PIMAGE_DOS_HEADER pDOSHeader;
345  PIMAGE_NT_HEADERS pPEHeader;
346  PIMAGE_OPTIONAL_HEADER32 pNTHeader32;
347  PIMAGE_OPTIONAL_HEADER64 pNTHeader64;
348 
349  /* Force to be linked. */
354 
355  pDOSHeader = (PIMAGE_DOS_HEADER) &__ImageBase;
356  if (pDOSHeader->e_magic != IMAGE_DOS_SIGNATURE)
357  return 0;
358 
359  pPEHeader = (PIMAGE_NT_HEADERS)((char *)pDOSHeader + pDOSHeader->e_lfanew);
360  if (pPEHeader->Signature != IMAGE_NT_SIGNATURE)
361  return 0;
362 
363  pNTHeader32 = (PIMAGE_OPTIONAL_HEADER32) &pPEHeader->OptionalHeader;
364  switch (pNTHeader32->Magic)
365  {
368  return 0;
371  pNTHeader64 = (PIMAGE_OPTIONAL_HEADER64)pNTHeader32;
373  return 0;
375  }
376  return 0;
377 }
378 
379 #ifdef WPRFLAG
380 static size_t wbytelen(const wchar_t *p)
381 {
382  size_t ret = 1;
383  while (*p!=0) {
384  ret++,++p;
385  }
386  return ret*2;
387 }
388 static void duplicate_ppstrings (int ac, wchar_t ***av)
389 {
390  wchar_t **avl;
391  int i;
392  wchar_t **n = (wchar_t **) malloc (sizeof (wchar_t *) * (ac + 1));
393 
394  avl=*av;
395  for (i=0; i < ac; i++)
396  {
397  size_t l = wbytelen (avl[i]);
398  n[i] = (wchar_t *) malloc (l);
399  memcpy (n[i], avl[i], l);
400  }
401  n[i] = NULL;
402  *av = n;
403 }
404 #else
405 static void duplicate_ppstrings (int ac, char ***av)
406 {
407  char **avl;
408  int i;
409  char **n = (char **) malloc (sizeof (char *) * (ac + 1));
410 
411  avl=*av;
412  for (i=0; i < ac; i++)
413  {
414  size_t l = strlen (avl[i]) + 1;
415  n[i] = (char *) malloc (l);
416  memcpy (n[i], avl[i], l);
417  }
418  n[i] = NULL;
419  *av = n;
420 }
421 #endif
422 
423 #ifdef __MINGW_SHOW_INVALID_PARAMETER_EXCEPTION
424 #define __UNUSED_PARAM_1(x) x
425 #else
426 #define __UNUSED_PARAM_1 __UNUSED_PARAM
427 #endif
428 static void __cdecl
430  const wchar_t * __UNUSED_PARAM_1(function),
431  const wchar_t * __UNUSED_PARAM_1(file),
432  unsigned int __UNUSED_PARAM_1(line),
433  uintptr_t __UNUSED_PARAM(pReserved))
434 {
435 #ifdef __MINGW_SHOW_INVALID_PARAMETER_EXCEPTION
436  wprintf(L"Invalid parameter detected in function %s. File: %s Line: %u\n", function, file, line);
437  wprintf(L"Expression: %s\n", expression);
438 #endif
439 }
440 
442 
443 static void __cdecl
445 {
447 
448  fIPH = (void*)GetProcAddress (__mingw_get_msvcrt_handle(), "_set_invalid_parameter_handler");
449  if (fIPH)
451 }
#define __UNUSED_PARAM_1
Definition: crtexe.c:426
#define _commode
Definition: crtexe.c:61
int mingw_app_type
Definition: mingw_helpers.c:31
#define __initenv
Definition: crtexe.c:38
int __globallocalestatus
static int argc
Definition: ServiceArgs.c:12
#define SW_SHOWDEFAULT
Definition: winuser.h:774
int _MINGW_INSTALL_DEBUG_MATHERR
Definition: reactos.c:2
void(__cdecl * _PVFV)(void)
Definition: internal.h:33
VOID WINAPI DECLSPEC_HOTPATCH Sleep(IN DWORD dwMilliseconds)
Definition: synch.c:790
static void duplicate_ppstrings(int ac, char ***av)
Definition: crtexe.c:405
IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES]
Definition: ntddk_ex.h:178
void __main(void)
Definition: gccmain.c:53
void _pei386_runtime_relocator(void)
Definition: mscmain.c:23
int wmain(int argc, WCHAR **argv)
Definition: at.c:753
#define __cdecl
Definition: accygwin.h:79
void __cdecl _fpreset(void)
Definition: fpreset.c:13
#define SPACECHAR
Definition: crtexe.c:52
void *__cdecl _encode_pointer(void *)
Definition: mingw_helpers.c:25
int mingw_initltssuo_force
ACPI_SIZE strlen(const char *String)
Definition: utclib.c:269
#define TRUE
Definition: types.h:120
#define DLL_THREAD_ATTACH
Definition: compat.h:132
#define _CRTIMP
Definition: crtdefs.h:60
int main(int argc, char *argv[])
Definition: atactl.cpp:1685
#define IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR
Definition: ntimage.h:489
void CDECL __setusermatherr(MSVCRT_matherr_func func)
Definition: matherr.c:45
#define __UNUSED_PARAM(x)
Definition: _mingw.h:74
#define CALLBACK
Definition: compat.h:35
GLdouble n
Definition: glext.h:7729
#define IMAGE_NT_OPTIONAL_HDR32_MAGIC
Definition: ntimage.h:376
_PVFV * __onexitbegin
Definition: atonexit.c:24
volatile __enative_startup_state __native_startup_state
Definition: natstart.c:13
_CRTIMP void __cdecl _initterm(_PVFV *, _PVFV *)
Definition: initterm.c:10
DWORD dwFlags
Definition: winbase.h:820
long CALLBACK _gnu_exception_handler(EXCEPTION_POINTERS *exception_data)
Definition: crt_handler.c:196
static void __cdecl __mingw_prepare_except_for_msvcr80_and_higher(void)
Definition: crtexe.c:444
#define wprintf(...)
Definition: whoami.c:18
static int __cdecl __tmainCRTStartup(void)
#define argv
Definition: mplay32.c:18
_CRTALLOC(".CRT$XIA")
Definition: crtexe.c:68
int __cdecl mainCRTStartup(void)
Definition: crtexe.c:192
void __cdecl __security_init_cookie(void)
Definition: gs_support.c:55
#define alloca
Definition: malloc.h:361
void __cdecl _amsg_exit(int errnum)
Definition: amsg.c:47
#define IMAGE_DOS_SIGNATURE
Definition: pedump.c:89
#define noinline
Definition: types.h:60
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
VOID(NTAPI * PIMAGE_TLS_CALLBACK)(PVOID DllHandle, ULONG Reason, PVOID Reserved)
Definition: ntimage.h:531
DWORD __mingw_winmain_nShowCmd
#define FALSE
Definition: types.h:117
LPTOP_LEVEL_EXCEPTION_FILTER WINAPI DECLSPEC_HOTPATCH SetUnhandledExceptionFilter(IN LPTOP_LEVEL_EXCEPTION_FILTER lpTopLevelExceptionFilter)
Definition: except.c:792
__analysis_noreturn _CRTIMP void __cdecl _cexit(void)
Definition: _exit.c:7
LPTOP_LEVEL_EXCEPTION_FILTER __mingw_oldexcpt_handler
Definition: crt_handler.c:188
#define InterlockedCompareExchangePointer
Definition: interlocked.h:129
int mingw_initcharmax
unsigned int uintptr_t
Definition: crtdefs.h:300
HANDLE __mingw_get_msvcrt_handle(void)
Definition: pesect.c:236
_PVFV * __onexitend
Definition: atonexit.c:25
int __CRTDECL _setargv(void)
Definition: dllargv.c:18
smooth NULL
Definition: ftsmooth.c:416
struct _IMAGE_DOS_HEADER * PIMAGE_DOS_HEADER
Definition: parser.c:48
#define _ASSERTE(expr)
Definition: crtdbg.h:124
switch(r->id)
Definition: btrfs.c:2980
#define STARTF_USESHOWWINDOW
Definition: winbase.h:472
char _TCHAR
Definition: tchar.h:1392
r l[0]
Definition: byte_order.h:167
#define IMAGE_NT_SIGNATURE
Definition: pedump.c:93
_CRTIMP void __cdecl __set_app_type(int)
Definition: environ.c:360
#define InterlockedExchangePointer(Target, Value)
Definition: dshow.h:45
int32_t WINBOOL
Definition: typedefs.h:58
void __getmainargs(int *argc, char ***argv, char ***envp, int expand_wildcards, int *new_mode)
Definition: getargs.c:182
static void __cdecl __mingw_invalidParameterHandler(const wchar_t *__UNUSED_PARAM_1(expression), const wchar_t *__UNUSED_PARAM_1(function), const wchar_t *__UNUSED_PARAM_1(file), unsigned int __UNUSED_PARAM_1(line), uintptr_t __UNUSED_PARAM(pReserved))
Definition: crtexe.c:429
struct _NT_TIB * PNT_TIB
unsigned long DWORD
Definition: ntddk_ex.h:95
#define mingw_pcppinit
Definition: wcrtexe.c:13
HINSTANCE __mingw_winmain_hInstance
int _newmode
Definition: _newmode.c:7
#define IMAGE_NT_OPTIONAL_HDR64_MAGIC
Definition: ntimage.h:377
IMAGE_DOS_HEADER __ImageBase
Definition: mstscax.cpp:17
static int __cdecl check_managed_app(void)
Definition: crtexe.c:342
HANDLE HINSTANCE
Definition: typedefs.h:77
static __declspec(noinline)
Definition: crtexe.c:215
int ret
static const WCHAR L[]
Definition: oid.c:1250
#define VOID
Definition: acefi.h:82
struct _IMAGE_OPTIONAL_HEADER * PIMAGE_OPTIONAL_HEADER32
wchar_t *** __MINGW_IMP_SYMBOL(__winitenv)
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
void CDECL __wgetmainargs(int *argc, WCHAR ***wargv, WCHAR ***wenvp, int expand_wildcards, int *new_mode)
PTOP_LEVEL_EXCEPTION_FILTER LPTOP_LEVEL_EXCEPTION_FILTER
Definition: winbase.h:1419
IMAGE_OPTIONAL_HEADER32 OptionalHeader
Definition: ntddk_ex.h:184
#define mingw_pcinit
Definition: wcrtexe.c:12
int _fmode
Definition: txtmode.c:13
int mingw_initltsdyn_force
const PIMAGE_TLS_CALLBACK __dyn_tls_init_callback
Definition: tlssup.c:117
#define _acmdln
Definition: internal.h:134
LPSTR __mingw_winmain_lpCmdLine
int __CRTDECL _matherr(_Inout_ struct _exception *exception)
FORCEINLINE struct _TEB * NtCurrentTeb(VOID)
Definition: psfuncs.h:420
#define __winitenv
Definition: crtexe.c:33
int(__cdecl * _PIFV)(void)
Definition: internal.h:34
WORD wShowWindow
Definition: winbase.h:821
#define _CONSOLE_APP
Definition: internal.h:164
IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES]
Definition: ntimage.h:370
int __cdecl _ismbblead(unsigned int)
Definition: ismblead.c:20
int __CRTDECL _wsetargv(void)
int mingw_initltsdrot_force
#define _wcmdln
Definition: internal.h:140
int _dowildcard
Definition: wildcard.c:32
struct _IMAGE_OPTIONAL_HEADER64 * PIMAGE_OPTIONAL_HEADER64
#define const
Definition: zconf.h:230
#define _GUI_APP
Definition: internal.h:165
#define DQUOTECHAR
Definition: crtexe.c:53
void(__cdecl * _invalid_parameter_handler)(const wchar_t *, const wchar_t *, const wchar_t *, unsigned int, uintptr_t)
Definition: stdlib.h:137
#define GetProcAddress(x, y)
Definition: compat.h:501
#define malloc
Definition: debug_ros.c:4
#define GetStartupInfo
Definition: winbase.h:3681
void exit(int exitcode)
Definition: _exit.c:33
GLfloat GLfloat p
Definition: glext.h:8902
#define memset(x, y, z)
Definition: compat.h:39
int __mingw_init_ehandler(void)
Definition: mscmain.c:27
int __cdecl WinMainCRTStartup(void)
Definition: crtexe.c:164
volatile void * __native_startup_lock
Definition: natstart.c:14
static void __cdecl pre_cpp_init(void)
Definition: crtexe.c:149
PIMAGE_NT_HEADERS32 PIMAGE_NT_HEADERS
Definition: ntddk_ex.h:187
Definition: fci.c:126