No longer directly accessing debuggee memory.
[wine] / server / trace.c
1 /*
2  * Server request tracing
3  *
4  * Copyright (C) 1999 Alexandre Julliard
5  */
6
7 #include <ctype.h>
8 #include <stdio.h>
9 #include <sys/types.h>
10 #include <sys/uio.h>
11 #include "winsock2.h"
12 #include "winnt.h"
13 #include "request.h"
14 #include "unicode.h"
15
16
17 /* utility functions */
18
19 static void dump_ints( const int *ptr, int len )
20 {
21     fputc( '{', stderr );
22     while (len)
23     {
24         fprintf( stderr, "%d", *ptr++ );
25         if (--len) fputc( ',', stderr );
26     }
27     fputc( '}', stderr );
28 }
29
30 static void dump_uints( const int *ptr, int len )
31 {
32     fputc( '{', stderr );
33     while (len)
34     {
35         fprintf( stderr, "%08x", *ptr++ );
36         if (--len) fputc( ',', stderr );
37     }
38     fputc( '}', stderr );
39 }
40
41 static void dump_bytes( const unsigned char *ptr, int len )
42 {
43     fputc( '{', stderr );
44     while (len)
45     {
46         fprintf( stderr, "%02x", *ptr++ );
47         if (--len) fputc( ',', stderr );
48     }
49     fputc( '}', stderr );
50 }
51
52 static void dump_unicode_string( const WCHAR *str )
53 {
54     fprintf( stderr, "L\"" );
55     dump_strW( str, strlenW(str), stderr, "\"\"" );
56     fputc( '\"', stderr );
57 }
58
59 static void dump_path_t( const path_t *path )
60 {
61     dump_unicode_string( *path );
62 }
63
64 static void dump_context( const CONTEXT *context )
65 {
66 #ifdef __i386__
67     fprintf( stderr, "{flags=%08lx,eax=%08lx,ebx=%08lx,ecx=%08lx,edx=%08lx,esi=%08lx,edi=%08lx,"
68              "ebp=%08lx,eip=%08lx,esp=%08lx,eflags=%08lx,cs=%04lx,ds=%04lx,es=%04lx,"
69              "fs=%04lx,gs=%04lx,dr0=%08lx,dr1=%08lx,dr2=%08lx,dr3=%08lx,dr6=%08lx,dr7=%08lx,",
70              context->ContextFlags, context->Eax, context->Ebx, context->Ecx, context->Edx,
71              context->Esi, context->Edi, context->Ebp, context->Eip, context->Esp, context->EFlags,
72              context->SegCs, context->SegDs, context->SegEs, context->SegFs, context->SegGs,
73              context->Dr0, context->Dr1, context->Dr2, context->Dr3, context->Dr6, context->Dr7 );
74     fprintf( stderr, "float=" );
75     dump_uints( (int *)&context->FloatSave, sizeof(context->FloatSave) / sizeof(int) );
76     fprintf( stderr, "}" );
77 #else
78     dump_uints( (int *)context, sizeof(*context) / sizeof(int) );
79 #endif
80 }
81
82 static void dump_debug_event_t( const debug_event_t *event )
83 {
84     int i;
85     switch(event->code)
86     {
87     case EXCEPTION_DEBUG_EVENT:
88         fprintf( stderr, "{exception,code=%x,flags=%x,rec=%p,addr=%p,params={",
89                  event->info.exception.code, event->info.exception.flags,
90                  event->info.exception.record, event->info.exception.addr );
91         for (i = 0; i < event->info.exception.nb_params; i++)
92         {
93             if (i) fputc( ',', stderr );
94             fprintf( stderr, "%x", event->info.exception.params[i] );
95         }
96         fprintf( stderr, "},first_chance=%d,context=", event->info.exception.first_chance );
97         dump_context( &event->info.exception.context );
98         fputc( '}', stderr );
99         break;
100     case CREATE_THREAD_DEBUG_EVENT:
101         fprintf( stderr, "{create_thread,thread=%d,teb=%p,start=%p}",
102                  event->info.create_thread.handle, event->info.create_thread.teb,
103                  event->info.create_thread.start );
104         break;
105     case CREATE_PROCESS_DEBUG_EVENT:
106         fprintf( stderr, "{create_process,file=%d,process=%d,thread=%d,base=%p,offset=%d,"
107                          "size=%d,teb=%p,start=%p,name=%p,unicode=%d}",
108                  event->info.create_process.file, event->info.create_process.process,
109                  event->info.create_process.thread, event->info.create_process.base,
110                  event->info.create_process.dbg_offset, event->info.create_process.dbg_size,
111                  event->info.create_process.teb, event->info.create_process.start,
112                  event->info.create_process.name, event->info.create_process.unicode );
113         break;
114     case EXIT_THREAD_DEBUG_EVENT:
115         fprintf( stderr, "{exit_thread,code=%d}", event->info.exit.exit_code );
116         break;
117     case EXIT_PROCESS_DEBUG_EVENT:
118         fprintf( stderr, "{exit_process,code=%d}", event->info.exit.exit_code );
119         break;
120     case LOAD_DLL_DEBUG_EVENT:
121         fprintf( stderr, "{load_dll,file=%d,base=%p,offset=%d,size=%d,name=%p,unicode=%d}",
122                  event->info.load_dll.handle, event->info.load_dll.base,
123                  event->info.load_dll.dbg_offset, event->info.load_dll.dbg_size,
124                  event->info.load_dll.name, event->info.load_dll.unicode );
125         break;
126     case UNLOAD_DLL_DEBUG_EVENT:
127         fprintf( stderr, "{unload_dll,base=%p}", event->info.unload_dll.base );
128         break;
129     case OUTPUT_DEBUG_STRING_EVENT:
130         fprintf( stderr, "{output_string,data=%p,unicode=%d,len=%d}",
131                  event->info.output_string.string, event->info.output_string.unicode,
132                  event->info.output_string.length );
133         break;
134     case RIP_EVENT:
135         fprintf( stderr, "{rip,err=%d,type=%d}",
136                  event->info.rip_info.error, event->info.rip_info.type );
137         break;
138     case 0:  /* zero is the code returned on timeouts */
139         fprintf( stderr, "{}" );
140         break;
141     default:
142         fprintf( stderr, "{code=??? (%d)}", event->code );
143         break;
144     }
145 }
146
147
148 /* dumping for functions for requests that have a variable part */
149
150 static void dump_varargs_select_request( const struct select_request *req )
151 {
152     dump_ints( req->handles, req->count );
153 }
154
155 static void dump_varargs_get_apcs_reply( const struct get_apcs_request *req )
156 {
157     int i;
158     for (i = 0; i < 2 * req->count; i++)
159         fprintf( stderr, "%c%p", i ? ',' : '{', req->apcs[i] );
160     fprintf( stderr, "}" );
161 }
162
163 static void dump_varargs_get_socket_event_reply( const struct get_socket_event_request *req )
164 {
165     dump_ints( req->errors, FD_MAX_EVENTS );
166 }
167
168 static void dump_varargs_read_process_memory_reply( const struct read_process_memory_request *req )
169 {
170     int count = MIN( req->len, get_req_size( req->data, sizeof(int) ) );
171     dump_bytes( (unsigned char *)req->data, count * sizeof(int) );
172 }
173
174 static void dump_varargs_write_process_memory_request( const struct write_process_memory_request *req )
175 {
176     int count = MIN( req->len, get_req_size( req->data, sizeof(int) ) );
177     dump_bytes( (unsigned char *)req->data, count * sizeof(int) );
178 }
179
180 static void dump_varargs_set_key_value_request( const struct set_key_value_request *req )
181 {
182     dump_bytes( req->data, req->len );
183 }
184
185 static void dump_varargs_get_key_value_reply( const struct get_key_value_request *req )
186 {
187     dump_bytes( req->data, req->len );
188 }
189
190 static void dump_varargs_enum_key_value_reply( const struct enum_key_value_request *req )
191 {
192     dump_bytes( req->data, req->len );
193 }
194
195 typedef void (*dump_func)( const void *req );
196
197 /* Everything below this line is generated automatically by tools/make_requests */
198 /* ### make_requests begin ### */
199
200 static void dump_new_process_request( const struct new_process_request *req )
201 {
202     fprintf( stderr, " inherit=%d,", req->inherit );
203     fprintf( stderr, " inherit_all=%d,", req->inherit_all );
204     fprintf( stderr, " create_flags=%d,", req->create_flags );
205     fprintf( stderr, " start_flags=%d,", req->start_flags );
206     fprintf( stderr, " exe_file=%d,", req->exe_file );
207     fprintf( stderr, " hstdin=%d,", req->hstdin );
208     fprintf( stderr, " hstdout=%d,", req->hstdout );
209     fprintf( stderr, " hstderr=%d,", req->hstderr );
210     fprintf( stderr, " event=%d,", req->event );
211     fprintf( stderr, " cmd_show=%d,", req->cmd_show );
212     fprintf( stderr, " env_ptr=%p,", req->env_ptr );
213     fprintf( stderr, " cmdline=\"%s\"", req->cmdline );
214 }
215
216 static void dump_new_process_reply( const struct new_process_request *req )
217 {
218     fprintf( stderr, " pid=%p,", req->pid );
219     fprintf( stderr, " phandle=%d,", req->phandle );
220     fprintf( stderr, " tid=%p,", req->tid );
221     fprintf( stderr, " thandle=%d", req->thandle );
222 }
223
224 static void dump_new_thread_request( const struct new_thread_request *req )
225 {
226     fprintf( stderr, " suspend=%d,", req->suspend );
227     fprintf( stderr, " inherit=%d", req->inherit );
228 }
229
230 static void dump_new_thread_reply( const struct new_thread_request *req )
231 {
232     fprintf( stderr, " tid=%p,", req->tid );
233     fprintf( stderr, " handle=%d", req->handle );
234 }
235
236 static void dump_boot_done_request( const struct boot_done_request *req )
237 {
238     fprintf( stderr, " debug_level=%d", req->debug_level );
239 }
240
241 static void dump_init_process_request( const struct init_process_request *req )
242 {
243     fprintf( stderr, " ldt_copy=%p,", req->ldt_copy );
244     fprintf( stderr, " ldt_flags=%p", req->ldt_flags );
245 }
246
247 static void dump_init_process_reply( const struct init_process_request *req )
248 {
249     fprintf( stderr, " start_flags=%d,", req->start_flags );
250     fprintf( stderr, " exe_file=%d,", req->exe_file );
251     fprintf( stderr, " hstdin=%d,", req->hstdin );
252     fprintf( stderr, " hstdout=%d,", req->hstdout );
253     fprintf( stderr, " hstderr=%d,", req->hstderr );
254     fprintf( stderr, " cmd_show=%d,", req->cmd_show );
255     fprintf( stderr, " env_ptr=%p,", req->env_ptr );
256     fprintf( stderr, " cmdline=\"%s\"", req->cmdline );
257 }
258
259 static void dump_init_process_done_request( const struct init_process_done_request *req )
260 {
261     fprintf( stderr, " module=%p,", req->module );
262     fprintf( stderr, " entry=%p", req->entry );
263 }
264
265 static void dump_init_process_done_reply( const struct init_process_done_request *req )
266 {
267     fprintf( stderr, " debugged=%d", req->debugged );
268 }
269
270 static void dump_init_thread_request( const struct init_thread_request *req )
271 {
272     fprintf( stderr, " unix_pid=%d,", req->unix_pid );
273     fprintf( stderr, " teb=%p,", req->teb );
274     fprintf( stderr, " entry=%p", req->entry );
275 }
276
277 static void dump_get_thread_buffer_request( const struct get_thread_buffer_request *req )
278 {
279 }
280
281 static void dump_get_thread_buffer_reply( const struct get_thread_buffer_request *req )
282 {
283     fprintf( stderr, " pid=%p,", req->pid );
284     fprintf( stderr, " tid=%p,", req->tid );
285     fprintf( stderr, " boot=%d", req->boot );
286 }
287
288 static void dump_terminate_process_request( const struct terminate_process_request *req )
289 {
290     fprintf( stderr, " handle=%d,", req->handle );
291     fprintf( stderr, " exit_code=%d", req->exit_code );
292 }
293
294 static void dump_terminate_thread_request( const struct terminate_thread_request *req )
295 {
296     fprintf( stderr, " handle=%d,", req->handle );
297     fprintf( stderr, " exit_code=%d", req->exit_code );
298 }
299
300 static void dump_get_process_info_request( const struct get_process_info_request *req )
301 {
302     fprintf( stderr, " handle=%d", req->handle );
303 }
304
305 static void dump_get_process_info_reply( const struct get_process_info_request *req )
306 {
307     fprintf( stderr, " pid=%p,", req->pid );
308     fprintf( stderr, " debugged=%d,", req->debugged );
309     fprintf( stderr, " exit_code=%d,", req->exit_code );
310     fprintf( stderr, " priority=%d,", req->priority );
311     fprintf( stderr, " process_affinity=%d,", req->process_affinity );
312     fprintf( stderr, " system_affinity=%d", req->system_affinity );
313 }
314
315 static void dump_set_process_info_request( const struct set_process_info_request *req )
316 {
317     fprintf( stderr, " handle=%d,", req->handle );
318     fprintf( stderr, " mask=%d,", req->mask );
319     fprintf( stderr, " priority=%d,", req->priority );
320     fprintf( stderr, " affinity=%d", req->affinity );
321 }
322
323 static void dump_get_thread_info_request( const struct get_thread_info_request *req )
324 {
325     fprintf( stderr, " handle=%d", req->handle );
326 }
327
328 static void dump_get_thread_info_reply( const struct get_thread_info_request *req )
329 {
330     fprintf( stderr, " tid=%p,", req->tid );
331     fprintf( stderr, " exit_code=%d,", req->exit_code );
332     fprintf( stderr, " priority=%d", req->priority );
333 }
334
335 static void dump_set_thread_info_request( const struct set_thread_info_request *req )
336 {
337     fprintf( stderr, " handle=%d,", req->handle );
338     fprintf( stderr, " mask=%d,", req->mask );
339     fprintf( stderr, " priority=%d,", req->priority );
340     fprintf( stderr, " affinity=%d", req->affinity );
341 }
342
343 static void dump_suspend_thread_request( const struct suspend_thread_request *req )
344 {
345     fprintf( stderr, " handle=%d", req->handle );
346 }
347
348 static void dump_suspend_thread_reply( const struct suspend_thread_request *req )
349 {
350     fprintf( stderr, " count=%d", req->count );
351 }
352
353 static void dump_resume_thread_request( const struct resume_thread_request *req )
354 {
355     fprintf( stderr, " handle=%d", req->handle );
356 }
357
358 static void dump_resume_thread_reply( const struct resume_thread_request *req )
359 {
360     fprintf( stderr, " count=%d", req->count );
361 }
362
363 static void dump_debugger_request( const struct debugger_request *req )
364 {
365     fprintf( stderr, " op=%d", req->op );
366 }
367
368 static void dump_queue_apc_request( const struct queue_apc_request *req )
369 {
370     fprintf( stderr, " handle=%d,", req->handle );
371     fprintf( stderr, " func=%p,", req->func );
372     fprintf( stderr, " param=%p", req->param );
373 }
374
375 static void dump_get_apcs_request( const struct get_apcs_request *req )
376 {
377 }
378
379 static void dump_get_apcs_reply( const struct get_apcs_request *req )
380 {
381     fprintf( stderr, " count=%d,", req->count );
382     fprintf( stderr, " apcs=" );
383     dump_varargs_get_apcs_reply( req );
384 }
385
386 static void dump_close_handle_request( const struct close_handle_request *req )
387 {
388     fprintf( stderr, " handle=%d", req->handle );
389 }
390
391 static void dump_get_handle_info_request( const struct get_handle_info_request *req )
392 {
393     fprintf( stderr, " handle=%d", req->handle );
394 }
395
396 static void dump_get_handle_info_reply( const struct get_handle_info_request *req )
397 {
398     fprintf( stderr, " flags=%d", req->flags );
399 }
400
401 static void dump_set_handle_info_request( const struct set_handle_info_request *req )
402 {
403     fprintf( stderr, " handle=%d,", req->handle );
404     fprintf( stderr, " flags=%d,", req->flags );
405     fprintf( stderr, " mask=%d", req->mask );
406 }
407
408 static void dump_dup_handle_request( const struct dup_handle_request *req )
409 {
410     fprintf( stderr, " src_process=%d,", req->src_process );
411     fprintf( stderr, " src_handle=%d,", req->src_handle );
412     fprintf( stderr, " dst_process=%d,", req->dst_process );
413     fprintf( stderr, " access=%08x,", req->access );
414     fprintf( stderr, " inherit=%d,", req->inherit );
415     fprintf( stderr, " options=%d", req->options );
416 }
417
418 static void dump_dup_handle_reply( const struct dup_handle_request *req )
419 {
420     fprintf( stderr, " handle=%d", req->handle );
421 }
422
423 static void dump_open_process_request( const struct open_process_request *req )
424 {
425     fprintf( stderr, " pid=%p,", req->pid );
426     fprintf( stderr, " access=%08x,", req->access );
427     fprintf( stderr, " inherit=%d", req->inherit );
428 }
429
430 static void dump_open_process_reply( const struct open_process_request *req )
431 {
432     fprintf( stderr, " handle=%d", req->handle );
433 }
434
435 static void dump_select_request( const struct select_request *req )
436 {
437     fprintf( stderr, " count=%d,", req->count );
438     fprintf( stderr, " flags=%d,", req->flags );
439     fprintf( stderr, " timeout=%d,", req->timeout );
440     fprintf( stderr, " handles=" );
441     dump_varargs_select_request( req );
442 }
443
444 static void dump_select_reply( const struct select_request *req )
445 {
446     fprintf( stderr, " signaled=%d", req->signaled );
447 }
448
449 static void dump_create_event_request( const struct create_event_request *req )
450 {
451     fprintf( stderr, " manual_reset=%d,", req->manual_reset );
452     fprintf( stderr, " initial_state=%d,", req->initial_state );
453     fprintf( stderr, " inherit=%d,", req->inherit );
454     fprintf( stderr, " name=" );
455     dump_unicode_string( req->name );
456 }
457
458 static void dump_create_event_reply( const struct create_event_request *req )
459 {
460     fprintf( stderr, " handle=%d", req->handle );
461 }
462
463 static void dump_event_op_request( const struct event_op_request *req )
464 {
465     fprintf( stderr, " handle=%d,", req->handle );
466     fprintf( stderr, " op=%d", req->op );
467 }
468
469 static void dump_open_event_request( const struct open_event_request *req )
470 {
471     fprintf( stderr, " access=%08x,", req->access );
472     fprintf( stderr, " inherit=%d,", req->inherit );
473     fprintf( stderr, " name=" );
474     dump_unicode_string( req->name );
475 }
476
477 static void dump_open_event_reply( const struct open_event_request *req )
478 {
479     fprintf( stderr, " handle=%d", req->handle );
480 }
481
482 static void dump_create_mutex_request( const struct create_mutex_request *req )
483 {
484     fprintf( stderr, " owned=%d,", req->owned );
485     fprintf( stderr, " inherit=%d,", req->inherit );
486     fprintf( stderr, " name=" );
487     dump_unicode_string( req->name );
488 }
489
490 static void dump_create_mutex_reply( const struct create_mutex_request *req )
491 {
492     fprintf( stderr, " handle=%d", req->handle );
493 }
494
495 static void dump_release_mutex_request( const struct release_mutex_request *req )
496 {
497     fprintf( stderr, " handle=%d", req->handle );
498 }
499
500 static void dump_open_mutex_request( const struct open_mutex_request *req )
501 {
502     fprintf( stderr, " access=%08x,", req->access );
503     fprintf( stderr, " inherit=%d,", req->inherit );
504     fprintf( stderr, " name=" );
505     dump_unicode_string( req->name );
506 }
507
508 static void dump_open_mutex_reply( const struct open_mutex_request *req )
509 {
510     fprintf( stderr, " handle=%d", req->handle );
511 }
512
513 static void dump_create_semaphore_request( const struct create_semaphore_request *req )
514 {
515     fprintf( stderr, " initial=%08x,", req->initial );
516     fprintf( stderr, " max=%08x,", req->max );
517     fprintf( stderr, " inherit=%d,", req->inherit );
518     fprintf( stderr, " name=" );
519     dump_unicode_string( req->name );
520 }
521
522 static void dump_create_semaphore_reply( const struct create_semaphore_request *req )
523 {
524     fprintf( stderr, " handle=%d", req->handle );
525 }
526
527 static void dump_release_semaphore_request( const struct release_semaphore_request *req )
528 {
529     fprintf( stderr, " handle=%d,", req->handle );
530     fprintf( stderr, " count=%08x", req->count );
531 }
532
533 static void dump_release_semaphore_reply( const struct release_semaphore_request *req )
534 {
535     fprintf( stderr, " prev_count=%08x", req->prev_count );
536 }
537
538 static void dump_open_semaphore_request( const struct open_semaphore_request *req )
539 {
540     fprintf( stderr, " access=%08x,", req->access );
541     fprintf( stderr, " inherit=%d,", req->inherit );
542     fprintf( stderr, " name=" );
543     dump_unicode_string( req->name );
544 }
545
546 static void dump_open_semaphore_reply( const struct open_semaphore_request *req )
547 {
548     fprintf( stderr, " handle=%d", req->handle );
549 }
550
551 static void dump_create_file_request( const struct create_file_request *req )
552 {
553     fprintf( stderr, " access=%08x,", req->access );
554     fprintf( stderr, " inherit=%d,", req->inherit );
555     fprintf( stderr, " sharing=%08x,", req->sharing );
556     fprintf( stderr, " create=%d,", req->create );
557     fprintf( stderr, " attrs=%08x,", req->attrs );
558     fprintf( stderr, " name=\"%s\"", req->name );
559 }
560
561 static void dump_create_file_reply( const struct create_file_request *req )
562 {
563     fprintf( stderr, " handle=%d", req->handle );
564 }
565
566 static void dump_alloc_file_handle_request( const struct alloc_file_handle_request *req )
567 {
568     fprintf( stderr, " access=%08x", req->access );
569 }
570
571 static void dump_alloc_file_handle_reply( const struct alloc_file_handle_request *req )
572 {
573     fprintf( stderr, " handle=%d", req->handle );
574 }
575
576 static void dump_get_read_fd_request( const struct get_read_fd_request *req )
577 {
578     fprintf( stderr, " handle=%d", req->handle );
579 }
580
581 static void dump_get_write_fd_request( const struct get_write_fd_request *req )
582 {
583     fprintf( stderr, " handle=%d", req->handle );
584 }
585
586 static void dump_set_file_pointer_request( const struct set_file_pointer_request *req )
587 {
588     fprintf( stderr, " handle=%d,", req->handle );
589     fprintf( stderr, " low=%d,", req->low );
590     fprintf( stderr, " high=%d,", req->high );
591     fprintf( stderr, " whence=%d", req->whence );
592 }
593
594 static void dump_set_file_pointer_reply( const struct set_file_pointer_request *req )
595 {
596     fprintf( stderr, " new_low=%d,", req->new_low );
597     fprintf( stderr, " new_high=%d", req->new_high );
598 }
599
600 static void dump_truncate_file_request( const struct truncate_file_request *req )
601 {
602     fprintf( stderr, " handle=%d", req->handle );
603 }
604
605 static void dump_set_file_time_request( const struct set_file_time_request *req )
606 {
607     fprintf( stderr, " handle=%d,", req->handle );
608     fprintf( stderr, " access_time=%ld,", req->access_time );
609     fprintf( stderr, " write_time=%ld", req->write_time );
610 }
611
612 static void dump_flush_file_request( const struct flush_file_request *req )
613 {
614     fprintf( stderr, " handle=%d", req->handle );
615 }
616
617 static void dump_get_file_info_request( const struct get_file_info_request *req )
618 {
619     fprintf( stderr, " handle=%d", req->handle );
620 }
621
622 static void dump_get_file_info_reply( const struct get_file_info_request *req )
623 {
624     fprintf( stderr, " type=%d,", req->type );
625     fprintf( stderr, " attr=%d,", req->attr );
626     fprintf( stderr, " access_time=%ld,", req->access_time );
627     fprintf( stderr, " write_time=%ld,", req->write_time );
628     fprintf( stderr, " size_high=%d,", req->size_high );
629     fprintf( stderr, " size_low=%d,", req->size_low );
630     fprintf( stderr, " links=%d,", req->links );
631     fprintf( stderr, " index_high=%d,", req->index_high );
632     fprintf( stderr, " index_low=%d,", req->index_low );
633     fprintf( stderr, " serial=%08x", req->serial );
634 }
635
636 static void dump_lock_file_request( const struct lock_file_request *req )
637 {
638     fprintf( stderr, " handle=%d,", req->handle );
639     fprintf( stderr, " offset_low=%08x,", req->offset_low );
640     fprintf( stderr, " offset_high=%08x,", req->offset_high );
641     fprintf( stderr, " count_low=%08x,", req->count_low );
642     fprintf( stderr, " count_high=%08x", req->count_high );
643 }
644
645 static void dump_unlock_file_request( const struct unlock_file_request *req )
646 {
647     fprintf( stderr, " handle=%d,", req->handle );
648     fprintf( stderr, " offset_low=%08x,", req->offset_low );
649     fprintf( stderr, " offset_high=%08x,", req->offset_high );
650     fprintf( stderr, " count_low=%08x,", req->count_low );
651     fprintf( stderr, " count_high=%08x", req->count_high );
652 }
653
654 static void dump_create_pipe_request( const struct create_pipe_request *req )
655 {
656     fprintf( stderr, " inherit=%d", req->inherit );
657 }
658
659 static void dump_create_pipe_reply( const struct create_pipe_request *req )
660 {
661     fprintf( stderr, " handle_read=%d,", req->handle_read );
662     fprintf( stderr, " handle_write=%d", req->handle_write );
663 }
664
665 static void dump_create_socket_request( const struct create_socket_request *req )
666 {
667     fprintf( stderr, " access=%08x,", req->access );
668     fprintf( stderr, " inherit=%d,", req->inherit );
669     fprintf( stderr, " family=%d,", req->family );
670     fprintf( stderr, " type=%d,", req->type );
671     fprintf( stderr, " protocol=%d", req->protocol );
672 }
673
674 static void dump_create_socket_reply( const struct create_socket_request *req )
675 {
676     fprintf( stderr, " handle=%d", req->handle );
677 }
678
679 static void dump_accept_socket_request( const struct accept_socket_request *req )
680 {
681     fprintf( stderr, " lhandle=%d,", req->lhandle );
682     fprintf( stderr, " access=%08x,", req->access );
683     fprintf( stderr, " inherit=%d", req->inherit );
684 }
685
686 static void dump_accept_socket_reply( const struct accept_socket_request *req )
687 {
688     fprintf( stderr, " handle=%d", req->handle );
689 }
690
691 static void dump_set_socket_event_request( const struct set_socket_event_request *req )
692 {
693     fprintf( stderr, " handle=%d,", req->handle );
694     fprintf( stderr, " mask=%08x,", req->mask );
695     fprintf( stderr, " event=%d", req->event );
696 }
697
698 static void dump_get_socket_event_request( const struct get_socket_event_request *req )
699 {
700     fprintf( stderr, " handle=%d,", req->handle );
701     fprintf( stderr, " service=%d,", req->service );
702     fprintf( stderr, " s_event=%d", req->s_event );
703 }
704
705 static void dump_get_socket_event_reply( const struct get_socket_event_request *req )
706 {
707     fprintf( stderr, " mask=%08x,", req->mask );
708     fprintf( stderr, " pmask=%08x,", req->pmask );
709     fprintf( stderr, " state=%08x,", req->state );
710     fprintf( stderr, " errors=" );
711     dump_varargs_get_socket_event_reply( req );
712 }
713
714 static void dump_enable_socket_event_request( const struct enable_socket_event_request *req )
715 {
716     fprintf( stderr, " handle=%d,", req->handle );
717     fprintf( stderr, " mask=%08x,", req->mask );
718     fprintf( stderr, " sstate=%08x,", req->sstate );
719     fprintf( stderr, " cstate=%08x", req->cstate );
720 }
721
722 static void dump_alloc_console_request( const struct alloc_console_request *req )
723 {
724     fprintf( stderr, " access=%08x,", req->access );
725     fprintf( stderr, " inherit=%d", req->inherit );
726 }
727
728 static void dump_alloc_console_reply( const struct alloc_console_request *req )
729 {
730     fprintf( stderr, " handle_in=%d,", req->handle_in );
731     fprintf( stderr, " handle_out=%d", req->handle_out );
732 }
733
734 static void dump_free_console_request( const struct free_console_request *req )
735 {
736     fprintf( stderr, " dummy=%d", req->dummy );
737 }
738
739 static void dump_open_console_request( const struct open_console_request *req )
740 {
741     fprintf( stderr, " output=%d,", req->output );
742     fprintf( stderr, " access=%08x,", req->access );
743     fprintf( stderr, " inherit=%d", req->inherit );
744 }
745
746 static void dump_open_console_reply( const struct open_console_request *req )
747 {
748     fprintf( stderr, " handle=%d", req->handle );
749 }
750
751 static void dump_set_console_fd_request( const struct set_console_fd_request *req )
752 {
753     fprintf( stderr, " handle=%d,", req->handle );
754     fprintf( stderr, " file_handle=%d,", req->file_handle );
755     fprintf( stderr, " pid=%d", req->pid );
756 }
757
758 static void dump_get_console_mode_request( const struct get_console_mode_request *req )
759 {
760     fprintf( stderr, " handle=%d", req->handle );
761 }
762
763 static void dump_get_console_mode_reply( const struct get_console_mode_request *req )
764 {
765     fprintf( stderr, " mode=%d", req->mode );
766 }
767
768 static void dump_set_console_mode_request( const struct set_console_mode_request *req )
769 {
770     fprintf( stderr, " handle=%d,", req->handle );
771     fprintf( stderr, " mode=%d", req->mode );
772 }
773
774 static void dump_set_console_info_request( const struct set_console_info_request *req )
775 {
776     fprintf( stderr, " handle=%d,", req->handle );
777     fprintf( stderr, " mask=%d,", req->mask );
778     fprintf( stderr, " cursor_size=%d,", req->cursor_size );
779     fprintf( stderr, " cursor_visible=%d,", req->cursor_visible );
780     fprintf( stderr, " title=\"%s\"", req->title );
781 }
782
783 static void dump_get_console_info_request( const struct get_console_info_request *req )
784 {
785     fprintf( stderr, " handle=%d", req->handle );
786 }
787
788 static void dump_get_console_info_reply( const struct get_console_info_request *req )
789 {
790     fprintf( stderr, " cursor_size=%d,", req->cursor_size );
791     fprintf( stderr, " cursor_visible=%d,", req->cursor_visible );
792     fprintf( stderr, " pid=%d,", req->pid );
793     fprintf( stderr, " title=\"%s\"", req->title );
794 }
795
796 static void dump_write_console_input_request( const struct write_console_input_request *req )
797 {
798     fprintf( stderr, " handle=%d,", req->handle );
799     fprintf( stderr, " count=%d", req->count );
800 }
801
802 static void dump_write_console_input_reply( const struct write_console_input_request *req )
803 {
804     fprintf( stderr, " written=%d", req->written );
805 }
806
807 static void dump_read_console_input_request( const struct read_console_input_request *req )
808 {
809     fprintf( stderr, " handle=%d,", req->handle );
810     fprintf( stderr, " count=%d,", req->count );
811     fprintf( stderr, " flush=%d", req->flush );
812 }
813
814 static void dump_read_console_input_reply( const struct read_console_input_request *req )
815 {
816     fprintf( stderr, " read=%d", req->read );
817 }
818
819 static void dump_create_change_notification_request( const struct create_change_notification_request *req )
820 {
821     fprintf( stderr, " subtree=%d,", req->subtree );
822     fprintf( stderr, " filter=%d", req->filter );
823 }
824
825 static void dump_create_change_notification_reply( const struct create_change_notification_request *req )
826 {
827     fprintf( stderr, " handle=%d", req->handle );
828 }
829
830 static void dump_create_mapping_request( const struct create_mapping_request *req )
831 {
832     fprintf( stderr, " size_high=%d,", req->size_high );
833     fprintf( stderr, " size_low=%d,", req->size_low );
834     fprintf( stderr, " protect=%d,", req->protect );
835     fprintf( stderr, " inherit=%d,", req->inherit );
836     fprintf( stderr, " file_handle=%d,", req->file_handle );
837     fprintf( stderr, " name=" );
838     dump_unicode_string( req->name );
839 }
840
841 static void dump_create_mapping_reply( const struct create_mapping_request *req )
842 {
843     fprintf( stderr, " handle=%d", req->handle );
844 }
845
846 static void dump_open_mapping_request( const struct open_mapping_request *req )
847 {
848     fprintf( stderr, " access=%08x,", req->access );
849     fprintf( stderr, " inherit=%d,", req->inherit );
850     fprintf( stderr, " name=" );
851     dump_unicode_string( req->name );
852 }
853
854 static void dump_open_mapping_reply( const struct open_mapping_request *req )
855 {
856     fprintf( stderr, " handle=%d", req->handle );
857 }
858
859 static void dump_get_mapping_info_request( const struct get_mapping_info_request *req )
860 {
861     fprintf( stderr, " handle=%d", req->handle );
862 }
863
864 static void dump_get_mapping_info_reply( const struct get_mapping_info_request *req )
865 {
866     fprintf( stderr, " size_high=%d,", req->size_high );
867     fprintf( stderr, " size_low=%d,", req->size_low );
868     fprintf( stderr, " protect=%d", req->protect );
869 }
870
871 static void dump_create_device_request( const struct create_device_request *req )
872 {
873     fprintf( stderr, " access=%08x,", req->access );
874     fprintf( stderr, " inherit=%d,", req->inherit );
875     fprintf( stderr, " id=%d", req->id );
876 }
877
878 static void dump_create_device_reply( const struct create_device_request *req )
879 {
880     fprintf( stderr, " handle=%d", req->handle );
881 }
882
883 static void dump_create_snapshot_request( const struct create_snapshot_request *req )
884 {
885     fprintf( stderr, " inherit=%d,", req->inherit );
886     fprintf( stderr, " flags=%d", req->flags );
887 }
888
889 static void dump_create_snapshot_reply( const struct create_snapshot_request *req )
890 {
891     fprintf( stderr, " handle=%d", req->handle );
892 }
893
894 static void dump_next_process_request( const struct next_process_request *req )
895 {
896     fprintf( stderr, " handle=%d,", req->handle );
897     fprintf( stderr, " reset=%d", req->reset );
898 }
899
900 static void dump_next_process_reply( const struct next_process_request *req )
901 {
902     fprintf( stderr, " pid=%p,", req->pid );
903     fprintf( stderr, " threads=%d,", req->threads );
904     fprintf( stderr, " priority=%d", req->priority );
905 }
906
907 static void dump_wait_debug_event_request( const struct wait_debug_event_request *req )
908 {
909     fprintf( stderr, " timeout=%d", req->timeout );
910 }
911
912 static void dump_wait_debug_event_reply( const struct wait_debug_event_request *req )
913 {
914     fprintf( stderr, " pid=%p,", req->pid );
915     fprintf( stderr, " tid=%p,", req->tid );
916     fprintf( stderr, " event=" );
917     dump_debug_event_t( &req->event );
918 }
919
920 static void dump_send_debug_event_request( const struct send_debug_event_request *req )
921 {
922     fprintf( stderr, " event=" );
923     dump_debug_event_t( &req->event );
924 }
925
926 static void dump_send_debug_event_reply( const struct send_debug_event_request *req )
927 {
928     fprintf( stderr, " status=%d", req->status );
929 }
930
931 static void dump_continue_debug_event_request( const struct continue_debug_event_request *req )
932 {
933     fprintf( stderr, " pid=%p,", req->pid );
934     fprintf( stderr, " tid=%p,", req->tid );
935     fprintf( stderr, " status=%d", req->status );
936 }
937
938 static void dump_debug_process_request( const struct debug_process_request *req )
939 {
940     fprintf( stderr, " pid=%p", req->pid );
941 }
942
943 static void dump_read_process_memory_request( const struct read_process_memory_request *req )
944 {
945     fprintf( stderr, " handle=%d,", req->handle );
946     fprintf( stderr, " addr=%p,", req->addr );
947     fprintf( stderr, " len=%d", req->len );
948 }
949
950 static void dump_read_process_memory_reply( const struct read_process_memory_request *req )
951 {
952     fprintf( stderr, " data=" );
953     dump_varargs_read_process_memory_reply( req );
954 }
955
956 static void dump_write_process_memory_request( const struct write_process_memory_request *req )
957 {
958     fprintf( stderr, " handle=%d,", req->handle );
959     fprintf( stderr, " addr=%p,", req->addr );
960     fprintf( stderr, " len=%d,", req->len );
961     fprintf( stderr, " first_mask=%08x,", req->first_mask );
962     fprintf( stderr, " last_mask=%08x,", req->last_mask );
963     fprintf( stderr, " data=" );
964     dump_varargs_write_process_memory_request( req );
965 }
966
967 static void dump_create_key_request( const struct create_key_request *req )
968 {
969     fprintf( stderr, " parent=%d,", req->parent );
970     fprintf( stderr, " access=%08x,", req->access );
971     fprintf( stderr, " options=%08x,", req->options );
972     fprintf( stderr, " modif=%ld,", req->modif );
973     fprintf( stderr, " name=" );
974     dump_path_t( &req->name );
975     fprintf( stderr, "," );
976     fprintf( stderr, " class=" );
977     dump_unicode_string( req->class );
978 }
979
980 static void dump_create_key_reply( const struct create_key_request *req )
981 {
982     fprintf( stderr, " hkey=%d,", req->hkey );
983     fprintf( stderr, " created=%d", req->created );
984 }
985
986 static void dump_open_key_request( const struct open_key_request *req )
987 {
988     fprintf( stderr, " parent=%d,", req->parent );
989     fprintf( stderr, " access=%08x,", req->access );
990     fprintf( stderr, " name=" );
991     dump_path_t( &req->name );
992 }
993
994 static void dump_open_key_reply( const struct open_key_request *req )
995 {
996     fprintf( stderr, " hkey=%d", req->hkey );
997 }
998
999 static void dump_delete_key_request( const struct delete_key_request *req )
1000 {
1001     fprintf( stderr, " hkey=%d,", req->hkey );
1002     fprintf( stderr, " name=" );
1003     dump_path_t( &req->name );
1004 }
1005
1006 static void dump_close_key_request( const struct close_key_request *req )
1007 {
1008     fprintf( stderr, " hkey=%d", req->hkey );
1009 }
1010
1011 static void dump_enum_key_request( const struct enum_key_request *req )
1012 {
1013     fprintf( stderr, " hkey=%d,", req->hkey );
1014     fprintf( stderr, " index=%d", req->index );
1015 }
1016
1017 static void dump_enum_key_reply( const struct enum_key_request *req )
1018 {
1019     fprintf( stderr, " modif=%ld,", req->modif );
1020     fprintf( stderr, " name=" );
1021     dump_path_t( &req->name );
1022     fprintf( stderr, "," );
1023     fprintf( stderr, " class=" );
1024     dump_unicode_string( req->class );
1025 }
1026
1027 static void dump_query_key_info_request( const struct query_key_info_request *req )
1028 {
1029     fprintf( stderr, " hkey=%d", req->hkey );
1030 }
1031
1032 static void dump_query_key_info_reply( const struct query_key_info_request *req )
1033 {
1034     fprintf( stderr, " subkeys=%d,", req->subkeys );
1035     fprintf( stderr, " max_subkey=%d,", req->max_subkey );
1036     fprintf( stderr, " max_class=%d,", req->max_class );
1037     fprintf( stderr, " values=%d,", req->values );
1038     fprintf( stderr, " max_value=%d,", req->max_value );
1039     fprintf( stderr, " max_data=%d,", req->max_data );
1040     fprintf( stderr, " modif=%ld,", req->modif );
1041     fprintf( stderr, " name=" );
1042     dump_path_t( &req->name );
1043     fprintf( stderr, "," );
1044     fprintf( stderr, " class=" );
1045     dump_unicode_string( req->class );
1046 }
1047
1048 static void dump_set_key_value_request( const struct set_key_value_request *req )
1049 {
1050     fprintf( stderr, " hkey=%d,", req->hkey );
1051     fprintf( stderr, " type=%d,", req->type );
1052     fprintf( stderr, " len=%d,", req->len );
1053     fprintf( stderr, " name=" );
1054     dump_path_t( &req->name );
1055     fprintf( stderr, "," );
1056     fprintf( stderr, " data=" );
1057     dump_varargs_set_key_value_request( req );
1058 }
1059
1060 static void dump_get_key_value_request( const struct get_key_value_request *req )
1061 {
1062     fprintf( stderr, " hkey=%d,", req->hkey );
1063     fprintf( stderr, " name=" );
1064     dump_unicode_string( req->name );
1065 }
1066
1067 static void dump_get_key_value_reply( const struct get_key_value_request *req )
1068 {
1069     fprintf( stderr, " type=%d,", req->type );
1070     fprintf( stderr, " len=%d,", req->len );
1071     fprintf( stderr, " data=" );
1072     dump_varargs_get_key_value_reply( req );
1073 }
1074
1075 static void dump_enum_key_value_request( const struct enum_key_value_request *req )
1076 {
1077     fprintf( stderr, " hkey=%d,", req->hkey );
1078     fprintf( stderr, " index=%d", req->index );
1079 }
1080
1081 static void dump_enum_key_value_reply( const struct enum_key_value_request *req )
1082 {
1083     fprintf( stderr, " type=%d,", req->type );
1084     fprintf( stderr, " len=%d,", req->len );
1085     fprintf( stderr, " name=" );
1086     dump_path_t( &req->name );
1087     fprintf( stderr, "," );
1088     fprintf( stderr, " data=" );
1089     dump_varargs_enum_key_value_reply( req );
1090 }
1091
1092 static void dump_delete_key_value_request( const struct delete_key_value_request *req )
1093 {
1094     fprintf( stderr, " hkey=%d,", req->hkey );
1095     fprintf( stderr, " name=" );
1096     dump_path_t( &req->name );
1097 }
1098
1099 static void dump_load_registry_request( const struct load_registry_request *req )
1100 {
1101     fprintf( stderr, " hkey=%d,", req->hkey );
1102     fprintf( stderr, " file=%d,", req->file );
1103     fprintf( stderr, " name=" );
1104     dump_path_t( &req->name );
1105 }
1106
1107 static void dump_save_registry_request( const struct save_registry_request *req )
1108 {
1109     fprintf( stderr, " hkey=%d,", req->hkey );
1110     fprintf( stderr, " file=%d", req->file );
1111 }
1112
1113 static void dump_set_registry_levels_request( const struct set_registry_levels_request *req )
1114 {
1115     fprintf( stderr, " current=%d,", req->current );
1116     fprintf( stderr, " saving=%d,", req->saving );
1117     fprintf( stderr, " version=%d", req->version );
1118 }
1119
1120 static void dump_create_timer_request( const struct create_timer_request *req )
1121 {
1122     fprintf( stderr, " inherit=%d,", req->inherit );
1123     fprintf( stderr, " manual=%d,", req->manual );
1124     fprintf( stderr, " name=" );
1125     dump_unicode_string( req->name );
1126 }
1127
1128 static void dump_create_timer_reply( const struct create_timer_request *req )
1129 {
1130     fprintf( stderr, " handle=%d", req->handle );
1131 }
1132
1133 static void dump_open_timer_request( const struct open_timer_request *req )
1134 {
1135     fprintf( stderr, " access=%08x,", req->access );
1136     fprintf( stderr, " inherit=%d,", req->inherit );
1137     fprintf( stderr, " name=" );
1138     dump_unicode_string( req->name );
1139 }
1140
1141 static void dump_open_timer_reply( const struct open_timer_request *req )
1142 {
1143     fprintf( stderr, " handle=%d", req->handle );
1144 }
1145
1146 static void dump_set_timer_request( const struct set_timer_request *req )
1147 {
1148     fprintf( stderr, " handle=%d,", req->handle );
1149     fprintf( stderr, " sec=%d,", req->sec );
1150     fprintf( stderr, " usec=%d,", req->usec );
1151     fprintf( stderr, " period=%d,", req->period );
1152     fprintf( stderr, " callback=%p,", req->callback );
1153     fprintf( stderr, " arg=%p", req->arg );
1154 }
1155
1156 static void dump_cancel_timer_request( const struct cancel_timer_request *req )
1157 {
1158     fprintf( stderr, " handle=%d", req->handle );
1159 }
1160
1161 static void dump_get_thread_context_request( const struct get_thread_context_request *req )
1162 {
1163     fprintf( stderr, " handle=%d,", req->handle );
1164     fprintf( stderr, " flags=%08x", req->flags );
1165 }
1166
1167 static void dump_get_thread_context_reply( const struct get_thread_context_request *req )
1168 {
1169     fprintf( stderr, " context=" );
1170     dump_context( &req->context );
1171 }
1172
1173 static void dump_set_thread_context_request( const struct set_thread_context_request *req )
1174 {
1175     fprintf( stderr, " handle=%d,", req->handle );
1176     fprintf( stderr, " flags=%08x,", req->flags );
1177     fprintf( stderr, " context=" );
1178     dump_context( &req->context );
1179 }
1180
1181 static void dump_get_selector_entry_request( const struct get_selector_entry_request *req )
1182 {
1183     fprintf( stderr, " handle=%d,", req->handle );
1184     fprintf( stderr, " entry=%d", req->entry );
1185 }
1186
1187 static void dump_get_selector_entry_reply( const struct get_selector_entry_request *req )
1188 {
1189     fprintf( stderr, " base=%08x,", req->base );
1190     fprintf( stderr, " limit=%08x,", req->limit );
1191     fprintf( stderr, " flags=%02x", req->flags );
1192 }
1193
1194 static void dump_add_atom_request( const struct add_atom_request *req )
1195 {
1196     fprintf( stderr, " name=" );
1197     dump_unicode_string( req->name );
1198 }
1199
1200 static void dump_add_atom_reply( const struct add_atom_request *req )
1201 {
1202     fprintf( stderr, " atom=%d", req->atom );
1203 }
1204
1205 static void dump_delete_atom_request( const struct delete_atom_request *req )
1206 {
1207     fprintf( stderr, " atom=%d", req->atom );
1208 }
1209
1210 static void dump_find_atom_request( const struct find_atom_request *req )
1211 {
1212     fprintf( stderr, " name=" );
1213     dump_unicode_string( req->name );
1214 }
1215
1216 static void dump_find_atom_reply( const struct find_atom_request *req )
1217 {
1218     fprintf( stderr, " atom=%d", req->atom );
1219 }
1220
1221 static void dump_get_atom_name_request( const struct get_atom_name_request *req )
1222 {
1223     fprintf( stderr, " atom=%d", req->atom );
1224 }
1225
1226 static void dump_get_atom_name_reply( const struct get_atom_name_request *req )
1227 {
1228     fprintf( stderr, " count=%d,", req->count );
1229     fprintf( stderr, " name=" );
1230     dump_unicode_string( req->name );
1231 }
1232
1233 static const dump_func req_dumpers[REQ_NB_REQUESTS] = {
1234     (dump_func)dump_new_process_request,
1235     (dump_func)dump_new_thread_request,
1236     (dump_func)dump_boot_done_request,
1237     (dump_func)dump_init_process_request,
1238     (dump_func)dump_init_process_done_request,
1239     (dump_func)dump_init_thread_request,
1240     (dump_func)dump_get_thread_buffer_request,
1241     (dump_func)dump_terminate_process_request,
1242     (dump_func)dump_terminate_thread_request,
1243     (dump_func)dump_get_process_info_request,
1244     (dump_func)dump_set_process_info_request,
1245     (dump_func)dump_get_thread_info_request,
1246     (dump_func)dump_set_thread_info_request,
1247     (dump_func)dump_suspend_thread_request,
1248     (dump_func)dump_resume_thread_request,
1249     (dump_func)dump_debugger_request,
1250     (dump_func)dump_queue_apc_request,
1251     (dump_func)dump_get_apcs_request,
1252     (dump_func)dump_close_handle_request,
1253     (dump_func)dump_get_handle_info_request,
1254     (dump_func)dump_set_handle_info_request,
1255     (dump_func)dump_dup_handle_request,
1256     (dump_func)dump_open_process_request,
1257     (dump_func)dump_select_request,
1258     (dump_func)dump_create_event_request,
1259     (dump_func)dump_event_op_request,
1260     (dump_func)dump_open_event_request,
1261     (dump_func)dump_create_mutex_request,
1262     (dump_func)dump_release_mutex_request,
1263     (dump_func)dump_open_mutex_request,
1264     (dump_func)dump_create_semaphore_request,
1265     (dump_func)dump_release_semaphore_request,
1266     (dump_func)dump_open_semaphore_request,
1267     (dump_func)dump_create_file_request,
1268     (dump_func)dump_alloc_file_handle_request,
1269     (dump_func)dump_get_read_fd_request,
1270     (dump_func)dump_get_write_fd_request,
1271     (dump_func)dump_set_file_pointer_request,
1272     (dump_func)dump_truncate_file_request,
1273     (dump_func)dump_set_file_time_request,
1274     (dump_func)dump_flush_file_request,
1275     (dump_func)dump_get_file_info_request,
1276     (dump_func)dump_lock_file_request,
1277     (dump_func)dump_unlock_file_request,
1278     (dump_func)dump_create_pipe_request,
1279     (dump_func)dump_create_socket_request,
1280     (dump_func)dump_accept_socket_request,
1281     (dump_func)dump_set_socket_event_request,
1282     (dump_func)dump_get_socket_event_request,
1283     (dump_func)dump_enable_socket_event_request,
1284     (dump_func)dump_alloc_console_request,
1285     (dump_func)dump_free_console_request,
1286     (dump_func)dump_open_console_request,
1287     (dump_func)dump_set_console_fd_request,
1288     (dump_func)dump_get_console_mode_request,
1289     (dump_func)dump_set_console_mode_request,
1290     (dump_func)dump_set_console_info_request,
1291     (dump_func)dump_get_console_info_request,
1292     (dump_func)dump_write_console_input_request,
1293     (dump_func)dump_read_console_input_request,
1294     (dump_func)dump_create_change_notification_request,
1295     (dump_func)dump_create_mapping_request,
1296     (dump_func)dump_open_mapping_request,
1297     (dump_func)dump_get_mapping_info_request,
1298     (dump_func)dump_create_device_request,
1299     (dump_func)dump_create_snapshot_request,
1300     (dump_func)dump_next_process_request,
1301     (dump_func)dump_wait_debug_event_request,
1302     (dump_func)dump_send_debug_event_request,
1303     (dump_func)dump_continue_debug_event_request,
1304     (dump_func)dump_debug_process_request,
1305     (dump_func)dump_read_process_memory_request,
1306     (dump_func)dump_write_process_memory_request,
1307     (dump_func)dump_create_key_request,
1308     (dump_func)dump_open_key_request,
1309     (dump_func)dump_delete_key_request,
1310     (dump_func)dump_close_key_request,
1311     (dump_func)dump_enum_key_request,
1312     (dump_func)dump_query_key_info_request,
1313     (dump_func)dump_set_key_value_request,
1314     (dump_func)dump_get_key_value_request,
1315     (dump_func)dump_enum_key_value_request,
1316     (dump_func)dump_delete_key_value_request,
1317     (dump_func)dump_load_registry_request,
1318     (dump_func)dump_save_registry_request,
1319     (dump_func)dump_set_registry_levels_request,
1320     (dump_func)dump_create_timer_request,
1321     (dump_func)dump_open_timer_request,
1322     (dump_func)dump_set_timer_request,
1323     (dump_func)dump_cancel_timer_request,
1324     (dump_func)dump_get_thread_context_request,
1325     (dump_func)dump_set_thread_context_request,
1326     (dump_func)dump_get_selector_entry_request,
1327     (dump_func)dump_add_atom_request,
1328     (dump_func)dump_delete_atom_request,
1329     (dump_func)dump_find_atom_request,
1330     (dump_func)dump_get_atom_name_request,
1331 };
1332
1333 static const dump_func reply_dumpers[REQ_NB_REQUESTS] = {
1334     (dump_func)dump_new_process_reply,
1335     (dump_func)dump_new_thread_reply,
1336     (dump_func)0,
1337     (dump_func)dump_init_process_reply,
1338     (dump_func)dump_init_process_done_reply,
1339     (dump_func)0,
1340     (dump_func)dump_get_thread_buffer_reply,
1341     (dump_func)0,
1342     (dump_func)0,
1343     (dump_func)dump_get_process_info_reply,
1344     (dump_func)0,
1345     (dump_func)dump_get_thread_info_reply,
1346     (dump_func)0,
1347     (dump_func)dump_suspend_thread_reply,
1348     (dump_func)dump_resume_thread_reply,
1349     (dump_func)0,
1350     (dump_func)0,
1351     (dump_func)dump_get_apcs_reply,
1352     (dump_func)0,
1353     (dump_func)dump_get_handle_info_reply,
1354     (dump_func)0,
1355     (dump_func)dump_dup_handle_reply,
1356     (dump_func)dump_open_process_reply,
1357     (dump_func)dump_select_reply,
1358     (dump_func)dump_create_event_reply,
1359     (dump_func)0,
1360     (dump_func)dump_open_event_reply,
1361     (dump_func)dump_create_mutex_reply,
1362     (dump_func)0,
1363     (dump_func)dump_open_mutex_reply,
1364     (dump_func)dump_create_semaphore_reply,
1365     (dump_func)dump_release_semaphore_reply,
1366     (dump_func)dump_open_semaphore_reply,
1367     (dump_func)dump_create_file_reply,
1368     (dump_func)dump_alloc_file_handle_reply,
1369     (dump_func)0,
1370     (dump_func)0,
1371     (dump_func)dump_set_file_pointer_reply,
1372     (dump_func)0,
1373     (dump_func)0,
1374     (dump_func)0,
1375     (dump_func)dump_get_file_info_reply,
1376     (dump_func)0,
1377     (dump_func)0,
1378     (dump_func)dump_create_pipe_reply,
1379     (dump_func)dump_create_socket_reply,
1380     (dump_func)dump_accept_socket_reply,
1381     (dump_func)0,
1382     (dump_func)dump_get_socket_event_reply,
1383     (dump_func)0,
1384     (dump_func)dump_alloc_console_reply,
1385     (dump_func)0,
1386     (dump_func)dump_open_console_reply,
1387     (dump_func)0,
1388     (dump_func)dump_get_console_mode_reply,
1389     (dump_func)0,
1390     (dump_func)0,
1391     (dump_func)dump_get_console_info_reply,
1392     (dump_func)dump_write_console_input_reply,
1393     (dump_func)dump_read_console_input_reply,
1394     (dump_func)dump_create_change_notification_reply,
1395     (dump_func)dump_create_mapping_reply,
1396     (dump_func)dump_open_mapping_reply,
1397     (dump_func)dump_get_mapping_info_reply,
1398     (dump_func)dump_create_device_reply,
1399     (dump_func)dump_create_snapshot_reply,
1400     (dump_func)dump_next_process_reply,
1401     (dump_func)dump_wait_debug_event_reply,
1402     (dump_func)dump_send_debug_event_reply,
1403     (dump_func)0,
1404     (dump_func)0,
1405     (dump_func)dump_read_process_memory_reply,
1406     (dump_func)0,
1407     (dump_func)dump_create_key_reply,
1408     (dump_func)dump_open_key_reply,
1409     (dump_func)0,
1410     (dump_func)0,
1411     (dump_func)dump_enum_key_reply,
1412     (dump_func)dump_query_key_info_reply,
1413     (dump_func)0,
1414     (dump_func)dump_get_key_value_reply,
1415     (dump_func)dump_enum_key_value_reply,
1416     (dump_func)0,
1417     (dump_func)0,
1418     (dump_func)0,
1419     (dump_func)0,
1420     (dump_func)dump_create_timer_reply,
1421     (dump_func)dump_open_timer_reply,
1422     (dump_func)0,
1423     (dump_func)0,
1424     (dump_func)dump_get_thread_context_reply,
1425     (dump_func)0,
1426     (dump_func)dump_get_selector_entry_reply,
1427     (dump_func)dump_add_atom_reply,
1428     (dump_func)0,
1429     (dump_func)dump_find_atom_reply,
1430     (dump_func)dump_get_atom_name_reply,
1431 };
1432
1433 static const char * const req_names[REQ_NB_REQUESTS] = {
1434     "new_process",
1435     "new_thread",
1436     "boot_done",
1437     "init_process",
1438     "init_process_done",
1439     "init_thread",
1440     "get_thread_buffer",
1441     "terminate_process",
1442     "terminate_thread",
1443     "get_process_info",
1444     "set_process_info",
1445     "get_thread_info",
1446     "set_thread_info",
1447     "suspend_thread",
1448     "resume_thread",
1449     "debugger",
1450     "queue_apc",
1451     "get_apcs",
1452     "close_handle",
1453     "get_handle_info",
1454     "set_handle_info",
1455     "dup_handle",
1456     "open_process",
1457     "select",
1458     "create_event",
1459     "event_op",
1460     "open_event",
1461     "create_mutex",
1462     "release_mutex",
1463     "open_mutex",
1464     "create_semaphore",
1465     "release_semaphore",
1466     "open_semaphore",
1467     "create_file",
1468     "alloc_file_handle",
1469     "get_read_fd",
1470     "get_write_fd",
1471     "set_file_pointer",
1472     "truncate_file",
1473     "set_file_time",
1474     "flush_file",
1475     "get_file_info",
1476     "lock_file",
1477     "unlock_file",
1478     "create_pipe",
1479     "create_socket",
1480     "accept_socket",
1481     "set_socket_event",
1482     "get_socket_event",
1483     "enable_socket_event",
1484     "alloc_console",
1485     "free_console",
1486     "open_console",
1487     "set_console_fd",
1488     "get_console_mode",
1489     "set_console_mode",
1490     "set_console_info",
1491     "get_console_info",
1492     "write_console_input",
1493     "read_console_input",
1494     "create_change_notification",
1495     "create_mapping",
1496     "open_mapping",
1497     "get_mapping_info",
1498     "create_device",
1499     "create_snapshot",
1500     "next_process",
1501     "wait_debug_event",
1502     "send_debug_event",
1503     "continue_debug_event",
1504     "debug_process",
1505     "read_process_memory",
1506     "write_process_memory",
1507     "create_key",
1508     "open_key",
1509     "delete_key",
1510     "close_key",
1511     "enum_key",
1512     "query_key_info",
1513     "set_key_value",
1514     "get_key_value",
1515     "enum_key_value",
1516     "delete_key_value",
1517     "load_registry",
1518     "save_registry",
1519     "set_registry_levels",
1520     "create_timer",
1521     "open_timer",
1522     "set_timer",
1523     "cancel_timer",
1524     "get_thread_context",
1525     "set_thread_context",
1526     "get_selector_entry",
1527     "add_atom",
1528     "delete_atom",
1529     "find_atom",
1530     "get_atom_name",
1531 };
1532
1533 /* ### make_requests end ### */
1534 /* Everything above this line is generated automatically by tools/make_requests */
1535
1536 void trace_request( enum request req, int fd )
1537 {
1538     current->last_req = req;
1539     if (req < REQ_NB_REQUESTS)
1540     {
1541         fprintf( stderr, "%08x: %s(", (unsigned int)current, req_names[req] );
1542         req_dumpers[req]( current->buffer );
1543     }
1544     else
1545         fprintf( stderr, "%08x: %d(", (unsigned int)current, req );
1546     if (fd != -1) fprintf( stderr, " ) fd=%d\n", fd );
1547     else fprintf( stderr, " )\n" );
1548 }
1549
1550 void trace_kill( struct thread *thread )
1551 {
1552     fprintf( stderr,"%08x: *killed* exit_code=%d\n",
1553              (unsigned int)thread, thread->exit_code );
1554 }
1555
1556 void trace_reply( struct thread *thread )
1557 {
1558     fprintf( stderr, "%08x: %s() = %x",
1559              (unsigned int)thread, req_names[thread->last_req], thread->error );
1560     if (reply_dumpers[thread->last_req])
1561     {
1562         fprintf( stderr, " {" );
1563         reply_dumpers[thread->last_req]( thread->buffer );
1564         fprintf( stderr, " }" );
1565     }
1566     if (thread->pass_fd != -1) fprintf( stderr, " fd=%d\n", thread->pass_fd );
1567     else fprintf( stderr, "\n" );
1568 }