Alexandre Julliard : server: Use the correct process when looking for a mapped dll.

Alexandre Julliard julliard at winehq.org
Tue Oct 3 15:39:52 CDT 2017


Module: wine
Branch: master
Commit: c583953b95cddcb8d2712b9d2312681b9c371ab3
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=c583953b95cddcb8d2712b9d2312681b9c371ab3

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Tue Oct  3 11:59:20 2017 +0200

server: Use the correct process when looking for a mapped dll.

Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 server/debugger.c | 18 ++++++++++++++----
 server/file.h     |  4 ++--
 server/mapping.c  | 15 +++++----------
 3 files changed, 21 insertions(+), 16 deletions(-)

diff --git a/server/debugger.c b/server/debugger.c
index 37f1934..79b7e52 100644
--- a/server/debugger.c
+++ b/server/debugger.c
@@ -147,6 +147,7 @@ static int fill_create_process_event( struct debug_event *event, const void *arg
     struct process *process = thread->process;
     struct process_dll *exe_module = get_process_exe_module( process );
     const client_ptr_t *entry = arg;
+    struct file *file;
     obj_handle_t handle;
 
     /* documented: PROCESS_VM_READ | PROCESS_VM_WRITE */
@@ -170,8 +171,12 @@ static int fill_create_process_event( struct debug_event *event, const void *arg
     event->data.create_process.unicode    = 1;
 
     /* the doc says write access too, but this doesn't seem a good idea */
-    event->data.create_process.file = open_mapping_file( debugger, exe_module->base, GENERIC_READ,
-                                                         FILE_SHARE_READ | FILE_SHARE_WRITE );
+    if ((file = get_mapping_file( process, exe_module->base, GENERIC_READ,
+                                  FILE_SHARE_READ | FILE_SHARE_WRITE )))
+    {
+        event->data.create_process.file = alloc_handle( debugger, file, GENERIC_READ, 0 );
+        release_object( file );
+    }
     return 1;
 }
 
@@ -191,8 +196,10 @@ static int fill_exit_process_event( struct debug_event *event, const void *arg )
 
 static int fill_load_dll_event( struct debug_event *event, const void *arg )
 {
+    struct process *process = event->sender->process;
     struct process *debugger = event->debugger->process;
     const struct process_dll *dll = arg;
+    struct file *file;
 
     event->data.load_dll.handle     = 0;
     event->data.load_dll.base       = dll->base;
@@ -200,8 +207,11 @@ static int fill_load_dll_event( struct debug_event *event, const void *arg )
     event->data.load_dll.dbg_size   = dll->dbg_size;
     event->data.load_dll.name       = dll->name;
     event->data.load_dll.unicode    = 1;
-    event->data.load_dll.handle     = open_mapping_file( debugger, dll->base, GENERIC_READ,
-                                                         FILE_SHARE_READ | FILE_SHARE_WRITE );
+    if ((file = get_mapping_file( process, dll->base, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE )))
+    {
+        event->data.load_dll.handle = alloc_handle( debugger, file, GENERIC_READ, 0 );
+        release_object( file );
+    }
     return 1;
 }
 
diff --git a/server/file.h b/server/file.h
index 403da65..31946cc 100644
--- a/server/file.h
+++ b/server/file.h
@@ -149,8 +149,8 @@ extern mode_t sd_to_mode( const struct security_descriptor *sd, const SID *owner
 
 extern struct mapping *get_mapping_obj( struct process *process, obj_handle_t handle,
                                         unsigned int access );
-extern obj_handle_t open_mapping_file( struct process *process, client_ptr_t base,
-                                       unsigned int access, unsigned int sharing );
+extern struct file *get_mapping_file( struct process *process, client_ptr_t base,
+                                      unsigned int access, unsigned int sharing );
 extern void free_mapped_views( struct process *process );
 extern int get_page_size(void);
 
diff --git a/server/mapping.c b/server/mapping.c
index 0e4143f..096c15e 100644
--- a/server/mapping.c
+++ b/server/mapping.c
@@ -733,19 +733,14 @@ struct mapping *get_mapping_obj( struct process *process, obj_handle_t handle, u
     return (struct mapping *)get_handle_obj( process, handle, access, &mapping_ops );
 }
 
-/* open a new file handle to the file backing the mapping */
-obj_handle_t open_mapping_file( struct process *process, client_ptr_t base,
-                                unsigned int access, unsigned int sharing )
+/* open a new file for the file descriptor backing the mapping */
+struct file *get_mapping_file( struct process *process, client_ptr_t base,
+                               unsigned int access, unsigned int sharing )
 {
-    obj_handle_t handle;
     struct memory_view *view = find_mapped_view( process, base );
-    struct file *file;
 
-    if (!view || !view->fd) return 0;
-    if (!(file = create_file_for_fd_obj( view->fd, access, sharing ))) return 0;
-    handle = alloc_handle( process, file, access, 0 );
-    release_object( file );
-    return handle;
+    if (!view || !view->fd) return NULL;
+    return create_file_for_fd_obj( view->fd, access, sharing );
 }
 
 static void mapping_dump( struct object *obj, int verbose )




More information about the wine-cvs mailing list