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