From: Nikolay Sivov Subject: Re: [PATCH] kernel32: Implement RaiseFailFastException Message-Id: <32838078-3c84-d9ee-b6b3-1b33471c0861@codeweavers.com> Date: Sun, 9 Dec 2018 20:09:12 +0300 In-Reply-To: References: On 12/9/18 7:30 PM, André Hentschel wrote: > 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.@) > + */ Copy-pasted header. > +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; > + } Have you tested if flags have any effect here, like documentation suggests? > + > + if (!NtCurrentTeb()->Peb->BeingDebugged) > + { > + EXCEPTION_POINTERS epointers; > + > + epointers.ExceptionRecord = record; > + epointers.ContextRecord = context; > + start_debugger_atomic(&epointers); > + } > +} Shouldn't it terminate if processes is not being debugged? > + > /******************************************************************* > * 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)