Hans Leidekker : ntdll: Don't call NtClose directly in delete_view.

Alexandre Julliard julliard at winehq.org
Thu Apr 7 07:36:43 CDT 2011


Module: wine
Branch: stable
Commit: 0a4cf6d28ba2fb8ea37f9b44eddd745f582a5365
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=0a4cf6d28ba2fb8ea37f9b44eddd745f582a5365

Author: Hans Leidekker <hans at 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 );
 }
 




More information about the wine-cvs mailing list