Correctly fill parent pid, module size and module name in process and
module snapshots. Based on patches by Eric Pouech and Andreas Mohr.
diff --git a/server/process.c b/server/process.c
index a08c1c7..d1acd70 100644
--- a/server/process.c
+++ b/server/process.c
@@ -203,6 +203,8 @@
process->exe.file = NULL;
process->exe.dbg_offset = 0;
process->exe.dbg_size = 0;
+ process->exe.namelen = 0;
+ process->exe.filename = NULL;
gettimeofday( &process->start_time, NULL );
if ((process->next = first_process) != NULL) process->next->prev = process;
@@ -328,6 +330,7 @@
if (process->queue) release_object( process->queue );
if (process->atom_table) release_object( process->atom_table );
if (process->exe.file) release_object( process->exe.file );
+ if (process->exe.filename) free( process->exe.filename );
}
/* dump a process on stdout for debugging purposes */
@@ -406,7 +409,7 @@
/* add a dll to a process list */
static struct process_dll *process_load_dll( struct process *process, struct file *file,
- void *base )
+ void *base, const char *filename, size_t name_len )
{
struct process_dll *dll;
@@ -422,6 +425,13 @@
dll->prev = &process->exe;
dll->file = NULL;
dll->base = base;
+ dll->filename = NULL;
+ dll->namelen = name_len;
+ if (name_len && !(dll->filename = memdup( filename, name_len )))
+ {
+ free( dll );
+ return NULL;
+ }
if (file) dll->file = (struct file *)grab_object( file );
if ((dll->next = process->exe.next)) dll->next->prev = dll;
process->exe.next = dll;
@@ -441,6 +451,7 @@
if (dll->file) release_object( dll->file );
if (dll->next) dll->next->prev = dll->prev;
if (dll->prev) dll->prev->next = dll->next;
+ if (dll->filename) free( dll->filename );
free( dll );
generate_debug_event( current, UNLOAD_DLL_DEBUG_EVENT, base );
return;
@@ -484,6 +495,7 @@
struct process_dll *dll = process->exe.next;
process->exe.next = dll->next;
if (dll->file) release_object( dll->file );
+ if (dll->filename) free( dll->filename );
free( dll );
}
if (process->exe.file) release_object( process->exe.file );
@@ -745,7 +757,10 @@
for (ptr = snapshot, dll = &process->exe; dll; dll = dll->next, ptr++)
{
- ptr->base = dll->base;
+ ptr->base = dll->base;
+ ptr->size = dll->size;
+ ptr->namelen = dll->namelen;
+ ptr->filename = memdup( dll->filename, dll->namelen );
}
*count = total;
return snapshot;
@@ -848,12 +863,16 @@
return;
}
process->exe.base = req->module;
+ process->exe.size = req->module_size;
process->exe.name = req->name;
if (req->exe_file) file = get_file_obj( current->process, req->exe_file, GENERIC_READ );
if (process->exe.file) release_object( process->exe.file );
process->exe.file = file;
+ if ((process->exe.namelen = get_req_data_size()))
+ process->exe.filename = memdup( get_req_data(), process->exe.namelen );
+
generate_startup_debug_events( current->process, req->entry );
set_event( process->init_event );
release_object( process->init_event );
@@ -968,8 +987,10 @@
if (req->handle &&
!(file = get_file_obj( current->process, req->handle, GENERIC_READ ))) return;
- if ((dll = process_load_dll( current->process, file, req->base )))
+ if ((dll = process_load_dll( current->process, file, req->base,
+ get_req_data(), get_req_data_size() )))
{
+ dll->size = req->size;
dll->dbg_offset = req->dbg_offset;
dll->dbg_size = req->dbg_size;
dll->name = req->name;
diff --git a/server/process.h b/server/process.h
index 247325c..3e84c09 100644
--- a/server/process.h
+++ b/server/process.h
@@ -34,9 +34,12 @@
struct process_dll *prev;
struct file *file; /* dll file */
void *base; /* dll base address (in process addr space) */
+ size_t size; /* dll size */
void *name; /* ptr to ptr to name (in process addr space) */
int dbg_offset; /* debug info offset */
int dbg_size; /* debug info size */
+ size_t namelen; /* length of dll file name */
+ char *filename; /* dll file name */
};
struct process
@@ -77,6 +80,9 @@
struct module_snapshot
{
void *base; /* module base addr */
+ size_t size; /* module size */
+ size_t namelen; /* length of file name */
+ char *filename; /* module file name */
};
/* process functions */
diff --git a/server/protocol.def b/server/protocol.def
index 6cc06b5..88415c9 100644
--- a/server/protocol.def
+++ b/server/protocol.def
@@ -239,10 +239,12 @@
/* Signal the end of the process initialization */
@REQ(init_process_done)
void* module; /* main module base address */
+ size_t module_size; /* main module size */
void* entry; /* process entry point */
void* name; /* ptr to ptr to name (in process addr space) */
handle_t exe_file; /* file handle for main exe */
int gui; /* is it a GUI process? */
+ VARARG(filename,string); /* file name of main exe */
@REPLY
int debugged; /* being debugged? */
@END
@@ -349,9 +351,11 @@
@REQ(load_dll)
handle_t handle; /* file handle */
void* base; /* base address */
+ size_t size; /* dll size */
int dbg_offset; /* debug info offset */
int dbg_size; /* debug info size */
void* name; /* ptr to ptr to name (in process addr space) */
+ VARARG(filename,string); /* file name of dll */
@END
@@ -1059,8 +1063,12 @@
@REPLY
int count; /* process usage count */
void* pid; /* process id */
+ void* ppid; /* parent process id */
+ void* heap; /* heap base */
+ void* module; /* main module */
int threads; /* number of threads */
int priority; /* process priority */
+ VARARG(filename,string); /* file name of main exe */
@END
@@ -1084,6 +1092,8 @@
@REPLY
void* pid; /* process id */
void* base; /* module base address */
+ size_t size; /* module size */
+ VARARG(filename,string); /* file name of module */
@END
diff --git a/server/snapshot.c b/server/snapshot.c
index f15d433..f78f862 100644
--- a/server/snapshot.c
+++ b/server/snapshot.c
@@ -126,8 +126,16 @@
ptr = &snapshot->processes[snapshot->process_pos++];
reply->count = ptr->count;
reply->pid = get_process_id( ptr->process );
+ reply->ppid = get_process_id( ptr->process->parent );
+ reply->heap = 0; /* FIXME */
+ reply->module = 0; /* FIXME */
reply->threads = ptr->threads;
reply->priority = ptr->priority;
+ if (ptr->process->exe.filename)
+ {
+ size_t len = min( ptr->process->exe.namelen, get_reply_max_size() );
+ set_reply_data( ptr->process->exe.filename, len );
+ }
return 1;
}
@@ -173,6 +181,12 @@
ptr = &snapshot->modules[snapshot->module_pos++];
reply->pid = get_process_id( snapshot->process );
reply->base = ptr->base;
+ reply->size = ptr->size;
+ if (ptr->filename)
+ {
+ size_t len = min( ptr->namelen, get_reply_max_size() );
+ set_reply_data( ptr->filename, len );
+ }
return 1;
}
@@ -201,7 +215,12 @@
release_object( snapshot->threads[i].thread );
free( snapshot->threads );
}
- if (snapshot->module_count) free( snapshot->modules );
+ if (snapshot->module_count)
+ {
+ for (i = 0; i < snapshot->module_count; i++)
+ free( snapshot->modules[i].filename );
+ free( snapshot->modules );
+ }
if (snapshot->process) release_object( snapshot->process );
}
diff --git a/server/trace.c b/server/trace.c
index 2e36fe4..6e0e876 100644
--- a/server/trace.c
+++ b/server/trace.c
@@ -383,10 +383,13 @@
static void dump_init_process_done_request( const struct init_process_done_request *req )
{
fprintf( stderr, " module=%p,", req->module );
+ fprintf( stderr, " module_size=%d,", req->module_size );
fprintf( stderr, " entry=%p,", req->entry );
fprintf( stderr, " name=%p,", req->name );
fprintf( stderr, " exe_file=%d,", req->exe_file );
- fprintf( stderr, " gui=%d", req->gui );
+ fprintf( stderr, " gui=%d,", req->gui );
+ fprintf( stderr, " filename=" );
+ dump_varargs_string( cur_size );
}
static void dump_init_process_done_reply( const struct init_process_done_reply *req )
@@ -503,9 +506,12 @@
{
fprintf( stderr, " handle=%d,", req->handle );
fprintf( stderr, " base=%p,", req->base );
+ fprintf( stderr, " size=%d,", req->size );
fprintf( stderr, " dbg_offset=%d,", req->dbg_offset );
fprintf( stderr, " dbg_size=%d,", req->dbg_size );
- fprintf( stderr, " name=%p", req->name );
+ fprintf( stderr, " name=%p,", req->name );
+ fprintf( stderr, " filename=" );
+ dump_varargs_string( cur_size );
}
static void dump_unload_dll_request( const struct unload_dll_request *req )
@@ -1213,8 +1219,13 @@
{
fprintf( stderr, " count=%d,", req->count );
fprintf( stderr, " pid=%p,", req->pid );
+ fprintf( stderr, " ppid=%p,", req->ppid );
+ fprintf( stderr, " heap=%p,", req->heap );
+ fprintf( stderr, " module=%p,", req->module );
fprintf( stderr, " threads=%d,", req->threads );
- fprintf( stderr, " priority=%d", req->priority );
+ fprintf( stderr, " priority=%d,", req->priority );
+ fprintf( stderr, " filename=" );
+ dump_varargs_string( cur_size );
}
static void dump_next_thread_request( const struct next_thread_request *req )
@@ -1241,7 +1252,10 @@
static void dump_next_module_reply( const struct next_module_reply *req )
{
fprintf( stderr, " pid=%p,", req->pid );
- fprintf( stderr, " base=%p", req->base );
+ fprintf( stderr, " base=%p,", req->base );
+ fprintf( stderr, " size=%d,", req->size );
+ fprintf( stderr, " filename=" );
+ dump_varargs_string( cur_size );
}
static void dump_wait_debug_event_request( const struct wait_debug_event_request *req )