Convert the process dll list to a standard list.
diff --git a/server/process.c b/server/process.c
index 4b8d6f2..7eab25b 100644
--- a/server/process.c
+++ b/server/process.c
@@ -275,8 +275,6 @@
process->atom_table = NULL;
process->peb = NULL;
process->ldt_copy = NULL;
- process->exe.next = NULL;
- process->exe.prev = NULL;
process->exe.file = NULL;
process->exe.dbg_offset = 0;
process->exe.dbg_size = 0;
@@ -287,6 +285,7 @@
list_init( &process->thread_list );
list_init( &process->locks );
list_init( &process->classes );
+ list_init( &process->dlls );
gettimeofday( &process->start_time, NULL );
list_add_head( &process_list, &process->entry );
@@ -492,6 +491,20 @@
access, &process_ops );
}
+/* find a dll from its base address */
+static inline struct process_dll *find_process_dll( struct process *process, void *base )
+{
+ struct process_dll *dll;
+
+ if (process->exe.base == base) return &process->exe;
+
+ LIST_FOR_EACH_ENTRY( dll, &process->dlls, struct process_dll, entry )
+ {
+ if (dll->base == base) return dll;
+ }
+ return NULL;
+}
+
/* add a dll to a process list */
static struct process_dll *process_load_dll( struct process *process, struct file *file,
void *base, const WCHAR *filename, size_t name_len )
@@ -499,7 +512,7 @@
struct process_dll *dll;
/* make sure we don't already have one with the same base address */
- for (dll = process->exe.next; dll; dll = dll->next) if (dll->base == base)
+ if (find_process_dll( process, base ))
{
set_error( STATUS_INVALID_PARAMETER );
return NULL;
@@ -507,7 +520,6 @@
if ((dll = mem_alloc( sizeof(*dll) )))
{
- dll->prev = &process->exe;
dll->file = NULL;
dll->base = base;
dll->filename = NULL;
@@ -518,8 +530,7 @@
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;
+ list_add_head( &process->dlls, &dll->entry );
}
return dll;
}
@@ -527,22 +538,17 @@
/* remove a dll from a process list */
static void process_unload_dll( struct process *process, void *base )
{
- struct process_dll *dll;
+ struct process_dll *dll = find_process_dll( process, base );
- for (dll = process->exe.next; dll; dll = dll->next)
+ if (dll && dll != &process->exe)
{
- if (dll->base == base)
- {
- 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;
- }
+ if (dll->file) release_object( dll->file );
+ if (dll->filename) free( dll->filename );
+ list_remove( &dll->entry );
+ free( dll );
+ generate_debug_event( current, UNLOAD_DLL_DEBUG_EVENT, base );
}
- set_error( STATUS_INVALID_PARAMETER );
+ else set_error( STATUS_INVALID_PARAMETER );
}
/* kill all processes */
@@ -584,6 +590,8 @@
/* a process has been killed (i.e. its last thread died) */
static void process_killed( struct process *process )
{
+ struct list *ptr;
+
assert( list_empty( &process->thread_list ));
gettimeofday( &process->end_time, NULL );
if (process->handles) release_object( process->handles );
@@ -592,12 +600,12 @@
/* close the console attached to this process, if any */
free_console( process );
- while (process->exe.next)
+ while ((ptr = list_head( &process->dlls )))
{
- struct process_dll *dll = process->exe.next;
- process->exe.next = dll->next;
+ struct process_dll *dll = LIST_ENTRY( ptr, struct process_dll, entry );
if (dll->file) release_object( dll->file );
if (dll->filename) free( dll->filename );
+ list_remove( &dll->entry );
free( dll );
}
destroy_process_classes( process );
@@ -855,17 +863,25 @@
{
struct module_snapshot *snapshot, *ptr;
struct process_dll *dll;
- int total = 0;
+ int total = 1;
- for (dll = &process->exe; dll; dll = dll->next) total++;
+ LIST_FOR_EACH_ENTRY( dll, &process->dlls, struct process_dll, entry ) total++;
if (!(snapshot = mem_alloc( sizeof(*snapshot) * total ))) return NULL;
- for (ptr = snapshot, dll = &process->exe; dll; dll = dll->next, ptr++)
+ /* first entry is main exe */
+ snapshot->base = process->exe.base;
+ snapshot->size = process->exe.size;
+ snapshot->namelen = process->exe.namelen;
+ snapshot->filename = memdup( process->exe.filename, process->exe.namelen );
+ ptr = snapshot + 1;
+
+ LIST_FOR_EACH_ENTRY( dll, &process->dlls, struct process_dll, entry )
{
ptr->base = dll->base;
ptr->size = dll->size;
ptr->namelen = dll->namelen;
ptr->filename = memdup( dll->filename, dll->namelen );
+ ptr++;
}
*count = total;
return snapshot;
@@ -1156,24 +1172,21 @@
if ((process = get_process_from_handle( req->handle, PROCESS_QUERY_INFORMATION )))
{
- struct process_dll *dll;
+ struct process_dll *dll = find_process_dll( process, req->base_address );
- for (dll = &process->exe; dll; dll = dll->next)
+ if (dll)
{
- if (dll->base == req->base_address)
+ reply->size = dll->size;
+ reply->entry_point = 0; /* FIXME */
+ if (dll->filename)
{
- reply->size = dll->size;
- reply->entry_point = 0; /* FIXME */
- if (dll->filename)
- {
- size_t len = min( dll->namelen, get_reply_max_size() );
- set_reply_data( dll->filename, len );
- }
- break;
+ size_t len = min( dll->namelen, get_reply_max_size() );
+ set_reply_data( dll->filename, len );
}
}
- if (!dll)
- set_error(STATUS_DLL_NOT_FOUND);
+ else
+ set_error( STATUS_DLL_NOT_FOUND );
+
release_object( process );
}
}