Module: wine Branch: stable Commit: 0a4cf6d28ba2fb8ea37f9b44eddd745f582a5365 URL: http://source.winehq.org/git/wine.git/?a=commit;h=0a4cf6d28ba2fb8ea37f9b44ed...
Author: Hans Leidekker hans@codeweavers.com Date: Thu Dec 2 11:33:03 2010 +0100
ntdll: Don't call NtClose directly in delete_view. (cherry picked from commit 71beac32192d661849d5fff6e5265d2f32faf61d)
---
dlls/ntdll/ntdll_misc.h | 2 ++ dlls/ntdll/om.c | 28 +++++++++++++++++----------- dlls/ntdll/virtual.c | 2 +- 3 files changed, 20 insertions(+), 12 deletions(-)
diff --git a/dlls/ntdll/ntdll_misc.h b/dlls/ntdll/ntdll_misc.h index 212edf5..1a9c40e 100644 --- a/dlls/ntdll/ntdll_misc.h +++ b/dlls/ntdll/ntdll_misc.h @@ -39,6 +39,8 @@ struct drive_info ino_t ino; };
+extern NTSTATUS close_handle( HANDLE ); + /* exceptions */ extern void wait_suspend( CONTEXT *context ); extern NTSTATUS send_debug_event( EXCEPTION_RECORD *rec, int first_chance, CONTEXT *context ); diff --git a/dlls/ntdll/om.c b/dlls/ntdll/om.c index 0e64ddd..91f055e 100644 --- a/dlls/ntdll/om.c +++ b/dlls/ntdll/om.c @@ -346,6 +346,22 @@ NTSTATUS WINAPI NtDuplicateObject( HANDLE source_process, HANDLE source, return ret; }
+/* Everquest 2 / Pirates of the Burning Sea hooks NtClose, so we need a wrapper */ +NTSTATUS close_handle( HANDLE handle ) +{ + NTSTATUS ret; + int fd = server_remove_fd_from_cache( handle ); + + SERVER_START_REQ( close_handle ) + { + req->handle = wine_server_obj_handle( handle ); + ret = wine_server_call( req ); + } + SERVER_END_REQ; + if (fd != -1) close( fd ); + return ret; +} + /************************************************************************** * NtClose [NTDLL.@] * @@ -360,17 +376,7 @@ NTSTATUS WINAPI NtDuplicateObject( HANDLE source_process, HANDLE source, */ NTSTATUS WINAPI NtClose( HANDLE Handle ) { - NTSTATUS ret; - int fd = server_remove_fd_from_cache( Handle ); - - SERVER_START_REQ( close_handle ) - { - req->handle = wine_server_obj_handle( Handle ); - ret = wine_server_call( req ); - } - SERVER_END_REQ; - if (fd != -1) close( fd ); - return ret; + return close_handle( Handle ); }
/* diff --git a/dlls/ntdll/virtual.c b/dlls/ntdll/virtual.c index 92583c9..32b60a7 100644 --- a/dlls/ntdll/virtual.c +++ b/dlls/ntdll/virtual.c @@ -443,7 +443,7 @@ static void delete_view( struct file_view *view ) /* [in] View */ { if (!(view->protect & VPROT_SYSTEM)) unmap_area( view->base, view->size ); list_remove( &view->entry ); - if (view->mapping) NtClose( view->mapping ); + if (view->mapping) close_handle( view->mapping ); RtlFreeHeap( virtual_heap, 0, view ); }