[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