Added server snapshot support (processes only for now).

diff --git a/server/process.c b/server/process.c
index 6cd3e58..6e65433 100644
--- a/server/process.c
+++ b/server/process.c
@@ -17,6 +17,7 @@
 #include "winnt.h"
 
 #include "server.h"
+#include "server/process.h"
 #include "server/thread.h"
 
 /* reserved handle access rights */
@@ -60,6 +61,7 @@
 
 static struct process *first_process;
 static struct process *initial_process;
+static int running_processes;
 
 #define MIN_HANDLE_ENTRIES  32
 
@@ -214,7 +216,7 @@
     thread->proc_prev = NULL;
     if (thread->proc_next) thread->proc_next->proc_prev = thread;
     process->thread_list = thread;
-    process->running_threads++;
+    if (!process->running_threads++) running_processes++;
     grab_object( thread );
 }
 
@@ -231,6 +233,7 @@
     if (!--process->running_threads)
     {
         /* we have removed the last running thread, exit the process */
+        running_processes--;
         process_killed( process, thread->exit_code );
     }
     release_object( thread );
@@ -573,3 +576,25 @@
         return NULL;
     return grab_object( obj );
 }
+
+/* take a snapshot of currently running processes */
+struct process_snapshot *process_snap( int *count )
+{
+    struct process_snapshot *snapshot, *ptr;
+    struct process *process;
+    if (!running_processes) return NULL;
+    if (!(snapshot = mem_alloc( sizeof(*snapshot) * running_processes )))
+        return NULL;
+    ptr = snapshot;
+    for (process = first_process; process; process = process->next)
+    {
+        if (!process->running_threads) continue;
+        ptr->process  = process;
+        ptr->threads  = process->running_threads;
+        ptr->priority = process->priority;
+        grab_object( process );
+        ptr++;
+    }
+    *count = running_processes;
+    return snapshot;
+}