[PATCH] ntdll: Catch EXCEPTION_INVALID_HANDLE in NtClose.
Rémi Bernon
rbernon at codeweavers.com
Wed Aug 5 08:40:01 CDT 2020
That was dropped in 4752e252ea6ee084b679a9b9551a1c55f8744451 and it
causes Metal Gear Solid V: Ground Zeroes to crash on start. The game
debugs itself and closes an invalid handle as an anti-debug check.
Signed-off-by: Rémi Bernon <rbernon at codeweavers.com>
---
I'm not sure why the try catch was removed, and maybe there's a better
fix to it?
dlls/ntdll/unix/server.c | 17 +++++++++++++++--
1 file changed, 15 insertions(+), 2 deletions(-)
diff --git a/dlls/ntdll/unix/server.c b/dlls/ntdll/unix/server.c
index 4d7962fddc7..e45accf4f2b 100644
--- a/dlls/ntdll/unix/server.c
+++ b/dlls/ntdll/unix/server.c
@@ -87,6 +87,7 @@
#include "winnt.h"
#include "wine/library.h"
#include "wine/server.h"
+#include "wine/exception.h"
#include "wine/debug.h"
#include "unix_private.h"
#include "ddk/wdm.h"
@@ -1634,6 +1635,11 @@ NTSTATUS WINAPI NtDuplicateObject( HANDLE source_process, HANDLE source, HANDLE
return ret;
}
+static LONG WINAPI invalid_handle_exception_handler( EXCEPTION_POINTERS *eptr )
+{
+ EXCEPTION_RECORD *rec = eptr->ExceptionRecord;
+ return (rec->ExceptionCode == EXCEPTION_INVALID_HANDLE) ? EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH;
+}
/**************************************************************************
* NtClose
@@ -1656,8 +1662,15 @@ NTSTATUS WINAPI NtClose( HANDLE handle )
if (!NtCurrentTeb()->Peb->BeingDebugged) return ret;
if (!NtQueryInformationProcess( NtCurrentProcess(), ProcessDebugPort, &port, sizeof(port), NULL) && port)
{
- NtCurrentTeb()->ExceptionCode = ret;
- pKiRaiseUserExceptionDispatcher();
+ __TRY
+ {
+ NtCurrentTeb()->ExceptionCode = ret;
+ pKiRaiseUserExceptionDispatcher();
+ }
+ __EXCEPT(invalid_handle_exception_handler)
+ {
+ }
+ __ENDTRY
}
return ret;
}
--
2.27.0
More information about the wine-devel
mailing list