reactos/sdk/lib/vcruntime/commonCRTStartup.hpp

90 lines
1.6 KiB
C++
Raw Normal View History

//
// commonCRTStartup.c
//
// Copyright (c) 2024 Timo Kreuzer
//
// Implementation of common executable startup code.
//
// SPDX-License-Identifier: MIT
//
#include <corecrt_startup.h>
#include <internal_shared.h>
#include <excpt.h>
#include <stdlib.h>
#include <intrin.h>
#include <pseh/pseh2.h>
// Defined in winnt.h
#define FAST_FAIL_FATAL_APP_EXIT 7
extern "C" int __cdecl main(int, char**, char**);
extern "C" int __cdecl wmain(int, wchar_t**, wchar_t**);
template<typename Tmain>
static int call_main();
template<>
int call_main<decltype(main)>()
{
_configure_narrow_argv(_crt_argv_unexpanded_arguments);
return main(*__p___argc(), *__p___argv(), _get_initial_narrow_environment());
}
template<>
int call_main<decltype(wmain)>()
{
_configure_wide_argv(_crt_argv_unexpanded_arguments);
return wmain(*__p___argc(), *__p___wargv(), _get_initial_wide_environment());
}
static bool __scrt_initialize()
{
__isa_available_init();
if (!__vcrt_initialize())
{
return false;
}
if (!__acrt_initialize())
{
__vcrt_uninitialize(false);
return false;
}
if (_initterm_e(__xi_a, __xi_z) != 0)
{
return false;
}
_initterm(__xc_a, __xc_z);
return true;
}
template<typename Tmain>
static __declspec(noinline) int __cdecl __commonCRTStartup()
{
int exitCode;
if (!__scrt_initialize())
{
__fastfail(FAST_FAIL_FATAL_APP_EXIT);
}
__try
{
exitCode = call_main<Tmain>();
}
__except(EXCEPTION_EXECUTE_HANDLER)
{
exitCode = GetExceptionCode();
}
__endtry
exit(exitCode);
}