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 )