[PATCH] kernel32: Implement RaiseFailFastException

André Hentschel nerv at dawncrow.de
Sun Dec 9 10:30:00 CST 2018


Signed-off-by: André Hentschel <nerv at dawncrow.de>
---
 dlls/kernel32/except.c      | 35 +++++++++++++++++++++++++++++++++++
 dlls/kernel32/kernel32.spec |  2 +-
 include/ntstatus.h          |  1 +
 3 files changed, 37 insertions(+), 1 deletion(-)

diff --git a/dlls/kernel32/except.c b/dlls/kernel32/except.c
index c4f7fafabb6..ba195d92835 100644
--- a/dlls/kernel32/except.c
+++ b/dlls/kernel32/except.c
@@ -413,6 +413,41 @@ static inline BOOL check_resource_write( void *addr )
 }
 
 
+/*******************************************************************
+ *         UnhandledExceptionFilter   (KERNEL32.@)
+ */
+void WINAPI RaiseFailFastException(EXCEPTION_RECORD *record, CONTEXT *context, DWORD flags)
+{
+    EXCEPTION_RECORD rec;
+    CONTEXT ctx;
+
+    if (!context)
+    {
+        ctx.ContextFlags = CONTEXT_FULL;
+        NtGetContextThread(GetCurrentThread(), &ctx);
+        context = &ctx;
+    }
+
+    if (!record)
+    {
+        rec.ExceptionCode    = STATUS_FAIL_FAST_EXCEPTION;
+        rec.ExceptionFlags   = 0;
+        rec.ExceptionRecord  = NULL;
+        rec.ExceptionAddress = RaiseFailFastException;
+        rec.NumberParameters = 0;
+        record = &rec;
+    }
+
+    if (!NtCurrentTeb()->Peb->BeingDebugged)
+    {
+        EXCEPTION_POINTERS epointers;
+
+        epointers.ExceptionRecord = record;
+        epointers.ContextRecord = context;
+        start_debugger_atomic(&epointers);
+    }
+}
+
 /*******************************************************************
  *         UnhandledExceptionFilter   (KERNEL32.@)
  */
diff --git a/dlls/kernel32/kernel32.spec b/dlls/kernel32/kernel32.spec
index ae7bc886c51..31be1f59785 100644
--- a/dlls/kernel32/kernel32.spec
+++ b/dlls/kernel32/kernel32.spec
@@ -1182,7 +1182,7 @@
 @ stdcall QueueUserAPC(ptr long long)
 @ stdcall QueueUserWorkItem(ptr ptr long)
 @ stdcall RaiseException(long long long ptr)
-# @ stub RaiseFailFastException
+@ stdcall RaiseFailFastException(ptr ptr long)
 @ stdcall ReadConsoleA(long ptr long ptr ptr)
 @ stdcall ReadConsoleInputA(long ptr long ptr)
 @ stub ReadConsoleInputExA
diff --git a/include/ntstatus.h b/include/ntstatus.h
index 735b6c2c41c..d2f08af3283 100644
--- a/include/ntstatus.h
+++ b/include/ntstatus.h
@@ -939,6 +939,7 @@
 #define STATUS_INVALID_TASK_INDEX           ((NTSTATUS) 0xC0000501)
 #define STATUS_THREAD_ALREADY_IN_TASK       ((NTSTATUS) 0xC0000502)
 #define STATUS_CALLBACK_BYPASS              ((NTSTATUS) 0xC0000503)
+#define STATUS_FAIL_FAST_EXCEPTION          ((NTSTATUS) 0xC0000602)
 #define STATUS_PORT_CLOSED                  ((NTSTATUS) 0xC0000700)
 #define STATUS_MESSAGE_LOST                 ((NTSTATUS) 0xC0000701)
 #define STATUS_INVALID_MESSAGE              ((NTSTATUS) 0xC0000702)
-- 
2.17.1




More information about the wine-devel mailing list