Paul Gofman : server: Store PE image info in process structure.

Alexandre Julliard julliard at winehq.org
Sun Jan 2 15:29:03 CST 2022


Module: wine
Branch: master
Commit: 8eacd3e50792925cbd209f8a1940f3e96b725137
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=8eacd3e50792925cbd209f8a1940f3e96b725137

Author: Paul Gofman <pgofman at codeweavers.com>
Date:   Fri Dec 31 14:51:43 2021 +0300

server: Store PE image info in process structure.

Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=51829
Signed-off-by: Paul Gofman <pgofman at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/kernel32/tests/loader.c | 15 +++++++++++++++
 server/mapping.c             |  1 +
 server/process.c             | 13 ++-----------
 server/process.h             |  1 +
 4 files changed, 19 insertions(+), 11 deletions(-)

diff --git a/dlls/kernel32/tests/loader.c b/dlls/kernel32/tests/loader.c
index c5857174403..f990d632f73 100644
--- a/dlls/kernel32/tests/loader.c
+++ b/dlls/kernel32/tests/loader.c
@@ -1931,9 +1931,11 @@ static void test_section_access(void)
     char temp_path[MAX_PATH];
     char dll_name[MAX_PATH];
     SIZE_T size;
+    SECTION_IMAGE_INFORMATION image_info;
     MEMORY_BASIC_INFORMATION info;
     STARTUPINFOA sti;
     PROCESS_INFORMATION pi;
+    NTSTATUS status;
     DWORD ret;
 
     /* prevent displaying of the "Unable to load this DLL" message box */
@@ -2084,6 +2086,19 @@ static void test_section_access(void)
             ok(!memcmp(buf, section_data, section.SizeOfRawData), "wrong section data\n");
         }
 
+        status = NtQueryInformationProcess(pi.hProcess, ProcessImageInformation,
+                &image_info, sizeof(image_info), NULL );
+        ok(!status, "Got unexpected status %#x.\n", status);
+        ok(!(image_info.ImageCharacteristics & IMAGE_FILE_DLL),
+                "Got unexpected characteristics %#x.\n", nt_header.FileHeader.Characteristics);
+        status = NtUnmapViewOfSection(pi.hProcess, info.BaseAddress);
+        ok(!status, "Got unexpected status %#x.\n", status);
+        status = NtQueryInformationProcess(pi.hProcess, ProcessImageInformation,
+                &image_info, sizeof(image_info), NULL );
+        ok(!status, "Got unexpected status %#x.\n", status);
+        ok(!(image_info.ImageCharacteristics & IMAGE_FILE_DLL),
+                "Got unexpected characteristics %#x.\n", nt_header.FileHeader.Characteristics);
+
         SetLastError(0xdeadbeef);
         ret = TerminateProcess(pi.hProcess, 0);
         ok(ret, "TerminateProcess() error %d\n", GetLastError());
diff --git a/server/mapping.c b/server/mapping.c
index bc9ed5bdcb9..8d4332d240f 100644
--- a/server/mapping.c
+++ b/server/mapping.c
@@ -408,6 +408,7 @@ static void add_process_view( struct thread *thread, struct memory_view *view )
             process->image = NULL;
             if (get_view_nt_name( view, &name ) && (process->image = memdup( name.str, name.len )))
                 process->imagelen = name.len;
+            process->image_info = view->image;
             return;
         }
     }
diff --git a/server/process.c b/server/process.c
index 0cc7f6b60ee..bcb66271771 100644
--- a/server/process.c
+++ b/server/process.c
@@ -680,6 +680,7 @@ struct process *create_process( int fd, struct process *parent, unsigned int fla
     process->trace_data      = 0;
     process->rawinput_mouse  = NULL;
     process->rawinput_kbd    = NULL;
+    memset( &process->image_info, 0, sizeof(process->image_info) );
     list_init( &process->kernel_object );
     list_init( &process->thread_list );
     list_init( &process->locks );
@@ -1502,17 +1503,7 @@ DECL_HANDLER(get_process_info)
         reply->session_id       = process->session_id;
         reply->machine          = process->machine;
         if (get_reply_max_size())
-        {
-            client_ptr_t base;
-            const pe_image_info_t *info;
-            struct memory_view *view = get_exe_view( process );
-            if (view)
-            {
-                if ((info = get_view_image_info( view, &base )))
-                    set_reply_data( info, min( sizeof(*info), get_reply_max_size() ));
-            }
-            else set_error( STATUS_PROCESS_IS_TERMINATING );
-        }
+            set_reply_data( &process->image_info, min( sizeof(process->image_info), get_reply_max_size() ));
         release_object( process );
     }
 }
diff --git a/server/process.h b/server/process.h
index 22ee8178368..632faf9c4bf 100644
--- a/server/process.h
+++ b/server/process.h
@@ -89,6 +89,7 @@ struct process
     const struct rawinput_device *rawinput_mouse; /* rawinput mouse device, if any */
     const struct rawinput_device *rawinput_kbd;   /* rawinput keyboard device, if any */
     struct list          kernel_object;   /* list of kernel object pointers */
+    pe_image_info_t      image_info;      /* main exe image info */
 };
 
 /* process functions */




More information about the wine-cvs mailing list