server: Store the process exe module in the standard dll list.
diff --git a/server/process.c b/server/process.c
index e738bb2..a593ad2 100644
--- a/server/process.c
+++ b/server/process.c
@@ -252,11 +252,6 @@
     process->ldt_copy        = NULL;
     process->winstation      = 0;
     process->desktop         = 0;
-    process->exe.file        = NULL;
-    process->exe.dbg_offset  = 0;
-    process->exe.dbg_size    = 0;
-    process->exe.namelen     = 0;
-    process->exe.filename    = NULL;
     process->token           = token_create_admin();
     list_init( &process->thread_list );
     list_init( &process->locks );
@@ -392,8 +387,6 @@
     list_remove( &process->entry );
     if (process->idle_event) release_object( process->idle_event );
     if (process->queue) release_object( process->queue );
-    if (process->exe.file) release_object( process->exe.file );
-    if (process->exe.filename) free( process->exe.filename );
     if (process->id) free_ptid( process->id );
     if (process->token) release_object( process->token );
 }
@@ -480,8 +473,6 @@
 {
     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;
@@ -514,7 +505,7 @@
             return NULL;
         }
         if (file) dll->file = (struct file *)grab_object( file );
-        list_add_head( &process->dlls, &dll->entry );
+        list_add_tail( &process->dlls, &dll->entry );
     }
     return dll;
 }
@@ -524,7 +515,7 @@
 {
     struct process_dll *dll = find_process_dll( process, base );
 
-    if (dll && dll != &process->exe)
+    if (dll && (&dll->entry != list_head( &process->dlls )))  /* main exe can't be unloaded */
     {
         if (dll->file) release_object( dll->file );
         if (dll->filename) free( dll->filename );
@@ -597,8 +588,6 @@
     destroy_process_classes( process );
     remove_process_locks( process );
     set_process_startup_state( process, STARTUP_ABORTED );
-    if (process->exe.file) release_object( process->exe.file );
-    process->exe.file = NULL;
     wake_up( &process->obj, 0 );
     if (!--running_processes) close_master_socket();
 }
@@ -850,18 +839,12 @@
 {
     struct module_snapshot *snapshot, *ptr;
     struct process_dll *dll;
-    int total = 1;
+    int total = 0;
 
     LIST_FOR_EACH_ENTRY( dll, &process->dlls, struct process_dll, entry ) total++;
     if (!(snapshot = mem_alloc( sizeof(*snapshot) * total ))) return NULL;
 
-    /* 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;
-
+    ptr = snapshot;
     LIST_FOR_EACH_ENTRY( dll, &process->dlls, struct process_dll, entry )
     {
         ptr->base     = dll->base;
@@ -992,21 +975,19 @@
     }
 
     /* check if main exe has been registered as a dll already */
-    if ((dll = find_process_dll( process, req->module )))
+    if (!(dll = find_process_dll( process, req->module )))
     {
-        list_remove( &dll->entry );
-        memcpy( &process->exe, dll, sizeof(*dll) );
-        list_init( &process->exe.entry );
-        free( dll );
+        if (!(dll = process_load_dll( process, NULL, req->module,
+                                      get_req_data(), get_req_data_size() ))) return;
+        dll->size       = req->module_size;
+        dll->dbg_offset = 0;
+        dll->dbg_size   = 0;
+        dll->name       = req->name;
     }
-    else
-    {
-        process->exe.base = req->module;
-        process->exe.size = req->module_size;
-        process->exe.name = req->name;
-        if ((process->exe.namelen = get_req_data_size()))
-            process->exe.filename = memdup( get_req_data(), process->exe.namelen );
-    }
+
+    /* main exe is the first in the dll list */
+    list_remove( &dll->entry );
+    list_add_head( &process->dlls, &dll->entry );
 
     generate_startup_debug_events( process, req->entry );
     set_process_startup_state( process, STARTUP_DONE );