https://git.reactos.org/?p=reactos.git;a=commitdiff;h=a978879ddb43ada0d6978…
commit a978879ddb43ada0d697892b68f9a2a7a34ca713
Author: Timo Kreuzer <timo.kreuzer(a)reactos.org>
AuthorDate: Tue Jan 28 21:56:12 2025 +0200
Commit: Timo Kreuzer <timo.kreuzer(a)reactos.org>
CommitDate: Thu Feb 6 09:17:37 2025 +0200
[VCSTARTUP] Implement (w)mainCRTStartup
__acrt_initialize is here as a stub to later support linking ucrt statically. When it
is statically linked the real function should be called, but when the executable links to
ucrtdll, the initialization happens when the DLL is loaded, so we call a stub here.
---
sdk/lib/vcruntime/CMakeLists.txt | 3 +
sdk/lib/vcruntime/__acrt_initialize_stub.cpp | 8 +++
sdk/lib/vcruntime/commonCRTStartup.hpp | 89 ++++++++++++++++++++++++++++
sdk/lib/vcruntime/mainCRTStartup.cpp | 18 ++++++
sdk/lib/vcruntime/wmainCRTStartup.cpp | 18 ++++++
5 files changed, 136 insertions(+)
diff --git a/sdk/lib/vcruntime/CMakeLists.txt b/sdk/lib/vcruntime/CMakeLists.txt
index b534b1b620d..21630765497 100644
--- a/sdk/lib/vcruntime/CMakeLists.txt
+++ b/sdk/lib/vcruntime/CMakeLists.txt
@@ -31,7 +31,10 @@ list(APPEND VCRT_RUNTIME_SOURCES
)
list(APPEND VCRT_STARTUP_SOURCES
+ __acrt_initialize_stub.cpp
__scrt_uninitialize_crt.cpp
+ mainCRTStartup.cpp
+ wmainCRTStartup.cpp
)
if(${ARCH} STREQUAL "i386")
diff --git a/sdk/lib/vcruntime/__acrt_initialize_stub.cpp
b/sdk/lib/vcruntime/__acrt_initialize_stub.cpp
new file mode 100644
index 00000000000..cbf566e9756
--- /dev/null
+++ b/sdk/lib/vcruntime/__acrt_initialize_stub.cpp
@@ -0,0 +1,8 @@
+
+#include <internal_shared.h>
+
+extern "C"
+__crt_bool __cdecl __acrt_initialize()
+{
+ return true;
+}
diff --git a/sdk/lib/vcruntime/commonCRTStartup.hpp
b/sdk/lib/vcruntime/commonCRTStartup.hpp
new file mode 100644
index 00000000000..5bb560dcfa8
--- /dev/null
+++ b/sdk/lib/vcruntime/commonCRTStartup.hpp
@@ -0,0 +1,89 @@
+//
+// 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);
+}
diff --git a/sdk/lib/vcruntime/mainCRTStartup.cpp b/sdk/lib/vcruntime/mainCRTStartup.cpp
new file mode 100644
index 00000000000..8fada5e065f
--- /dev/null
+++ b/sdk/lib/vcruntime/mainCRTStartup.cpp
@@ -0,0 +1,18 @@
+//
+// mainCRTStartup.c
+//
+// Copyright (c) 2024 Timo Kreuzer
+//
+// Implementation of ANSI executable entry point.
+//
+// SPDX-License-Identifier: MIT
+//
+
+#include "commonCRTStartup.hpp"
+
+extern "C" unsigned long mainCRTStartup(void*)
+{
+ __security_init_cookie();
+
+ return __commonCRTStartup<decltype(main)>();
+}
diff --git a/sdk/lib/vcruntime/wmainCRTStartup.cpp
b/sdk/lib/vcruntime/wmainCRTStartup.cpp
new file mode 100644
index 00000000000..364cff2a0d4
--- /dev/null
+++ b/sdk/lib/vcruntime/wmainCRTStartup.cpp
@@ -0,0 +1,18 @@
+//
+// wmainCRTStartup.c
+//
+// Copyright (c) 2024 Timo Kreuzer
+//
+// Implementation of unicode executable entry point.
+//
+// SPDX-License-Identifier: MIT
+//
+
+#include "commonCRTStartup.hpp"
+
+extern "C" unsigned long wmainCRTStartup(void*)
+{
+ __security_init_cookie();
+
+ return __commonCRTStartup<decltype(wmain)>();
+}