Module: wine Branch: master Commit: 3c9b5379d1a57f69fa14f87f64f2079171becb6c URL: https://source.winehq.org/git/wine.git/?a=commit;h=3c9b5379d1a57f69fa14f87f6...
Author: Alexandre Julliard julliard@winehq.org Date: Thu Mar 11 21:51:37 2021 +0100
server: Store a copy of the image file name in the process.
Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/kernel32/tests/process.c | 2 -- server/mapping.c | 3 +++ server/process.c | 21 +++++++++------------ server/process.h | 2 ++ 4 files changed, 14 insertions(+), 14 deletions(-)
diff --git a/dlls/kernel32/tests/process.c b/dlls/kernel32/tests/process.c index 1c47f8a3b64..3e450c09849 100644 --- a/dlls/kernel32/tests/process.c +++ b/dlls/kernel32/tests/process.c @@ -4192,9 +4192,7 @@ static void test_dead_process(void) memset( data, 0, sizeof(data) ); status = NtQueryInformationProcess( pi.hProcess, ProcessImageFileName, data, sizeof(data), NULL); ok( !status, "ProcessImageFileName failed %x\n", status ); - todo_wine ok( ((UNICODE_STRING *)data)->Length, "ProcessImageFileName not set\n" ); - todo_wine ok( ((UNICODE_STRING *)data)->Buffer[0] == '\', "ProcessImageFileName not set\n" );
memset( prio, 0xcc, sizeof(*prio) ); diff --git a/server/mapping.c b/server/mapping.c index 17c7ca26b3a..ebf3e057c75 100644 --- a/server/mapping.c +++ b/server/mapping.c @@ -353,6 +353,7 @@ struct memory_view *get_exe_view( struct process *process ) static void add_process_view( struct thread *thread, struct memory_view *view ) { struct process *process = thread->process; + struct unicode_str name;
if (view->flags & SEC_IMAGE) { @@ -362,6 +363,8 @@ static void add_process_view( struct thread *thread, struct memory_view *view ) { /* main exe */ list_add_head( &process->views, &view->entry ); + if (get_view_nt_name( view, &name ) && (process->image = memdup( name.str, name.len ))) + process->imagelen = name.len; return; } } diff --git a/server/process.c b/server/process.c index 0d550328312..90ea44515ec 100644 --- a/server/process.c +++ b/server/process.c @@ -536,6 +536,8 @@ struct process *create_process( int fd, struct process *parent, int inherit_all, process->is_system = 0; process->debug_children = 1; process->is_terminating = 0; + process->imagelen = 0; + process->image = NULL; process->job = NULL; process->console = NULL; process->startup_state = STARTUP_IN_PROGRESS; @@ -649,6 +651,7 @@ static void process_destroy( struct object *obj ) if (process->id) free_ptid( process->id ); if (process->token) release_object( process->token ); free( process->dir_cache ); + free( process->image ); }
/* dump a process on stdout for debugging purposes */ @@ -1381,13 +1384,12 @@ DECL_HANDLER(get_process_debug_info) /* fetch the name of the process image */ DECL_HANDLER(get_process_image_name) { - struct unicode_str name; - struct memory_view *view; struct process *process = get_process_from_handle( req->handle, PROCESS_QUERY_LIMITED_INFORMATION );
if (!process) return; - if ((view = get_exe_view( process )) && get_view_nt_name( view, &name )) + if (process->image) { + struct unicode_str name = { process->image, process->imagelen }; /* skip the ??\ prefix */ if (req->win32 && name.len > 6 * sizeof(WCHAR) && name.str[5] == ':') { @@ -1724,7 +1726,6 @@ DECL_HANDLER(list_processes) { struct process *process; struct thread *thread; - struct unicode_str nt_name; unsigned int pos = 0; char *buffer;
@@ -1733,10 +1734,8 @@ DECL_HANDLER(list_processes)
LIST_FOR_EACH_ENTRY( process, &process_list, struct process, entry ) { - struct memory_view *view = get_exe_view( process ); - if (!view || !get_view_nt_name( view, &nt_name )) nt_name.len = 0; reply->info_size = (reply->info_size + 7) & ~7; - reply->info_size += sizeof(struct process_info) + nt_name.len; + reply->info_size += sizeof(struct process_info) + process->imagelen; reply->info_size = (reply->info_size + 7) & ~7; reply->info_size += process->running_threads * sizeof(struct thread_info); reply->process_count++; @@ -1754,13 +1753,11 @@ DECL_HANDLER(list_processes) LIST_FOR_EACH_ENTRY( process, &process_list, struct process, entry ) { struct process_info *process_info; - struct memory_view *view = get_exe_view( process );
pos = (pos + 7) & ~7; - if (!view || !get_view_nt_name( view, &nt_name )) nt_name.len = 0; process_info = (struct process_info *)(buffer + pos); process_info->start_time = process->start_time; - process_info->name_len = nt_name.len; + process_info->name_len = process->imagelen; process_info->thread_count = process->running_threads; process_info->priority = process->priority; process_info->pid = process->id; @@ -1768,8 +1765,8 @@ DECL_HANDLER(list_processes) process_info->handle_count = get_handle_table_count(process); process_info->unix_pid = process->unix_pid; pos += sizeof(*process_info); - memcpy( buffer + pos, nt_name.str, nt_name.len ); - pos += nt_name.len; + memcpy( buffer + pos, process->image, process->imagelen ); + pos += process->imagelen; pos = (pos + 7) & ~7; LIST_FOR_EACH_ENTRY( thread, &process->thread_list, struct thread, proc_entry ) { diff --git a/server/process.h b/server/process.h index c8be5640a54..0997a759330 100644 --- a/server/process.h +++ b/server/process.h @@ -64,6 +64,8 @@ struct process unsigned int is_system:1; /* is it a system process? */ unsigned int debug_children:1;/* also debug all child processes */ unsigned int is_terminating:1;/* is process terminating? */ + data_size_t imagelen; /* length of image path in bytes */ + WCHAR *image; /* main exe image full path */ struct job *job; /* job object ascoicated with this process */ struct list job_entry; /* list entry for job object */ struct list asyncs; /* list of async object owned by the process */