wine-staging/patches/ntdll-NtContinue/0002-Use-NtContinue-to-continue-execution-after-exception.patch

83 lines
2.9 KiB
Diff

From d2dd24b9d13e1115822022b55e5f48cd5744ead3 Mon Sep 17 00:00:00 2001
From: Andrew Wesie <awesie@gmail.com>
Date: Fri, 27 Jul 2018 01:26:56 -0500
Subject: [PATCH] ntdll: Use NtContinue to continue execution after exceptions.
NtContinue is exported by ntdll and some programs expect it to be used to
restore the thread context after an exception handler returns
EXCEPTION_CONTINUE_EXECUTION. It must take a context as its first argument
and restore that context.
Current implementation is a simple wrapper around NtSetContextThread. It is
unlikely that it has the correct behavior if called by an external caller.
The __syscall_NtContinue wrapper is used so that it can be hooked by a
third-party.
---
dlls/ntdll/exception.c | 5 +++--
dlls/ntdll/signal_i386.c | 3 ++-
dlls/ntdll/signal_x86_64.c | 3 ++-
3 files changed, 7 insertions(+), 4 deletions(-)
diff --git a/dlls/ntdll/exception.c b/dlls/ntdll/exception.c
index 3b85f1efa0..bc972254f1 100644
--- a/dlls/ntdll/exception.c
+++ b/dlls/ntdll/exception.c
@@ -671,8 +671,9 @@ PRUNTIME_FUNCTION WINAPI RtlLookupFunctionEntry( ULONG_PTR pc, ULONG_PTR *base,
*/
NTSTATUS WINAPI NtContinue( CONTEXT *context, BOOLEAN alert )
{
- FIXME( "(%p, %d) stub!\n", context, alert );
- return STATUS_NOT_IMPLEMENTED;
+ TRACE( "(%p, %d) stub!\n", context, alert );
+
+ return NtSetContextThread( GetCurrentThread(), context );
}
/*************************************************************
diff --git a/dlls/ntdll/signal_i386.c b/dlls/ntdll/signal_i386.c
index e551646301..8fc885ed49 100644
--- a/dlls/ntdll/signal_i386.c
+++ b/dlls/ntdll/signal_i386.c
@@ -730,6 +730,7 @@ static NTSTATUS call_stack_handlers( EXCEPTION_RECORD *rec, CONTEXT *context )
return STATUS_UNHANDLED_EXCEPTION;
}
+NTSTATUS WINAPI __syscall_NtContinue( CONTEXT *context, BOOLEAN alert );
/*******************************************************************
* raise_exception
@@ -794,7 +795,7 @@ static NTSTATUS raise_exception( EXCEPTION_RECORD *rec, CONTEXT *context, BOOL f
NtTerminateProcess( NtCurrentProcess(), rec->ExceptionCode );
}
done:
- return NtSetContextThread( GetCurrentThread(), context );
+ return __syscall_NtContinue( context, FALSE );
}
diff --git a/dlls/ntdll/signal_x86_64.c b/dlls/ntdll/signal_x86_64.c
index e48529d73a..bf0ae2a98b 100644
--- a/dlls/ntdll/signal_x86_64.c
+++ b/dlls/ntdll/signal_x86_64.c
@@ -2520,6 +2520,7 @@ static NTSTATUS call_stack_handlers( EXCEPTION_RECORD *rec, CONTEXT *orig_contex
return STATUS_UNHANDLED_EXCEPTION;
}
+NTSTATUS WINAPI __syscall_NtContinue( CONTEXT *context, BOOLEAN alert );
static NTSTATUS raise_exception( EXCEPTION_RECORD *rec, CONTEXT *context, BOOL first_chance )
{
@@ -2582,7 +2583,7 @@ static NTSTATUS raise_exception( EXCEPTION_RECORD *rec, CONTEXT *context, BOOL f
}
done:
- return NtSetContextThread( GetCurrentThread(), context );
+ return __syscall_NtContinue( GetCurrentThread(), context );
}
--
2.23.0