[PATCH] kernel32: Implement RaiseFailFastException
Nikolay Sivov
nsivov at codeweavers.com
Sun Dec 9 11:09:12 CST 2018
On 12/9/18 7:30 PM, André Hentschel wrote:
> 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.@)
> + */
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)
More information about the wine-devel
mailing list