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