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