Git conversion: Make reactos the root directory, move rosapps, rostests, wallpapers...
[reactos.git] / sdk / lib / crt / startup / gs_support.c
diff --git a/sdk/lib/crt/startup/gs_support.c b/sdk/lib/crt/startup/gs_support.c
new file mode 100644 (file)
index 0000000..efdfad4
--- /dev/null
@@ -0,0 +1,151 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the w64 mingw-runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+
+#ifndef WIN32_LEAN_AND_MEAN
+#define WIN32_LEAN_AND_MEAN
+#endif
+#define WIN32_NO_STATUS
+#include <stdlib.h>    /* abort () */
+//#include <windows.h>
+#include <stdarg.h>
+#include <windef.h>
+#include <winbase.h>
+#undef  WIN32_NO_STATUS
+#include <ntstatus.h>  /* STATUS macros */
+#ifdef _WIN64
+#include <intrin.h>
+#endif
+
+#ifdef _WIN64
+#define DEFAULT_SECURITY_COOKIE 0x00002B992DDFA232ll
+#else
+#define DEFAULT_SECURITY_COOKIE 0xBB40E64E
+#endif
+
+/* Externals.  */
+
+typedef LONG NTSTATUS; /* same as in ntdef.h / winternl.h */
+
+#define UNW_FLAG_NHANDLER 0x00
+
+typedef union
+{
+  unsigned __int64 ft_scalar;
+  FILETIME ft_struct;
+} FT;
+
+static EXCEPTION_RECORD GS_ExceptionRecord;
+static CONTEXT GS_ContextRecord;
+
+static const EXCEPTION_POINTERS GS_ExceptionPointers = {
+  &GS_ExceptionRecord,&GS_ContextRecord
+};
+
+DECLSPEC_SELECTANY UINT_PTR __security_cookie = DEFAULT_SECURITY_COOKIE;
+DECLSPEC_SELECTANY UINT_PTR __security_cookie_complement = ~(DEFAULT_SECURITY_COOKIE);
+
+void __cdecl __security_init_cookie (void);
+
+void __cdecl
+__security_init_cookie (void)
+{
+  UINT_PTR cookie;
+  FT systime = { 0, };
+  LARGE_INTEGER perfctr;
+
+  if (__security_cookie != DEFAULT_SECURITY_COOKIE)
+    {
+      __security_cookie_complement = ~__security_cookie;
+      return;
+    }
+
+  GetSystemTimeAsFileTime (&systime.ft_struct);
+#ifdef _WIN64
+  cookie = systime.ft_scalar;
+#else
+  cookie = systime.ft_struct.dwLowDateTime;
+  cookie ^= systime.ft_struct.dwHighDateTime;
+#endif
+
+  cookie ^= GetCurrentProcessId ();
+  cookie ^= GetCurrentThreadId ();
+  cookie ^= GetTickCount ();
+
+  QueryPerformanceCounter (&perfctr);
+#ifdef _WIN64
+  cookie ^= perfctr.QuadPart;
+#else
+  cookie ^= perfctr.LowPart;
+  cookie ^= perfctr.HighPart;
+#endif
+
+#ifdef _WIN64
+  cookie &= 0x0000ffffffffffffll;
+#endif
+
+  if (cookie == DEFAULT_SECURITY_COOKIE)
+    cookie = DEFAULT_SECURITY_COOKIE + 1;
+  __security_cookie = cookie;
+  __security_cookie_complement = ~cookie;
+}
+
+
+#if defined(__GNUC__) /* wrap msvc intrinsics onto gcc builtins */
+#undef  _ReturnAddress
+#undef  _AddressOfReturnAddress
+#define _ReturnAddress()               __builtin_return_address(0)
+#define _AddressOfReturnAddress()      __builtin_frame_address (0)
+#endif /* __GNUC__ */
+
+__declspec(noreturn) void __cdecl __report_gsfailure (ULONG_PTR);
+
+#ifndef _MSC_VER
+__declspec(noreturn) void __cdecl
+__report_gsfailure (ULONG_PTR StackCookie)
+{
+  volatile UINT_PTR cookie[2] __MINGW_ATTRIB_UNUSED;
+#ifdef _WIN64
+  ULONG64 controlPC, imgBase, establisherFrame;
+  PRUNTIME_FUNCTION fctEntry;
+  PVOID hndData;
+
+  RtlCaptureContext (&GS_ContextRecord);
+  controlPC = GS_ContextRecord.Rip;
+  fctEntry = RtlLookupFunctionEntry (controlPC, &imgBase, NULL);
+  if (fctEntry != NULL)
+    {
+      RtlVirtualUnwind (UNW_FLAG_NHANDLER, imgBase, controlPC, fctEntry,
+                       &GS_ContextRecord, &hndData, &establisherFrame, NULL);
+    }
+  else
+#endif /* _WIN64 */
+    {
+#ifdef _WIN64
+      GS_ContextRecord.Rip = (ULONGLONG) _ReturnAddress();
+      GS_ContextRecord.Rsp = (ULONGLONG) _AddressOfReturnAddress() + 8;
+#else
+      GS_ContextRecord.Eip = (DWORD) _ReturnAddress();
+      GS_ContextRecord.Esp = (DWORD) _AddressOfReturnAddress() + 4;
+#endif /* _WIN64 */
+    }
+
+#ifdef _WIN64
+  GS_ExceptionRecord.ExceptionAddress = (PVOID) GS_ContextRecord.Rip;
+  GS_ContextRecord.Rcx = StackCookie;
+#else
+  GS_ExceptionRecord.ExceptionAddress = (PVOID) GS_ContextRecord.Eip;
+  GS_ContextRecord.Ecx = StackCookie;
+#endif /* _WIN64 */
+  GS_ExceptionRecord.ExceptionCode = STATUS_STACK_BUFFER_OVERRUN;
+  GS_ExceptionRecord.ExceptionFlags = EXCEPTION_NONCONTINUABLE;
+  cookie[0] = __security_cookie;
+  cookie[1] = __security_cookie_complement;
+  SetUnhandledExceptionFilter (NULL);
+  UnhandledExceptionFilter ((EXCEPTION_POINTERS *) &GS_ExceptionPointers);
+  TerminateProcess (GetCurrentProcess (), STATUS_STACK_BUFFER_OVERRUN);
+  abort();
+}
+#endif /* !_MSC_VER */