msxml3: Implement setNamedItem.
[wine] / server / process.c
1 /*
2  * Server-side process management
3  *
4  * Copyright (C) 1998 Alexandre Julliard
5  *
6  * This library is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation; either
9  * version 2.1 of the License, or (at your option) any later version.
10  *
11  * This library is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with this library; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
19  */
20
21 #include "config.h"
22 #include "wine/port.h"
23
24 #include <assert.h>
25 #include <limits.h>
26 #include <signal.h>
27 #include <string.h>
28 #include <stdarg.h>
29 #include <stdio.h>
30 #include <stdlib.h>
31 #include <sys/time.h>
32 #ifdef HAVE_SYS_SOCKET_H
33 # include <sys/socket.h>
34 #endif
35 #include <unistd.h>
36 #ifdef HAVE_POLL_H
37 #include <poll.h>
38 #endif
39
40 #include "ntstatus.h"
41 #define WIN32_NO_STATUS
42 #include "winternl.h"
43
44 #include "file.h"
45 #include "handle.h"
46 #include "process.h"
47 #include "thread.h"
48 #include "request.h"
49 #include "user.h"
50 #include "security.h"
51
52 /* process structure */
53
54 static struct list process_list = LIST_INIT(process_list);
55 static int running_processes, user_processes;
56 static struct event *shutdown_event;           /* signaled when shutdown starts */
57 static struct timeout_user *shutdown_timeout;  /* timeout for server shutdown */
58 static int shutting_down;  /* are we in the process of shutting down the server? */
59
60 /* process operations */
61
62 static void process_dump( struct object *obj, int verbose );
63 static int process_signaled( struct object *obj, struct thread *thread );
64 static unsigned int process_map_access( struct object *obj, unsigned int access );
65 static void process_poll_event( struct fd *fd, int event );
66 static void process_destroy( struct object *obj );
67
68 static const struct object_ops process_ops =
69 {
70     sizeof(struct process),      /* size */
71     process_dump,                /* dump */
72     no_get_type,                 /* get_type */
73     add_queue,                   /* add_queue */
74     remove_queue,                /* remove_queue */
75     process_signaled,            /* signaled */
76     no_satisfied,                /* satisfied */
77     no_signal,                   /* signal */
78     no_get_fd,                   /* get_fd */
79     process_map_access,          /* map_access */
80     default_get_sd,              /* get_sd */
81     default_set_sd,              /* set_sd */
82     no_lookup_name,              /* lookup_name */
83     no_open_file,                /* open_file */
84     no_close_handle,             /* close_handle */
85     process_destroy              /* destroy */
86 };
87
88 static const struct fd_ops process_fd_ops =
89 {
90     NULL,                        /* get_poll_events */
91     process_poll_event,          /* poll_event */
92     NULL,                        /* flush */
93     NULL,                        /* get_fd_type */
94     NULL,                        /* ioctl */
95     NULL,                        /* queue_async */
96     NULL,                        /* reselect_async */
97     NULL                         /* cancel async */
98 };
99
100 /* process startup info */
101
102 struct startup_info
103 {
104     struct object       obj;          /* object header */
105     obj_handle_t        hstdin;       /* handle for stdin */
106     obj_handle_t        hstdout;      /* handle for stdout */
107     obj_handle_t        hstderr;      /* handle for stderr */
108     struct file        *exe_file;     /* file handle for main exe */
109     struct process     *process;      /* created process */
110     data_size_t         data_size;    /* size of startup data */
111     void               *data;         /* data for startup info */
112 };
113
114 static void startup_info_dump( struct object *obj, int verbose );
115 static int startup_info_signaled( struct object *obj, struct thread *thread );
116 static void startup_info_destroy( struct object *obj );
117
118 static const struct object_ops startup_info_ops =
119 {
120     sizeof(struct startup_info),   /* size */
121     startup_info_dump,             /* dump */
122     no_get_type,                   /* get_type */
123     add_queue,                     /* add_queue */
124     remove_queue,                  /* remove_queue */
125     startup_info_signaled,         /* signaled */
126     no_satisfied,                  /* satisfied */
127     no_signal,                     /* signal */
128     no_get_fd,                     /* get_fd */
129     no_map_access,                 /* map_access */
130     default_get_sd,                /* get_sd */
131     default_set_sd,                /* set_sd */
132     no_lookup_name,                /* lookup_name */
133     no_open_file,                  /* open_file */
134     no_close_handle,               /* close_handle */
135     startup_info_destroy           /* destroy */
136 };
137
138
139 struct ptid_entry
140 {
141     void        *ptr;   /* entry ptr */
142     unsigned int next;  /* next free entry */
143 };
144
145 static struct ptid_entry *ptid_entries;     /* array of ptid entries */
146 static unsigned int used_ptid_entries;      /* number of entries in use */
147 static unsigned int alloc_ptid_entries;     /* number of allocated entries */
148 static unsigned int next_free_ptid;         /* next free entry */
149 static unsigned int last_free_ptid;         /* last free entry */
150
151 #define PTID_OFFSET 8  /* offset for first ptid value */
152
153 /* allocate a new process or thread id */
154 unsigned int alloc_ptid( void *ptr )
155 {
156     struct ptid_entry *entry;
157     unsigned int id;
158
159     if (used_ptid_entries < alloc_ptid_entries)
160     {
161         id = used_ptid_entries + PTID_OFFSET;
162         entry = &ptid_entries[used_ptid_entries++];
163     }
164     else if (next_free_ptid)
165     {
166         id = next_free_ptid;
167         entry = &ptid_entries[id - PTID_OFFSET];
168         if (!(next_free_ptid = entry->next)) last_free_ptid = 0;
169     }
170     else  /* need to grow the array */
171     {
172         unsigned int count = alloc_ptid_entries + (alloc_ptid_entries / 2);
173         if (!count) count = 64;
174         if (!(entry = realloc( ptid_entries, count * sizeof(*entry) )))
175         {
176             set_error( STATUS_NO_MEMORY );
177             return 0;
178         }
179         ptid_entries = entry;
180         alloc_ptid_entries = count;
181         id = used_ptid_entries + PTID_OFFSET;
182         entry = &ptid_entries[used_ptid_entries++];
183     }
184
185     entry->ptr = ptr;
186     return id;
187 }
188
189 /* free a process or thread id */
190 void free_ptid( unsigned int id )
191 {
192     struct ptid_entry *entry = &ptid_entries[id - PTID_OFFSET];
193
194     entry->ptr  = NULL;
195     entry->next = 0;
196
197     /* append to end of free list so that we don't reuse it too early */
198     if (last_free_ptid) ptid_entries[last_free_ptid - PTID_OFFSET].next = id;
199     else next_free_ptid = id;
200
201     last_free_ptid = id;
202 }
203
204 /* retrieve the pointer corresponding to a process or thread id */
205 void *get_ptid_entry( unsigned int id )
206 {
207     if (id < PTID_OFFSET) return NULL;
208     if (id - PTID_OFFSET >= used_ptid_entries) return NULL;
209     return ptid_entries[id - PTID_OFFSET].ptr;
210 }
211
212 /* return the main thread of the process */
213 struct thread *get_process_first_thread( struct process *process )
214 {
215     struct list *ptr = list_head( &process->thread_list );
216     if (!ptr) return NULL;
217     return LIST_ENTRY( ptr, struct thread, proc_entry );
218 }
219
220 /* set the state of the process startup info */
221 static void set_process_startup_state( struct process *process, enum startup_state state )
222 {
223     if (process->startup_state == STARTUP_IN_PROGRESS) process->startup_state = state;
224     if (process->startup_info)
225     {
226         wake_up( &process->startup_info->obj, 0 );
227         release_object( process->startup_info );
228         process->startup_info = NULL;
229     }
230 }
231
232 /* callback for server shutdown */
233 static void server_shutdown_timeout( void *arg )
234 {
235     shutdown_timeout = NULL;
236     if (!running_processes) close_master_socket( 0 );
237     else
238     {
239         if (debug_level) fprintf( stderr, "wineserver: shutting down\n" );
240         if (shutdown_event) set_event( shutdown_event );
241         /* leave 2 seconds for system processes to exit */
242         close_master_socket( 2 * -TICKS_PER_SEC );
243         shutting_down = 1;
244     }
245 }
246
247 /* final cleanup once we are sure a process is really dead */
248 static void process_died( struct process *process )
249 {
250     if (debug_level) fprintf( stderr, "%04x: *process killed*\n", process->id );
251     if (!process->is_system)
252     {
253         if (!--user_processes && master_socket_timeout != TIMEOUT_INFINITE)
254             shutdown_timeout = add_timeout_user( master_socket_timeout, server_shutdown_timeout, NULL );
255     }
256     release_object( process );
257     if (!--running_processes && shutting_down) close_master_socket( 0 );
258 }
259
260 /* callback for process sigkill timeout */
261 static void process_sigkill( void *private )
262 {
263     struct process *process = private;
264
265     process->sigkill_timeout = NULL;
266     kill( process->unix_pid, SIGKILL );
267     process_died( process );
268 }
269
270 /* start the sigkill timer for a process upon exit */
271 static void start_sigkill_timer( struct process *process )
272 {
273     grab_object( process );
274     if (process->unix_pid != -1 && process->msg_fd)
275         process->sigkill_timeout = add_timeout_user( -TICKS_PER_SEC, process_sigkill, process );
276     else
277         process_died( process );
278 }
279
280 /* create a new process and its main thread */
281 /* if the function fails the fd is closed */
282 struct thread *create_process( int fd, struct thread *parent_thread, int inherit_all )
283 {
284     struct process *process;
285     struct thread *thread = NULL;
286     int request_pipe[2];
287
288     if (!(process = alloc_object( &process_ops )))
289     {
290         close( fd );
291         goto error;
292     }
293     process->parent          = NULL;
294     process->debugger        = NULL;
295     process->handles         = NULL;
296     process->msg_fd          = NULL;
297     process->sigkill_timeout = NULL;
298     process->unix_pid        = -1;
299     process->exit_code       = STILL_ACTIVE;
300     process->running_threads = 0;
301     process->priority        = PROCESS_PRIOCLASS_NORMAL;
302     process->affinity        = 1;
303     process->suspend         = 0;
304     process->is_system       = 0;
305     process->create_flags    = 0;
306     process->console         = NULL;
307     process->startup_state   = STARTUP_IN_PROGRESS;
308     process->startup_info    = NULL;
309     process->idle_event      = NULL;
310     process->queue           = NULL;
311     process->peb             = NULL;
312     process->ldt_copy        = NULL;
313     process->winstation      = 0;
314     process->desktop         = 0;
315     process->token           = NULL;
316     process->trace_data      = 0;
317     list_init( &process->thread_list );
318     list_init( &process->locks );
319     list_init( &process->classes );
320     list_init( &process->dlls );
321
322     process->start_time = current_time;
323     process->end_time = 0;
324     list_add_head( &process_list, &process->entry );
325
326     if (!(process->id = process->group_id = alloc_ptid( process )))
327     {
328         close( fd );
329         goto error;
330     }
331     if (!(process->msg_fd = create_anonymous_fd( &process_fd_ops, fd, &process->obj, 0 ))) goto error;
332
333     /* create the handle table */
334     if (!parent_thread)
335     {
336         process->handles = alloc_handle_table( process, 0 );
337         process->token = token_create_admin();
338     }
339     else
340     {
341         struct process *parent = parent_thread->process;
342         process->parent = (struct process *)grab_object( parent );
343         process->handles = inherit_all ? copy_handle_table( process, parent )
344                                        : alloc_handle_table( process, 0 );
345         /* Note: for security reasons, starting a new process does not attempt
346          * to use the current impersonation token for the new process */
347         process->token = token_duplicate( parent->token, TRUE, 0 );
348     }
349     if (!process->handles || !process->token) goto error;
350
351     /* create the main thread */
352     if (pipe( request_pipe ) == -1)
353     {
354         file_set_error();
355         goto error;
356     }
357     if (send_client_fd( process, request_pipe[1], 0 ) == -1)
358     {
359         close( request_pipe[0] );
360         close( request_pipe[1] );
361         goto error;
362     }
363     close( request_pipe[1] );
364     if (!(thread = create_thread( request_pipe[0], process ))) goto error;
365
366     set_fd_events( process->msg_fd, POLLIN );  /* start listening to events */
367     release_object( process );
368     return thread;
369
370  error:
371     if (process) release_object( process );
372     /* if we failed to start our first process, close everything down */
373     if (!running_processes) close_master_socket( 0 );
374     return NULL;
375 }
376
377 /* initialize the current process and fill in the request */
378 data_size_t init_process( struct thread *thread )
379 {
380     struct process *process = thread->process;
381     struct startup_info *info = process->startup_info;
382
383     init_process_tracing( process );
384     if (!info) return 0;
385     return info->data_size;
386 }
387
388 /* destroy a process when its refcount is 0 */
389 static void process_destroy( struct object *obj )
390 {
391     struct process *process = (struct process *)obj;
392     assert( obj->ops == &process_ops );
393
394     /* we can't have a thread remaining */
395     assert( list_empty( &process->thread_list ));
396
397     assert( !process->sigkill_timeout );  /* timeout should hold a reference to the process */
398
399     set_process_startup_state( process, STARTUP_ABORTED );
400     if (process->console) release_object( process->console );
401     if (process->parent) release_object( process->parent );
402     if (process->msg_fd) release_object( process->msg_fd );
403     list_remove( &process->entry );
404     if (process->idle_event) release_object( process->idle_event );
405     if (process->queue) release_object( process->queue );
406     if (process->id) free_ptid( process->id );
407     if (process->token) release_object( process->token );
408 }
409
410 /* dump a process on stdout for debugging purposes */
411 static void process_dump( struct object *obj, int verbose )
412 {
413     struct process *process = (struct process *)obj;
414     assert( obj->ops == &process_ops );
415
416     fprintf( stderr, "Process id=%04x handles=%p\n", process->id, process->handles );
417 }
418
419 static int process_signaled( struct object *obj, struct thread *thread )
420 {
421     struct process *process = (struct process *)obj;
422     return !process->running_threads;
423 }
424
425 static unsigned int process_map_access( struct object *obj, unsigned int access )
426 {
427     if (access & GENERIC_READ)    access |= STANDARD_RIGHTS_READ | SYNCHRONIZE;
428     if (access & GENERIC_WRITE)   access |= STANDARD_RIGHTS_WRITE | SYNCHRONIZE;
429     if (access & GENERIC_EXECUTE) access |= STANDARD_RIGHTS_EXECUTE;
430     if (access & GENERIC_ALL)     access |= PROCESS_ALL_ACCESS;
431     return access & ~(GENERIC_READ | GENERIC_WRITE | GENERIC_EXECUTE | GENERIC_ALL);
432 }
433
434 static void process_poll_event( struct fd *fd, int event )
435 {
436     struct process *process = get_fd_user( fd );
437     assert( process->obj.ops == &process_ops );
438
439     if (event & (POLLERR | POLLHUP))
440     {
441         release_object( process->msg_fd );
442         process->msg_fd = NULL;
443         if (process->sigkill_timeout)  /* already waiting for it to die */
444         {
445             remove_timeout_user( process->sigkill_timeout );
446             process->sigkill_timeout = NULL;
447             process_died( process );
448         }
449         else kill_process( process, 0 );
450     }
451     else if (event & POLLIN) receive_fd( process );
452 }
453
454 static void startup_info_destroy( struct object *obj )
455 {
456     struct startup_info *info = (struct startup_info *)obj;
457     assert( obj->ops == &startup_info_ops );
458     free( info->data );
459     if (info->exe_file) release_object( info->exe_file );
460     if (info->process) release_object( info->process );
461 }
462
463 static void startup_info_dump( struct object *obj, int verbose )
464 {
465     struct startup_info *info = (struct startup_info *)obj;
466     assert( obj->ops == &startup_info_ops );
467
468     fprintf( stderr, "Startup info in=%p out=%p err=%p\n",
469              info->hstdin, info->hstdout, info->hstderr );
470 }
471
472 static int startup_info_signaled( struct object *obj, struct thread *thread )
473 {
474     struct startup_info *info = (struct startup_info *)obj;
475     return info->process && info->process->startup_state != STARTUP_IN_PROGRESS;
476 }
477
478 /* get a process from an id (and increment the refcount) */
479 struct process *get_process_from_id( process_id_t id )
480 {
481     struct object *obj = get_ptid_entry( id );
482
483     if (obj && obj->ops == &process_ops) return (struct process *)grab_object( obj );
484     set_error( STATUS_INVALID_PARAMETER );
485     return NULL;
486 }
487
488 /* get a process from a handle (and increment the refcount) */
489 struct process *get_process_from_handle( obj_handle_t handle, unsigned int access )
490 {
491     return (struct process *)get_handle_obj( current->process, handle,
492                                              access, &process_ops );
493 }
494
495 /* find a dll from its base address */
496 static inline struct process_dll *find_process_dll( struct process *process, void *base )
497 {
498     struct process_dll *dll;
499
500     LIST_FOR_EACH_ENTRY( dll, &process->dlls, struct process_dll, entry )
501     {
502         if (dll->base == base) return dll;
503     }
504     return NULL;
505 }
506
507 /* add a dll to a process list */
508 static struct process_dll *process_load_dll( struct process *process, struct file *file,
509                                              void *base, const WCHAR *filename, data_size_t name_len )
510 {
511     struct process_dll *dll;
512
513     /* make sure we don't already have one with the same base address */
514     if (find_process_dll( process, base ))
515     {
516         set_error( STATUS_INVALID_PARAMETER );
517         return NULL;
518     }
519
520     if ((dll = mem_alloc( sizeof(*dll) )))
521     {
522         dll->file = NULL;
523         dll->base = base;
524         dll->filename = NULL;
525         dll->namelen  = name_len;
526         if (name_len && !(dll->filename = memdup( filename, name_len )))
527         {
528             free( dll );
529             return NULL;
530         }
531         if (file) dll->file = grab_file_unless_removable( file );
532         list_add_tail( &process->dlls, &dll->entry );
533     }
534     return dll;
535 }
536
537 /* remove a dll from a process list */
538 static void process_unload_dll( struct process *process, void *base )
539 {
540     struct process_dll *dll = find_process_dll( process, base );
541
542     if (dll && (&dll->entry != list_head( &process->dlls )))  /* main exe can't be unloaded */
543     {
544         if (dll->file) release_object( dll->file );
545         free( dll->filename );
546         list_remove( &dll->entry );
547         free( dll );
548         generate_debug_event( current, UNLOAD_DLL_DEBUG_EVENT, base );
549     }
550     else set_error( STATUS_INVALID_PARAMETER );
551 }
552
553 /* terminate a process with the given exit code */
554 static void terminate_process( struct process *process, struct thread *skip, int exit_code )
555 {
556     struct list *ptr;
557
558     if (skip && skip->process == process)  /* move it to the end of the list */
559     {
560         assert( skip->state != TERMINATED );
561         list_remove( &skip->proc_entry );
562         list_add_tail( &process->thread_list, &skip->proc_entry );
563     }
564
565     grab_object( process );  /* make sure it doesn't get freed when threads die */
566     while ((ptr = list_head( &process->thread_list )))
567     {
568         struct thread *thread = LIST_ENTRY( ptr, struct thread, proc_entry );
569
570         if (exit_code) thread->exit_code = exit_code;
571         if (thread == skip) break;
572         kill_thread( thread, 1 );
573     }
574     release_object( process );
575 }
576
577 /* kill all processes */
578 static void kill_all_processes( struct process *skip, int exit_code )
579 {
580     for (;;)
581     {
582         struct process *process;
583
584         LIST_FOR_EACH_ENTRY( process, &process_list, struct process, entry )
585         {
586             if (process == skip) continue;
587             if (process->running_threads) break;
588         }
589         if (&process->entry == &process_list) break;  /* no process found */
590         terminate_process( process, NULL, exit_code );
591     }
592 }
593
594 /* forced shutdown, used for wineserver -k */
595 void shutdown_master_socket(void)
596 {
597     kill_all_processes( NULL, 1 );
598     master_socket_timeout = 0;
599     if (shutdown_timeout)
600     {
601         remove_timeout_user( shutdown_timeout );
602         shutdown_timeout = NULL;
603     }
604     if (!shutting_down) server_shutdown_timeout( NULL );
605 }
606
607 /* kill all processes being attached to a console renderer */
608 void kill_console_processes( struct thread *renderer, int exit_code )
609 {
610     for (;;)  /* restart from the beginning of the list every time */
611     {
612         struct process *process;
613
614         /* find the first process being attached to 'renderer' and still running */
615         LIST_FOR_EACH_ENTRY( process, &process_list, struct process, entry )
616         {
617             if (process == renderer->process) continue;
618             if (!process->running_threads) continue;
619             if (process->console && console_get_renderer( process->console ) == renderer) break;
620         }
621         if (&process->entry == &process_list) break;  /* no process found */
622         terminate_process( process, NULL, exit_code );
623     }
624 }
625
626 /* a process has been killed (i.e. its last thread died) */
627 static void process_killed( struct process *process )
628 {
629     struct handle_table *handles;
630     struct list *ptr;
631
632     assert( list_empty( &process->thread_list ));
633     process->end_time = current_time;
634     if (!process->is_system) close_process_desktop( process );
635     handles = process->handles;
636     process->handles = NULL;
637     if (handles) release_object( handles );
638
639     /* close the console attached to this process, if any */
640     free_console( process );
641
642     while ((ptr = list_head( &process->dlls )))
643     {
644         struct process_dll *dll = LIST_ENTRY( ptr, struct process_dll, entry );
645         if (dll->file) release_object( dll->file );
646         free( dll->filename );
647         list_remove( &dll->entry );
648         free( dll );
649     }
650     destroy_process_classes( process );
651     remove_process_locks( process );
652     set_process_startup_state( process, STARTUP_ABORTED );
653     finish_process_tracing( process );
654     start_sigkill_timer( process );
655     wake_up( &process->obj, 0 );
656 }
657
658 /* add a thread to a process running threads list */
659 void add_process_thread( struct process *process, struct thread *thread )
660 {
661     list_add_tail( &process->thread_list, &thread->proc_entry );
662     if (!process->running_threads++)
663     {
664         running_processes++;
665         if (!process->is_system)
666         {
667             if (!user_processes++ && shutdown_timeout)
668             {
669                 remove_timeout_user( shutdown_timeout );
670                 shutdown_timeout = NULL;
671             }
672         }
673     }
674     grab_object( thread );
675 }
676
677 /* remove a thread from a process running threads list */
678 void remove_process_thread( struct process *process, struct thread *thread )
679 {
680     assert( process->running_threads > 0 );
681     assert( !list_empty( &process->thread_list ));
682
683     list_remove( &thread->proc_entry );
684
685     if (!--process->running_threads)
686     {
687         /* we have removed the last running thread, exit the process */
688         process->exit_code = thread->exit_code;
689         generate_debug_event( thread, EXIT_PROCESS_DEBUG_EVENT, process );
690         process_killed( process );
691     }
692     else generate_debug_event( thread, EXIT_THREAD_DEBUG_EVENT, thread );
693     release_object( thread );
694 }
695
696 /* suspend all the threads of a process */
697 void suspend_process( struct process *process )
698 {
699     if (!process->suspend++)
700     {
701         struct list *ptr, *next;
702
703         LIST_FOR_EACH_SAFE( ptr, next, &process->thread_list )
704         {
705             struct thread *thread = LIST_ENTRY( ptr, struct thread, proc_entry );
706             if (!thread->suspend) stop_thread( thread );
707         }
708     }
709 }
710
711 /* resume all the threads of a process */
712 void resume_process( struct process *process )
713 {
714     assert (process->suspend > 0);
715     if (!--process->suspend)
716     {
717         struct list *ptr, *next;
718
719         LIST_FOR_EACH_SAFE( ptr, next, &process->thread_list )
720         {
721             struct thread *thread = LIST_ENTRY( ptr, struct thread, proc_entry );
722             if (!thread->suspend) wake_thread( thread );
723         }
724     }
725 }
726
727 /* kill a process on the spot */
728 void kill_process( struct process *process, int violent_death )
729 {
730     if (violent_death) terminate_process( process, NULL, 1 );
731     else
732     {
733         struct list *ptr;
734
735         grab_object( process );  /* make sure it doesn't get freed when threads die */
736         while ((ptr = list_head( &process->thread_list )))
737         {
738             struct thread *thread = LIST_ENTRY( ptr, struct thread, proc_entry );
739             kill_thread( thread, 0 );
740         }
741         release_object( process );
742     }
743 }
744
745 /* kill all processes being debugged by a given thread */
746 void kill_debugged_processes( struct thread *debugger, int exit_code )
747 {
748     for (;;)  /* restart from the beginning of the list every time */
749     {
750         struct process *process;
751
752         /* find the first process being debugged by 'debugger' and still running */
753         LIST_FOR_EACH_ENTRY( process, &process_list, struct process, entry )
754         {
755             if (!process->running_threads) continue;
756             if (process->debugger == debugger) break;
757         }
758         if (&process->entry == &process_list) break;  /* no process found */
759         process->debugger = NULL;
760         terminate_process( process, NULL, exit_code );
761     }
762 }
763
764
765 /* trigger a breakpoint event in a given process */
766 void break_process( struct process *process )
767 {
768     struct thread *thread;
769
770     suspend_process( process );
771
772     LIST_FOR_EACH_ENTRY( thread, &process->thread_list, struct thread, proc_entry )
773     {
774         if (thread->context)  /* inside an exception event already */
775         {
776             break_thread( thread );
777             goto done;
778         }
779     }
780     if ((thread = get_process_first_thread( process ))) thread->debug_break = 1;
781     else set_error( STATUS_ACCESS_DENIED );
782 done:
783     resume_process( process );
784 }
785
786
787 /* detach a debugger from all its debuggees */
788 void detach_debugged_processes( struct thread *debugger )
789 {
790     struct process *process;
791
792     LIST_FOR_EACH_ENTRY( process, &process_list, struct process, entry )
793     {
794         if (process->debugger == debugger && process->running_threads)
795         {
796             debugger_detach( process, debugger );
797         }
798     }
799 }
800
801
802 void enum_processes( int (*cb)(struct process*, void*), void *user )
803 {
804     struct list *ptr, *next;
805
806     LIST_FOR_EACH_SAFE( ptr, next, &process_list )
807     {
808         struct process *process = LIST_ENTRY( ptr, struct process, entry );
809         if ((cb)(process, user)) break;
810     }
811 }
812
813 /* set the debugged flag in the process PEB */
814 int set_process_debug_flag( struct process *process, int flag )
815 {
816     char data = (flag != 0);
817
818     /* BeingDebugged flag is the byte at offset 2 in the PEB */
819     return write_process_memory( process, (char *)process->peb + 2, 1, &data );
820 }
821
822 /* take a snapshot of currently running processes */
823 struct process_snapshot *process_snap( int *count )
824 {
825     struct process_snapshot *snapshot, *ptr;
826     struct process *process;
827
828     if (!running_processes) return NULL;
829     if (!(snapshot = mem_alloc( sizeof(*snapshot) * running_processes )))
830         return NULL;
831     ptr = snapshot;
832     LIST_FOR_EACH_ENTRY( process, &process_list, struct process, entry )
833     {
834         if (!process->running_threads) continue;
835         ptr->process  = process;
836         ptr->threads  = process->running_threads;
837         ptr->count    = process->obj.refcount;
838         ptr->priority = process->priority;
839         ptr->handles  = get_handle_table_count(process);
840         grab_object( process );
841         ptr++;
842     }
843
844     if (!(*count = ptr - snapshot))
845     {
846         free( snapshot );
847         snapshot = NULL;
848     }
849     return snapshot;
850 }
851
852 /* take a snapshot of the modules of a process */
853 struct module_snapshot *module_snap( struct process *process, int *count )
854 {
855     struct module_snapshot *snapshot, *ptr;
856     struct process_dll *dll;
857     int total = 0;
858
859     LIST_FOR_EACH_ENTRY( dll, &process->dlls, struct process_dll, entry ) total++;
860     if (!(snapshot = mem_alloc( sizeof(*snapshot) * total ))) return NULL;
861
862     ptr = snapshot;
863     LIST_FOR_EACH_ENTRY( dll, &process->dlls, struct process_dll, entry )
864     {
865         ptr->base     = dll->base;
866         ptr->size     = dll->size;
867         ptr->namelen  = dll->namelen;
868         ptr->filename = memdup( dll->filename, dll->namelen );
869         ptr++;
870     }
871     *count = total;
872     return snapshot;
873 }
874
875
876 /* create a new process */
877 DECL_HANDLER(new_process)
878 {
879     struct startup_info *info;
880     struct thread *thread;
881     struct process *process;
882     struct process *parent = current->process;
883     int socket_fd = thread_get_inflight_fd( current, req->socket_fd );
884
885     if (socket_fd == -1)
886     {
887         set_error( STATUS_INVALID_PARAMETER );
888         return;
889     }
890     if (fcntl( socket_fd, F_SETFL, O_NONBLOCK ) == -1)
891     {
892         set_error( STATUS_INVALID_HANDLE );
893         close( socket_fd );
894         return;
895     }
896     if (shutting_down)
897     {
898         set_error( STATUS_SHUTDOWN_IN_PROGRESS );
899         close( socket_fd );
900         return;
901     }
902
903     /* build the startup info for a new process */
904     if (!(info = alloc_object( &startup_info_ops ))) return;
905     info->hstdin       = req->hstdin;
906     info->hstdout      = req->hstdout;
907     info->hstderr      = req->hstderr;
908     info->exe_file     = NULL;
909     info->process      = NULL;
910     info->data_size    = get_req_data_size();
911     info->data         = NULL;
912
913     if (req->exe_file &&
914         !(info->exe_file = get_file_obj( current->process, req->exe_file, FILE_READ_DATA )))
915         goto done;
916
917     if (!(info->data = memdup( get_req_data(), info->data_size ))) goto done;
918
919     if (!(thread = create_process( socket_fd, current, req->inherit_all ))) goto done;
920     process = thread->process;
921     process->create_flags = req->create_flags;
922     process->startup_info = (struct startup_info *)grab_object( info );
923
924     /* connect to the window station */
925     connect_process_winstation( process, current );
926
927     /* thread will be actually suspended in init_done */
928     if (req->create_flags & CREATE_SUSPENDED) thread->suspend++;
929
930     /* set the process console */
931     if (!(req->create_flags & (DETACHED_PROCESS | CREATE_NEW_CONSOLE)))
932     {
933         /* FIXME: some better error checking should be done...
934          * like if hConOut and hConIn are console handles, then they should be on the same
935          * physical console
936          */
937         inherit_console( current, process, req->inherit_all ? req->hstdin : 0 );
938     }
939
940     if (!req->inherit_all && !(req->create_flags & CREATE_NEW_CONSOLE))
941     {
942         info->hstdin  = duplicate_handle( parent, req->hstdin, process,
943                                           0, OBJ_INHERIT, DUPLICATE_SAME_ACCESS );
944         info->hstdout = duplicate_handle( parent, req->hstdout, process,
945                                           0, OBJ_INHERIT, DUPLICATE_SAME_ACCESS );
946         info->hstderr = duplicate_handle( parent, req->hstderr, process,
947                                           0, OBJ_INHERIT, DUPLICATE_SAME_ACCESS );
948         /* some handles above may have been invalid; this is not an error */
949         if (get_error() == STATUS_INVALID_HANDLE ||
950             get_error() == STATUS_OBJECT_TYPE_MISMATCH) clear_error();
951     }
952
953     /* attach to the debugger if requested */
954     if (req->create_flags & (DEBUG_PROCESS | DEBUG_ONLY_THIS_PROCESS))
955         set_process_debugger( process, current );
956     else if (parent->debugger && !(parent->create_flags & DEBUG_ONLY_THIS_PROCESS))
957         set_process_debugger( process, parent->debugger );
958
959     if (!(req->create_flags & CREATE_NEW_PROCESS_GROUP))
960         process->group_id = parent->group_id;
961
962     info->process = (struct process *)grab_object( process );
963     reply->info = alloc_handle( current->process, info, SYNCHRONIZE, 0 );
964     reply->pid = get_process_id( process );
965     reply->tid = get_thread_id( thread );
966     reply->phandle = alloc_handle( parent, process, req->process_access, req->process_attr );
967     reply->thandle = alloc_handle( parent, thread, req->thread_access, req->thread_attr );
968
969  done:
970     release_object( info );
971 }
972
973 /* Retrieve information about a newly started process */
974 DECL_HANDLER(get_new_process_info)
975 {
976     struct startup_info *info;
977
978     if ((info = (struct startup_info *)get_handle_obj( current->process, req->info,
979                                                        0, &startup_info_ops )))
980     {
981         reply->success = is_process_init_done( info->process );
982         reply->exit_code = info->process->exit_code;
983         release_object( info );
984     }
985 }
986
987 /* Retrieve the new process startup info */
988 DECL_HANDLER(get_startup_info)
989 {
990     struct process *process = current->process;
991     struct startup_info *info = process->startup_info;
992     data_size_t size;
993
994     if (!info) return;
995
996     if (info->exe_file &&
997         !(reply->exe_file = alloc_handle( process, info->exe_file, GENERIC_READ, 0 ))) return;
998
999     reply->hstdin  = info->hstdin;
1000     reply->hstdout = info->hstdout;
1001     reply->hstderr = info->hstderr;
1002
1003     /* we return the data directly without making a copy so this can only be called once */
1004     size = info->data_size;
1005     if (size > get_reply_max_size()) size = get_reply_max_size();
1006     set_reply_data_ptr( info->data, size );
1007     info->data = NULL;
1008     info->data_size = 0;
1009 }
1010
1011 /* signal the end of the process initialization */
1012 DECL_HANDLER(init_process_done)
1013 {
1014     struct process_dll *dll;
1015     struct process *process = current->process;
1016
1017     if (is_process_init_done(process))
1018     {
1019         set_error( STATUS_INVALID_PARAMETER );
1020         return;
1021     }
1022     if (!(dll = find_process_dll( process, req->module )))
1023     {
1024         set_error( STATUS_DLL_NOT_FOUND );
1025         return;
1026     }
1027
1028     /* main exe is the first in the dll list */
1029     list_remove( &dll->entry );
1030     list_add_head( &process->dlls, &dll->entry );
1031
1032     generate_startup_debug_events( process, req->entry );
1033     set_process_startup_state( process, STARTUP_DONE );
1034
1035     if (req->gui) process->idle_event = create_event( NULL, NULL, 0, 1, 0, NULL );
1036     if (current->suspend + process->suspend > 0) stop_thread( current );
1037     if (process->debugger) set_process_debug_flag( process, 1 );
1038 }
1039
1040 /* open a handle to a process */
1041 DECL_HANDLER(open_process)
1042 {
1043     struct process *process = get_process_from_id( req->pid );
1044     reply->handle = 0;
1045     if (process)
1046     {
1047         reply->handle = alloc_handle( current->process, process, req->access, req->attributes );
1048         release_object( process );
1049     }
1050 }
1051
1052 /* terminate a process */
1053 DECL_HANDLER(terminate_process)
1054 {
1055     struct process *process;
1056
1057     if ((process = get_process_from_handle( req->handle, PROCESS_TERMINATE )))
1058     {
1059         reply->self = (current->process == process);
1060         terminate_process( process, current, req->exit_code );
1061         release_object( process );
1062     }
1063 }
1064
1065 /* fetch information about a process */
1066 DECL_HANDLER(get_process_info)
1067 {
1068     struct process *process;
1069
1070     if ((process = get_process_from_handle( req->handle, PROCESS_QUERY_INFORMATION )))
1071     {
1072         reply->pid              = get_process_id( process );
1073         reply->ppid             = process->parent ? get_process_id( process->parent ) : 0;
1074         reply->exit_code        = process->exit_code;
1075         reply->priority         = process->priority;
1076         reply->affinity         = process->affinity;
1077         reply->peb              = process->peb;
1078         reply->start_time       = process->start_time;
1079         reply->end_time         = process->end_time;
1080         release_object( process );
1081     }
1082 }
1083
1084 /* set information about a process */
1085 DECL_HANDLER(set_process_info)
1086 {
1087     struct process *process;
1088
1089     if ((process = get_process_from_handle( req->handle, PROCESS_SET_INFORMATION )))
1090     {
1091         if (req->mask & SET_PROCESS_INFO_PRIORITY) process->priority = req->priority;
1092         if (req->mask & SET_PROCESS_INFO_AFFINITY)
1093         {
1094             if (req->affinity != 1) set_error( STATUS_INVALID_PARAMETER );
1095             else process->affinity = req->affinity;
1096         }
1097         release_object( process );
1098     }
1099 }
1100
1101 /* read data from a process address space */
1102 DECL_HANDLER(read_process_memory)
1103 {
1104     struct process *process;
1105     data_size_t len = get_reply_max_size();
1106
1107     if (!(process = get_process_from_handle( req->handle, PROCESS_VM_READ ))) return;
1108
1109     if (len)
1110     {
1111         char *buffer = mem_alloc( len );
1112         if (buffer)
1113         {
1114             if (read_process_memory( process, req->addr, len, buffer ))
1115                 set_reply_data_ptr( buffer, len );
1116             else
1117                 free( buffer );
1118         }
1119     }
1120     release_object( process );
1121 }
1122
1123 /* write data to a process address space */
1124 DECL_HANDLER(write_process_memory)
1125 {
1126     struct process *process;
1127
1128     if ((process = get_process_from_handle( req->handle, PROCESS_VM_WRITE )))
1129     {
1130         data_size_t len = get_req_data_size();
1131         if (len) write_process_memory( process, req->addr, len, get_req_data() );
1132         else set_error( STATUS_INVALID_PARAMETER );
1133         release_object( process );
1134     }
1135 }
1136
1137 /* notify the server that a dll has been loaded */
1138 DECL_HANDLER(load_dll)
1139 {
1140     struct process_dll *dll;
1141     struct file *file = NULL;
1142
1143     if (req->handle && !(file = get_file_obj( current->process, req->handle, FILE_READ_DATA )))
1144         return;
1145
1146     if ((dll = process_load_dll( current->process, file, req->base,
1147                                  get_req_data(), get_req_data_size() )))
1148     {
1149         dll->size       = req->size;
1150         dll->dbg_offset = req->dbg_offset;
1151         dll->dbg_size   = req->dbg_size;
1152         dll->name       = req->name;
1153         /* only generate event if initialization is done */
1154         if (is_process_init_done( current->process ))
1155             generate_debug_event( current, LOAD_DLL_DEBUG_EVENT, dll );
1156     }
1157     if (file) release_object( file );
1158 }
1159
1160 /* notify the server that a dll is being unloaded */
1161 DECL_HANDLER(unload_dll)
1162 {
1163     process_unload_dll( current->process, req->base );
1164 }
1165
1166 /* retrieve information about a module in a process */
1167 DECL_HANDLER(get_dll_info)
1168 {
1169     struct process *process;
1170
1171     if ((process = get_process_from_handle( req->handle, PROCESS_QUERY_INFORMATION )))
1172     {
1173         struct process_dll *dll;
1174
1175         if (req->base_address)
1176             dll = find_process_dll( process, req->base_address );
1177         else /* NULL means main module */
1178             dll = list_head( &process->dlls ) ?
1179                 LIST_ENTRY(list_head( &process->dlls ), struct process_dll, entry) : NULL;
1180
1181         if (dll)
1182         {
1183             reply->size = dll->size;
1184             reply->entry_point = NULL; /* FIXME */
1185             reply->filename_len = dll->namelen;
1186             if (dll->filename)
1187             {
1188                 if (dll->namelen <= get_reply_max_size())
1189                     set_reply_data( dll->filename, dll->namelen );
1190                 else
1191                     set_error( STATUS_BUFFER_TOO_SMALL );
1192             }
1193         }
1194         else
1195             set_error( STATUS_DLL_NOT_FOUND );
1196
1197         release_object( process );
1198     }
1199 }
1200
1201 /* retrieve the process idle event */
1202 DECL_HANDLER(get_process_idle_event)
1203 {
1204     struct process *process;
1205
1206     reply->event = 0;
1207     if ((process = get_process_from_handle( req->handle, PROCESS_QUERY_INFORMATION )))
1208     {
1209         if (process->idle_event && process != current->process)
1210             reply->event = alloc_handle( current->process, process->idle_event,
1211                                          EVENT_ALL_ACCESS, 0 );
1212         release_object( process );
1213     }
1214 }
1215
1216 /* make the current process a system process */
1217 DECL_HANDLER(make_process_system)
1218 {
1219     struct process *process = current->process;
1220
1221     if (!shutdown_event)
1222     {
1223         if (!(shutdown_event = create_event( NULL, NULL, 0, 1, 0, NULL ))) return;
1224         make_object_static( (struct object *)shutdown_event );
1225     }
1226
1227     if (!(reply->event = alloc_handle( current->process, shutdown_event, SYNCHRONIZE, 0 )))
1228         return;
1229
1230     if (!process->is_system)
1231     {
1232         process->is_system = 1;
1233         close_process_desktop( process );
1234         if (!--user_processes && master_socket_timeout != TIMEOUT_INFINITE)
1235             shutdown_timeout = add_timeout_user( master_socket_timeout, server_shutdown_timeout, NULL );
1236     }
1237 }