From: André Hentschel Subject: [PATCH] kernel32: Implement RaiseFailFastException Message-Id: Date: Sun, 9 Dec 2018 17:30:00 +0100 Signed-off-by: André Hentschel --- 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