https://git.reactos.org/?p=reactos.git;a=commitdiff;h=995e16d4d4e65e1d03a28eed7d6167b184d79e04

commit 995e16d4d4e65e1d03a28eed7d6167b184d79e04
Author:     Timo Kreuzer <timo.kreu...@reactos.org>
AuthorDate: Fri Oct 11 14:45:42 2024 +0300
Commit:     Timo Kreuzer <timo.kreu...@reactos.org>
CommitDate: Thu Jan 16 14:18:53 2025 +0200

    [UCRT] Add missing headers
    
    These are minimal definitions, just enough to make things compile.
---
 .../ucrt/inc/corecrt_internal_state_isolation.h    |  52 +++++
 sdk/lib/ucrt/inc/internal_shared.h                 | 236 +++++++++++++++++++++
 sdk/lib/ucrt/inc/nt.h                              |  13 ++
 sdk/lib/ucrt/inc/ntrtl.h                           |  15 ++
 sdk/lib/ucrt/inc/nturtl.h                          |  11 +
 5 files changed, 327 insertions(+)

diff --git a/sdk/lib/ucrt/inc/corecrt_internal_state_isolation.h 
b/sdk/lib/ucrt/inc/corecrt_internal_state_isolation.h
new file mode 100644
index 00000000000..341de26f6ff
--- /dev/null
+++ b/sdk/lib/ucrt/inc/corecrt_internal_state_isolation.h
@@ -0,0 +1,52 @@
+//
+// corecrt_internal_state_isolation.h
+//
+//      Copyright (c) 2024 Timo Kreuzer
+//
+// Header for CRT state management.
+//
+// SPDX-License-Identifier: MIT
+//
+
+#pragma once
+
+#ifdef __cplusplus
+extern "C++"
+{
+    namespace __crt_state_management
+    {
+        constexpr size_t state_index_count = 2;
+        struct scoped_global_state_reset
+        {
+            scoped_global_state_reset() throw() { }
+            ~scoped_global_state_reset() throw() { }
+        }; // FIXME: Implement this
+        template <typename T>
+        class dual_state_global
+        {
+            T _value[2];
+        public:
+            T& value(__crt_cached_ptd_host& ptd) throw();
+            T const& value(__crt_cached_ptd_host& ptd) const throw();
+            T& value(void) throw() { return _value[0]; }
+            T value_explicit(size_t index) throw() { return _value[index]; }
+            T* dangerous_get_state_array() throw() { return _value; }
+            void initialize(T) throw() { }
+            template<typename T2> void uninitialize(T2) throw() { }
+            template<typename T2, size_t N> void initialize_from_array(T2 
const (&values)[N]) throw() { }
+        };
+
+        inline int get_current_state_index(__crt_scoped_get_last_error_reset 
const &last_error_reset)
+        {
+            return 0;
+        }
+
+        inline int get_current_state_index(void)
+        {
+            return 0;
+        }
+    }
+}
+#endif // __cplusplus
+
+#define __acrt_select_exit_lock() __acrt_exit_lock
diff --git a/sdk/lib/ucrt/inc/internal_shared.h 
b/sdk/lib/ucrt/inc/internal_shared.h
new file mode 100644
index 00000000000..a5f50f0f681
--- /dev/null
+++ b/sdk/lib/ucrt/inc/internal_shared.h
@@ -0,0 +1,236 @@
+//
+// internal_shared.h
+//
+//      Copyright (c) 2024 Timo Kreuzer
+//
+// Header for definitions shared between vcruntime and UCRT.
+//
+// SPDX-License-Identifier: MIT
+//
+
+#pragma once
+
+#include <suppress.h>
+#include <intrin.h>
+#include <corecrt_startup.h>
+#include <crtdbg.h>
+#include <windows.h> // for HMODULE
+#include <malloc.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif // __cplusplus
+
+#if defined(_MSC_VER)
+#define _CRTALLOC(x) __declspec(allocate(x))
+#else
+#define _CRTALLOC(x) __attribute__((section(x)))
+#endif
+
+#pragma section(".CRT$XIC", long, read)
+#pragma section(".CRT$XPX", long, read)
+#pragma section(".CRT$XPXA", long, read)
+
+#pragma section(".CRT$XIA", long, read)
+#pragma section(".CRT$XIZ", long, read)
+#pragma section(".CRT$XCA", long, read)
+#pragma section(".CRT$XCZ", long, read)
+#pragma section(".CRT$XPA", long, read)
+#pragma section(".CRT$XPZ", long, read)
+#pragma section(".CRT$XTA", long, read)
+#pragma section(".CRT$XTZ", long, read)
+
+extern _PIFV __xi_a[];
+extern _PIFV __xi_z[];
+extern _PVFV __xc_a[];
+extern _PVFV __xc_z[];
+extern _PVFV __xp_a[];
+extern _PVFV __xp_z[];
+extern _PVFV __xt_a[];
+extern _PVFV __xt_z[];
+
+extern char __ImageBase;
+
+#define CRT_WARNING_DISABLE_PUSH(wn, message) \
+    __pragma(warning(push)) \
+    __pragma(warning(disable: wn))
+
+#define CRT_WARNING_POP \
+    __pragma(warning(pop))
+
+#define _BEGIN_SECURE_CRT_DEPRECATION_DISABLE \
+    __pragma(warning(push)) \
+    __pragma(warning(disable: 4996))
+
+#define _END_SECURE_CRT_DEPRECATION_DISABLE \
+    __pragma(warning(pop))
+
+#define _CRT_DEBUGGER_IGNORE -1
+#define _CRT_DEBUGGER_GSFAILURE 1
+#define _CRT_DEBUGGER_INVALIDPARAMETER 2
+#define _CRT_DEBUGGER_ABORT 3
+
+#define _CRT_DEBUGGER_HOOK(x)
+
+#define _CRT_SECURITYCRITICAL_ATTRIBUTE
+#define _CRT_SECURITYSAFECRITICAL_ATTRIBUTE
+
+#define _VALIDATE_RETURN(expr, errorcode, retexpr) \
+    if (!(expr)) return (retexpr);
+
+#define _VALIDATE_RETURN_VOID(expr, errorcode) \
+    if (!(expr)) return;
+
+#define _VALIDATE_RETURN_NOERRNO(expr, retexpr) \
+    if (!(expr)) return (retexpr);
+
+#define _VALIDATE_RETURN_ERRCODE(expr, errorcode) \
+    if (!(expr)) return (errorcode);
+
+#define _VALIDATE_CLEAR_OSSERR_RETURN(expr, errorcode, retexpr) \
+    if (!(expr)) return (retexpr);
+
+#define _VALIDATE_CLEAR_OSSERR_RETURN_ERRCODE(expr, errorcode) \
+    if (!(expr)) return (errorcode);
+
+#define _VALIDATE_RETURN_NOEXC(expr, errorcode, retexpr) \
+    if (!(expr)) return (retexpr);
+
+#define _VALIDATE_RETURN_ERRCODE_NOEXC(expr, errorcode) \
+    if (!(expr)) return (errorcode);
+
+#define _malloc_crt malloc
+#define _free_crt free
+#define _calloc_crt calloc
+#define _recalloc_crt _recalloc
+#define _malloca_crt _malloca
+#define _freea_crt _freea
+
+#ifdef __cplusplus
+} // extern "C"
+
+template<typename T>
+__forceinline
+T __crt_fast_encode_pointer(T Ptr)
+{
+    // FIXME: use cookie
+    return Ptr;
+}
+
+template<typename T>
+__forceinline
+T __crt_fast_decode_pointer(T Ptr)
+{
+    // FIXME: use cookie
+    return Ptr;
+}
+
+template<typename T>
+T __crt_interlocked_read(const T volatile* ptr)
+{
+    return *ptr;
+}
+
+template<typename T>
+T __crt_interlocked_read_pointer(const T volatile* ptr)
+{
+    return *ptr;
+}
+
+template<typename T>
+T __crt_interlocked_exchange_pointer(T *ptr, void* value)
+{
+    return (T)_InterlockedExchangePointer((void* volatile*)ptr, value);
+}
+
+template<typename T>
+struct __crt_seh_guarded_call
+{
+    template<typename Init, typename Action, typename Cleanup>
+    T operator()(Init init, Action action, Cleanup cleanup)
+    {
+        init();
+        __try
+        {
+            return action();
+        }
+        __finally
+        {
+            cleanup();
+        }
+    }
+};
+
+template<typename FuncPtr>
+FuncPtr __crt_get_proc_address(HMODULE module, const char* name)
+{
+    return (FuncPtr)GetProcAddress(module, name);
+}
+
+template<typename Action, typename Cleanup>
+void __crt_call_and_cleanup(Action action, Cleanup cleanup)
+{
+    action();
+    cleanup();
+}
+
+struct __crt_malloc_free_policy
+{
+    template<typename T>
+    void operator()(T* const ptr) throw()
+    {
+        _free_crt((void*)ptr);
+    }
+};
+
+struct __crt_public_free_policy
+{
+    template<typename T>
+    void operator()(T* const ptr) throw()
+    {
+        _free_crt((void*)ptr);
+    }
+};
+
+struct __crt_malloca_free_policy
+{
+    void operator()(void* const ptr) throw()
+    {
+        _freea_crt(ptr);
+    }
+};
+
+template <typename T, typename FreePolicy = __crt_malloc_free_policy>
+class __crt_unique_heap_ptr
+{
+    T* _ptr;
+public:
+    __crt_unique_heap_ptr() : _ptr(nullptr) {}
+    __crt_unique_heap_ptr(T* ptr) : _ptr(ptr) {}
+    __crt_unique_heap_ptr(__crt_unique_heap_ptr&& from) : _ptr(from._ptr) { 
from._ptr = nullptr; }
+     ~__crt_unique_heap_ptr() { FreePolicy()(_ptr); }
+    void attach(T* ptr) { FreePolicy()(_ptr); _ptr = ptr; }
+    T* detach() { T* ptr = _ptr; _ptr = nullptr; return ptr; }
+    operator bool() const { return _ptr != nullptr; }
+    T* get() const { return _ptr; }
+    T** get_address_of() { return &_ptr; }
+
+    // Move assignment
+    __crt_unique_heap_ptr& operator=(__crt_unique_heap_ptr&& from)
+    {
+        FreePolicy()(_ptr);
+        _ptr = from._ptr;
+        from._ptr = nullptr;
+        return *this;
+    }
+};
+
+template <typename T>
+using __crt_scoped_stack_ptr = __crt_unique_heap_ptr<T, 
__crt_malloca_free_policy>;
+
+#define _malloc_crt_t(t, n) 
(__crt_unique_heap_ptr<t>(static_cast<t*>(_malloc_crt((n) * sizeof(t)))))
+#define _calloc_crt_t(t, n) 
(__crt_unique_heap_ptr<t>(static_cast<t*>(_calloc_crt((n),  sizeof(t)))))
+#define _recalloc_crt_t(t, p, n) 
(__crt_unique_heap_ptr<t>(static_cast<t*>(_recalloc_crt(p, (n), sizeof(t)))))
+#define _malloca_crt_t(t, n) 
(__crt_scoped_stack_ptr<t>(static_cast<t*>(_malloca_crt((n) * sizeof(t)))))
+
+#endif // __cplusplus
diff --git a/sdk/lib/ucrt/inc/nt.h b/sdk/lib/ucrt/inc/nt.h
new file mode 100644
index 00000000000..5ec2c7d750e
--- /dev/null
+++ b/sdk/lib/ucrt/inc/nt.h
@@ -0,0 +1,13 @@
+//
+// nt.h
+//
+//      Copyright (c) 2024 Timo Kreuzer
+//
+// Header for generic NT things.
+//
+// SPDX-License-Identifier: MIT
+//
+
+#pragma once
+
+#include <ndk/pstypes.h>
diff --git a/sdk/lib/ucrt/inc/ntrtl.h b/sdk/lib/ucrt/inc/ntrtl.h
new file mode 100644
index 00000000000..cd0a293158d
--- /dev/null
+++ b/sdk/lib/ucrt/inc/ntrtl.h
@@ -0,0 +1,15 @@
+//
+// ntrtl.h
+//
+//      Copyright (c) 2024 Timo Kreuzer
+//
+// Header for RTL NT things.
+//
+// SPDX-License-Identifier: MIT
+//
+
+#pragma once
+
+#include <ndk/rtltypes.h>
+
+#define RTL_USER_PROC_SECURE_PROCESS 0x80000000
diff --git a/sdk/lib/ucrt/inc/nturtl.h b/sdk/lib/ucrt/inc/nturtl.h
new file mode 100644
index 00000000000..40406382e93
--- /dev/null
+++ b/sdk/lib/ucrt/inc/nturtl.h
@@ -0,0 +1,11 @@
+//
+// nturtl.h
+//
+//      Copyright (c) 2024 Timo Kreuzer
+//
+// Header for user mode RTL NT things.
+//
+// SPDX-License-Identifier: MIT
+//
+
+#pragma once

Reply via email to