LPARAM in find dialog wm_initdialog is the find/replace structure, not
[wine] / include / server.h
1 /*
2  * Wine server definitions
3  *
4  * Copyright (C) 1998 Alexandre Julliard
5  */
6
7 #ifndef __WINE_SERVER_H
8 #define __WINE_SERVER_H
9
10 #include <stdlib.h>
11 #include <time.h>
12 #include "winbase.h"
13
14 /* Request structures */
15
16 /* Following are the definitions of all the client<->server   */
17 /* communication format; if you make any change in this file, */
18 /* you must run tools/make_requests again. */
19
20
21 /* These empty macros are used by tools/make_requests */
22 /* to generate the request/reply tracing functions */
23 #define IN  /*nothing*/
24 #define OUT /*nothing*/
25 #define VARARG(name,func) /*nothing*/
26
27 struct request_header
28 {
29     IN  int            req;          /* request code */
30     IN  unsigned short var_offset;   /* offset of the variable part of the request */
31     IN  unsigned short var_size;     /* size of the variable part of the request */
32     OUT unsigned int   error;        /* error result */
33 };
34 #define REQUEST_HEADER  struct request_header header
35
36
37 /* placeholder structure for the maximum allowed request size */
38 /* this is used to construct the generic_request union */
39 struct request_max_size
40 {
41     int pad[16]; /* the max request size is 16 ints */
42 };
43
44 /* max size of the variable part of a request */
45 #define REQUEST_MAX_VAR_SIZE  1024
46
47 typedef int handle_t;
48
49 /* definitions of the event data depending on the event code */
50 struct debug_event_exception
51 {
52     EXCEPTION_RECORD record;   /* exception record */
53     int              first;    /* first chance exception? */
54 };
55 struct debug_event_create_thread
56 {
57     handle_t    handle;     /* handle to the new thread */
58     void       *teb;        /* thread teb (in debugged process address space) */
59     void       *start;      /* thread startup routine */
60 };
61 struct debug_event_create_process
62 {
63     handle_t    file;       /* handle to the process exe file */
64     handle_t    process;    /* handle to the new process */
65     handle_t    thread;     /* handle to the new thread */
66     void       *base;       /* base of executable image */
67     int         dbg_offset; /* offset of debug info in file */
68     int         dbg_size;   /* size of debug info */
69     void       *teb;        /* thread teb (in debugged process address space) */
70     void       *start;      /* thread startup routine */
71     void       *name;       /* image name (optional) */
72     int         unicode;    /* is it Unicode? */
73 };
74 struct debug_event_exit
75 {
76     int         exit_code;  /* thread or process exit code */
77 };
78 struct debug_event_load_dll
79 {
80     handle_t    handle;     /* file handle for the dll */
81     void       *base;       /* base address of the dll */
82     int         dbg_offset; /* offset of debug info in file */
83     int         dbg_size;   /* size of debug info */
84     void       *name;       /* image name (optional) */
85     int         unicode;    /* is it Unicode? */
86 };
87 struct debug_event_unload_dll
88 {
89     void       *base;       /* base address of the dll */
90 };
91 struct debug_event_output_string
92 {
93     void       *string;     /* string to display (in debugged process address space) */
94     int         unicode;    /* is it Unicode? */
95     int         length;     /* string length */
96 };
97 struct debug_event_rip_info
98 {
99     int         error;      /* ??? */
100     int         type;       /* ??? */
101 };
102 union debug_event_data
103 {
104     struct debug_event_exception      exception;
105     struct debug_event_create_thread  create_thread;
106     struct debug_event_create_process create_process;
107     struct debug_event_exit           exit;
108     struct debug_event_load_dll       load_dll;
109     struct debug_event_unload_dll     unload_dll;
110     struct debug_event_output_string  output_string;
111     struct debug_event_rip_info       rip_info;
112 };
113
114 /* debug event data */
115 typedef struct
116 {
117     int                      code;   /* event code */
118     union debug_event_data   info;   /* event information */
119 } debug_event_t;
120
121 /* structure used in sending an fd from client to server */
122 struct send_fd
123 {
124     void  *tid;  /* thread id */
125     int    fd;   /* file descriptor on client-side */
126 };
127
128 /* Create a new process from the context of the parent */
129 struct new_process_request
130 {
131     REQUEST_HEADER;                /* request header */
132     IN  int          inherit_all;  /* inherit all handles from parent */
133     IN  int          create_flags; /* creation flags */
134     IN  int          start_flags;  /* flags from startup info */
135     IN  handle_t     exe_file;     /* file handle for main exe */
136     IN  handle_t     hstdin;       /* handle for stdin */
137     IN  handle_t     hstdout;      /* handle for stdout */
138     IN  handle_t     hstderr;      /* handle for stderr */
139     IN  int          cmd_show;     /* main window show mode */
140     OUT handle_t     info;         /* new process info handle */
141     IN  VARARG(filename,string);   /* file name of main exe */
142 };
143
144
145 /* Retrieve information about a newly started process */
146 struct get_new_process_info_request
147 {
148     REQUEST_HEADER;                /* request header */
149     IN  handle_t     info;         /* info handle returned from new_process_request */
150     IN  int          pinherit;     /* process handle inherit flag */
151     IN  int          tinherit;     /* thread handle inherit flag */
152     OUT void*        pid;          /* process id */
153     OUT handle_t     phandle;      /* process handle (in the current process) */
154     OUT void*        tid;          /* thread id */
155     OUT handle_t     thandle;      /* thread handle (in the current process) */
156     OUT handle_t     event;        /* event handle to signal startup */
157 };
158
159
160 /* Create a new thread from the context of the parent */
161 struct new_thread_request
162 {
163     REQUEST_HEADER;                /* request header */
164     IN  int          suspend;      /* new thread should be suspended on creation */
165     IN  int          inherit;      /* inherit flag */
166     IN  int          request_fd;   /* fd for request pipe */
167     OUT void*        tid;          /* thread id */
168     OUT handle_t     handle;       /* thread handle (in the current process) */
169 };
170
171
172 /* Signal that we are finished booting on the client side */
173 struct boot_done_request
174 {
175     REQUEST_HEADER;                /* request header */
176     IN  int          debug_level;  /* new debug level */
177 };
178
179
180 /* Initialize a process; called from the new process context */
181 struct init_process_request
182 {
183     REQUEST_HEADER;                /* request header */
184     IN  void*        ldt_copy;     /* addr of LDT copy */
185     IN  int          ppid;         /* parent Unix pid */
186     OUT int          create_flags; /* creation flags */
187     OUT int          start_flags;  /* flags from startup info */
188     OUT unsigned int server_start; /* server start time (GetTickCount) */
189     OUT handle_t     exe_file;     /* file handle for main exe */
190     OUT handle_t     hstdin;       /* handle for stdin */
191     OUT handle_t     hstdout;      /* handle for stdout */
192     OUT handle_t     hstderr;      /* handle for stderr */
193     OUT int          cmd_show;     /* main window show mode */
194     OUT VARARG(filename,string);   /* file name of main exe */
195 };
196
197
198 /* Signal the end of the process initialization */
199 struct init_process_done_request
200 {
201     REQUEST_HEADER;                /* request header */
202     IN  void*        module;       /* main module base address */
203     IN  void*        entry;        /* process entry point */
204     IN  void*        name;         /* ptr to ptr to name (in process addr space) */
205     IN  handle_t     exe_file;     /* file handle for main exe */
206     IN  int          gui;          /* is it a GUI process? */
207     OUT int          debugged;     /* being debugged? */
208 };
209
210
211 /* Initialize a thread; called from the child after fork()/clone() */
212 struct init_thread_request
213 {
214     REQUEST_HEADER;                /* request header */
215     IN  int          unix_pid;     /* Unix pid of new thread */
216     IN  void*        teb;          /* TEB of new thread (in thread address space) */
217     IN  void*        entry;        /* thread entry point (in thread address space) */
218     IN  int          reply_fd;     /* fd for reply pipe */
219     IN  int          wait_fd;      /* fd for blocking calls pipe */
220     OUT void*        pid;          /* process id of the new thread's process */
221     OUT void*        tid;          /* thread id of the new thread */
222     OUT int          boot;         /* is this the boot thread? */
223     OUT int          version;      /* protocol version */
224 };
225
226
227 /* Set the shared buffer for a thread */
228 struct set_thread_buffer_request
229 {
230     REQUEST_HEADER;
231     IN  int          fd;           /* fd to mmap as shared buffer */
232     OUT unsigned int offset;       /* offset of buffer in file */
233     OUT unsigned int size;         /* size of buffer */
234 };
235
236
237 /* Terminate a process */
238 struct terminate_process_request
239 {
240     REQUEST_HEADER;                /* request header */
241     IN  handle_t     handle;       /* process handle to terminate */
242     IN  int          exit_code;    /* process exit code */
243     OUT int          self;         /* suicide? */
244 };
245
246
247 /* Terminate a thread */
248 struct terminate_thread_request
249 {
250     REQUEST_HEADER;                /* request header */
251     IN  handle_t     handle;       /* thread handle to terminate */
252     IN  int          exit_code;    /* thread exit code */
253     OUT int          self;         /* suicide? */
254     OUT int          last;         /* last thread in this process? */
255 };
256
257
258 /* Retrieve information about a process */
259 struct get_process_info_request
260 {
261     REQUEST_HEADER;                    /* request header */
262     IN  handle_t     handle;           /* process handle */
263     OUT void*        pid;              /* server process id */
264     OUT int          debugged;         /* debugged? */
265     OUT int          exit_code;        /* process exit code */
266     OUT int          priority;         /* priority class */
267     OUT int          process_affinity; /* process affinity mask */
268     OUT int          system_affinity;  /* system affinity mask */
269 };
270
271
272 /* Set a process informations */
273 struct set_process_info_request
274 {
275     REQUEST_HEADER;                /* request header */
276     IN  handle_t     handle;       /* process handle */
277     IN  int          mask;         /* setting mask (see below) */
278     IN  int          priority;     /* priority class */
279     IN  int          affinity;     /* affinity mask */
280 };
281 #define SET_PROCESS_INFO_PRIORITY 0x01
282 #define SET_PROCESS_INFO_AFFINITY 0x02
283
284
285 /* Retrieve information about a thread */
286 struct get_thread_info_request
287 {
288     REQUEST_HEADER;                /* request header */
289     IN  handle_t     handle;       /* thread handle */
290     IN  void*        tid_in;       /* thread id (optional) */
291     OUT void*        tid;          /* server thread id */
292     OUT void*        teb;          /* thread teb pointer */
293     OUT int          exit_code;    /* thread exit code */
294     OUT int          priority;     /* thread priority level */
295 };
296
297
298 /* Set a thread informations */
299 struct set_thread_info_request
300 {
301     REQUEST_HEADER;                /* request header */
302     IN  handle_t     handle;       /* thread handle */
303     IN  int          mask;         /* setting mask (see below) */
304     IN  int          priority;     /* priority class */
305     IN  int          affinity;     /* affinity mask */
306 };
307 #define SET_THREAD_INFO_PRIORITY 0x01
308 #define SET_THREAD_INFO_AFFINITY 0x02
309
310
311 /* Suspend a thread */
312 struct suspend_thread_request
313 {
314     REQUEST_HEADER;                /* request header */
315     IN  handle_t     handle;       /* thread handle */
316     OUT int          count;        /* new suspend count */
317 };
318
319
320 /* Resume a thread */
321 struct resume_thread_request
322 {
323     REQUEST_HEADER;                /* request header */
324     IN  handle_t     handle;       /* thread handle */
325     OUT int          count;        /* new suspend count */
326 };
327
328
329 /* Notify the server that a dll has been loaded */
330 struct load_dll_request
331 {
332     REQUEST_HEADER;                /* request header */
333     IN  handle_t     handle;       /* file handle */
334     IN  void*        base;         /* base address */
335     IN  int          dbg_offset;   /* debug info offset */
336     IN  int          dbg_size;     /* debug info size */
337     IN  void*        name;         /* ptr to ptr to name (in process addr space) */
338 };
339
340
341 /* Notify the server that a dll is being unloaded */
342 struct unload_dll_request
343 {
344     REQUEST_HEADER;                /* request header */
345     IN  void*        base;         /* base address */
346 };
347
348
349 /* Queue an APC for a thread */
350 struct queue_apc_request
351 {
352     REQUEST_HEADER;                /* request header */
353     IN  handle_t     handle;       /* thread handle */
354     IN  int          user;         /* user or system apc? */
355     IN  void*        func;         /* function to call */
356     IN  void*        param;        /* param for function to call */
357 };
358
359
360 /* Get next APC to call */
361 struct get_apc_request
362 {
363     REQUEST_HEADER;                /* request header */
364     IN  int          alertable;    /* is thread alertable? */
365     OUT void*        func;         /* function to call */
366     OUT int          type;         /* function type */
367     OUT VARARG(args,ptrs);         /* function arguments */
368 };
369 enum apc_type { APC_NONE, APC_USER, APC_TIMER, APC_ASYNC };
370
371
372 /* Close a handle for the current process */
373 struct close_handle_request
374 {
375     REQUEST_HEADER;                /* request header */
376     IN  handle_t     handle;       /* handle to close */
377     OUT int          fd;           /* associated fd to close */
378 };
379
380
381 /* Set a handle information */
382 struct set_handle_info_request
383 {
384     REQUEST_HEADER;                /* request header */
385     IN  handle_t     handle;       /* handle we are interested in */
386     IN  int          flags;        /* new handle flags */
387     IN  int          mask;         /* mask for flags to set */
388     IN  int          fd;           /* file descriptor or -1 */
389     OUT int          old_flags;    /* old flag value */
390     OUT int          cur_fd;       /* current file descriptor */
391 };
392
393
394 /* Duplicate a handle */
395 struct dup_handle_request
396 {
397     REQUEST_HEADER;                /* request header */
398     IN  handle_t     src_process;  /* src process handle */
399     IN  handle_t     src_handle;   /* src handle to duplicate */
400     IN  handle_t     dst_process;  /* dst process handle */
401     IN  unsigned int access;       /* wanted access rights */
402     IN  int          inherit;      /* inherit flag */
403     IN  int          options;      /* duplicate options (see below) */
404     OUT handle_t     handle;       /* duplicated handle in dst process */
405     OUT int          fd;           /* associated fd to close */
406 };
407 #define DUP_HANDLE_CLOSE_SOURCE  DUPLICATE_CLOSE_SOURCE
408 #define DUP_HANDLE_SAME_ACCESS   DUPLICATE_SAME_ACCESS
409 #define DUP_HANDLE_MAKE_GLOBAL   0x80000000  /* Not a Windows flag */
410
411
412 /* Open a handle to a process */
413 struct open_process_request
414 {
415     REQUEST_HEADER;                /* request header */
416     IN  void*        pid;          /* process id to open */
417     IN  unsigned int access;       /* wanted access rights */
418     IN  int          inherit;      /* inherit flag */
419     OUT handle_t     handle;       /* handle to the process */
420 };
421
422
423 /* Wait for handles */
424 struct select_request
425 {
426     REQUEST_HEADER;                /* request header */
427     IN  int          flags;        /* wait flags (see below) */
428     IN  int          sec;          /* absolute timeout */
429     IN  int          usec;         /* absolute timeout */
430     IN  VARARG(handles,handles);   /* handles to select on */
431 };
432 #define SELECT_ALL           1
433 #define SELECT_ALERTABLE     2
434 #define SELECT_INTERRUPTIBLE 4
435 #define SELECT_TIMEOUT       8
436
437
438 /* Create an event */
439 struct create_event_request
440 {
441     REQUEST_HEADER;                 /* request header */
442     IN  int          manual_reset;  /* manual reset event */
443     IN  int          initial_state; /* initial state of the event */
444     IN  int          inherit;       /* inherit flag */
445     OUT handle_t     handle;        /* handle to the event */
446     IN  VARARG(name,unicode_str);   /* object name */
447 };
448
449 /* Event operation */
450 struct event_op_request
451 {
452     REQUEST_HEADER;                 /* request header */
453     IN  handle_t      handle;       /* handle to event */
454     IN  int           op;           /* event operation (see below) */
455 };
456 enum event_op { PULSE_EVENT, SET_EVENT, RESET_EVENT };
457
458
459 /* Open an event */
460 struct open_event_request
461 {
462     REQUEST_HEADER;                 /* request header */
463     IN  unsigned int access;        /* wanted access rights */
464     IN  int          inherit;       /* inherit flag */
465     OUT handle_t     handle;        /* handle to the event */
466     IN  VARARG(name,unicode_str);   /* object name */
467 };
468
469
470 /* Create a mutex */
471 struct create_mutex_request
472 {
473     REQUEST_HEADER;                 /* request header */
474     IN  int          owned;         /* initially owned? */
475     IN  int          inherit;       /* inherit flag */
476     OUT handle_t     handle;        /* handle to the mutex */
477     IN  VARARG(name,unicode_str);   /* object name */
478 };
479
480
481 /* Release a mutex */
482 struct release_mutex_request
483 {
484     REQUEST_HEADER;                 /* request header */
485     IN  handle_t     handle;        /* handle to the mutex */
486 };
487
488
489 /* Open a mutex */
490 struct open_mutex_request
491 {
492     REQUEST_HEADER;                 /* request header */
493     IN  unsigned int access;        /* wanted access rights */
494     IN  int          inherit;       /* inherit flag */
495     OUT handle_t     handle;        /* handle to the mutex */
496     IN  VARARG(name,unicode_str);   /* object name */
497 };
498
499
500 /* Create a semaphore */
501 struct create_semaphore_request
502 {
503     REQUEST_HEADER;                 /* request header */
504     IN  unsigned int initial;       /* initial count */
505     IN  unsigned int max;           /* maximum count */
506     IN  int          inherit;       /* inherit flag */
507     OUT handle_t     handle;        /* handle to the semaphore */
508     IN  VARARG(name,unicode_str);   /* object name */
509 };
510
511
512 /* Release a semaphore */
513 struct release_semaphore_request
514 {
515     REQUEST_HEADER;                 /* request header */
516     IN  handle_t     handle;        /* handle to the semaphore */
517     IN  unsigned int count;         /* count to add to semaphore */
518     OUT unsigned int prev_count;    /* previous semaphore count */
519 };
520
521
522 /* Open a semaphore */
523 struct open_semaphore_request
524 {
525     REQUEST_HEADER;                 /* request header */
526     IN  unsigned int access;        /* wanted access rights */
527     IN  int          inherit;       /* inherit flag */
528     OUT handle_t     handle;        /* handle to the semaphore */
529     IN  VARARG(name,unicode_str);   /* object name */
530 };
531
532
533 /* Create a file */
534 struct create_file_request
535 {
536     REQUEST_HEADER;                 /* request header */
537     IN  unsigned int access;        /* wanted access rights */
538     IN  int          inherit;       /* inherit flag */
539     IN  unsigned int sharing;       /* sharing flags */
540     IN  int          create;        /* file create action */
541     IN  unsigned int attrs;         /* file attributes for creation */
542     OUT handle_t     handle;        /* handle to the file */
543     IN  VARARG(filename,string);    /* file name */
544 };
545
546
547 /* Allocate a file handle for a Unix fd */
548 struct alloc_file_handle_request
549 {
550     REQUEST_HEADER;                 /* request header */
551     IN  unsigned int access;        /* wanted access rights */
552     IN  int          fd;            /* file descriptor on the client side */
553     OUT handle_t     handle;        /* handle to the file */
554 };
555
556
557 /* Get a Unix fd to access a file */
558 struct get_handle_fd_request
559 {
560     REQUEST_HEADER;                 /* request header */
561     IN  handle_t     handle;        /* handle to the file */
562     IN  unsigned int access;        /* wanted access rights */
563     OUT int          fd;            /* file descriptor */
564 };
565
566
567 /* Set a file current position */
568 struct set_file_pointer_request
569 {
570     REQUEST_HEADER;                 /* request header */
571     IN  handle_t     handle;        /* handle to the file */
572     IN  int          low;           /* position low word */
573     IN  int          high;          /* position high word */
574     IN  int          whence;        /* whence to seek */
575     OUT int          new_low;       /* new position low word */
576     OUT int          new_high;      /* new position high word */
577 };
578
579
580 /* Truncate (or extend) a file */
581 struct truncate_file_request
582 {
583     REQUEST_HEADER;                 /* request header */
584     IN  handle_t     handle;        /* handle to the file */
585 };
586
587
588 /* Set a file access and modification times */
589 struct set_file_time_request
590 {
591     REQUEST_HEADER;                 /* request header */
592     IN  handle_t     handle;        /* handle to the file */
593     IN  time_t       access_time;   /* last access time */
594     IN  time_t       write_time;    /* last write time */
595 };
596
597
598 /* Flush a file buffers */
599 struct flush_file_request
600 {
601     REQUEST_HEADER;                 /* request header */
602     IN  handle_t     handle;        /* handle to the file */
603 };
604
605
606 /* Get information about a file */
607 struct get_file_info_request
608 {
609     REQUEST_HEADER;                 /* request header */
610     IN  handle_t     handle;        /* handle to the file */
611     OUT int          type;          /* file type */
612     OUT int          attr;          /* file attributes */
613     OUT time_t       access_time;   /* last access time */
614     OUT time_t       write_time;    /* last write time */
615     OUT int          size_high;     /* file size */
616     OUT int          size_low;      /* file size */
617     OUT int          links;         /* number of links */
618     OUT int          index_high;    /* unique index */
619     OUT int          index_low;     /* unique index */
620     OUT unsigned int serial;        /* volume serial number */
621 };
622
623
624 /* Lock a region of a file */
625 struct lock_file_request
626 {
627     REQUEST_HEADER;                 /* request header */
628     IN  handle_t     handle;        /* handle to the file */
629     IN  unsigned int offset_low;    /* offset of start of lock */
630     IN  unsigned int offset_high;   /* offset of start of lock */
631     IN  unsigned int count_low;     /* count of bytes to lock */
632     IN  unsigned int count_high;    /* count of bytes to lock */
633 };
634
635
636 /* Unlock a region of a file */
637 struct unlock_file_request
638 {
639     REQUEST_HEADER;                 /* request header */
640     IN  handle_t     handle;        /* handle to the file */
641     IN  unsigned int offset_low;    /* offset of start of unlock */
642     IN  unsigned int offset_high;   /* offset of start of unlock */
643     IN  unsigned int count_low;     /* count of bytes to unlock */
644     IN  unsigned int count_high;    /* count of bytes to unlock */
645 };
646
647
648 /* Create an anonymous pipe */
649 struct create_pipe_request
650 {
651     REQUEST_HEADER;                 /* request header */
652     IN  int          inherit;       /* inherit flag */
653     OUT handle_t     handle_read;   /* handle to the read-side of the pipe */
654     OUT handle_t     handle_write;  /* handle to the write-side of the pipe */
655 };
656
657
658 /* Create a socket */
659 struct create_socket_request
660 {
661     REQUEST_HEADER;                 /* request header */
662     IN  unsigned int access;        /* wanted access rights */
663     IN  int          inherit;       /* inherit flag */
664     IN  int          family;        /* family, see socket manpage */
665     IN  int          type;          /* type, see socket manpage */
666     IN  int          protocol;      /* protocol, see socket manpage */
667     OUT handle_t     handle;        /* handle to the new socket */
668 };
669
670
671 /* Accept a socket */
672 struct accept_socket_request
673 {
674     REQUEST_HEADER;                 /* request header */
675     IN  handle_t     lhandle;       /* handle to the listening socket */
676     IN  unsigned int access;        /* wanted access rights */
677     IN  int          inherit;       /* inherit flag */
678     OUT handle_t     handle;        /* handle to the new socket */
679 };
680
681
682 /* Set socket event parameters */
683 struct set_socket_event_request
684 {
685     REQUEST_HEADER;                 /* request header */
686     IN  handle_t     handle;        /* handle to the socket */
687     IN  unsigned int mask;          /* event mask */
688     IN  handle_t     event;         /* event object */
689 };
690
691
692 /* Get socket event parameters */
693 struct get_socket_event_request
694 {
695     REQUEST_HEADER;                 /* request header */
696     IN  handle_t     handle;        /* handle to the socket */
697     IN  int          service;       /* clear pending? */
698     IN  handle_t     s_event;       /* "expected" event object */
699     IN  handle_t     c_event;       /* event to clear */
700     OUT unsigned int mask;          /* event mask */
701     OUT unsigned int pmask;         /* pending events */
702     OUT unsigned int state;         /* status bits */
703     OUT VARARG(errors,ints);        /* event errors */
704 };
705
706
707 /* Reenable pending socket events */
708 struct enable_socket_event_request
709 {
710     REQUEST_HEADER;                 /* request header */
711     IN  handle_t     handle;        /* handle to the socket */
712     IN  unsigned int mask;          /* events to re-enable */
713     IN  unsigned int sstate;        /* status bits to set */
714     IN  unsigned int cstate;        /* status bits to clear */
715 };
716
717
718 /* Allocate a console for the current process */
719 struct alloc_console_request
720 {
721     REQUEST_HEADER;                 /* request header */
722     IN  unsigned int access;        /* wanted access rights */
723     IN  int          inherit;       /* inherit flag */
724     OUT handle_t     handle_in;     /* handle to console input */
725     OUT handle_t     handle_out;    /* handle to console output */
726 };
727
728
729 /* Free the console of the current process */
730 struct free_console_request
731 {
732     REQUEST_HEADER;                 /* request header */
733 };
734
735
736 /* Open a handle to the process console */
737 struct open_console_request
738 {
739     REQUEST_HEADER;                 /* request header */
740     IN  int          output;        /* input or output? */
741     IN  unsigned int access;        /* wanted access rights */
742     IN  int          inherit;       /* inherit flag */
743     OUT handle_t     handle;        /* handle to the console */
744 };
745
746
747 /* Set a console file descriptor */
748 struct set_console_fd_request
749 {
750     REQUEST_HEADER;                 /* request header */
751     IN  handle_t     handle;        /* handle to the console */
752     IN  handle_t     handle_in;     /* handle of file to use as input */
753     IN  handle_t     handle_out;    /* handle of file to use as output */
754     IN  int          pid;           /* pid of xterm (hack) */
755 };
756
757
758 /* Get a console mode (input or output) */
759 struct get_console_mode_request
760 {
761     REQUEST_HEADER;                 /* request header */
762     IN  handle_t     handle;        /* handle to the console */
763     OUT int          mode;          /* console mode */
764 };
765
766
767 /* Set a console mode (input or output) */
768 struct set_console_mode_request
769 {
770     REQUEST_HEADER;                 /* request header */
771     IN  handle_t     handle;        /* handle to the console */
772     IN  int          mode;          /* console mode */
773 };
774
775
776 /* Set info about a console (output only) */
777 struct set_console_info_request
778 {
779     REQUEST_HEADER;                 /* request header */
780     IN  handle_t     handle;        /* handle to the console */
781     IN  int          mask;          /* setting mask (see below) */
782     IN  int          cursor_size;   /* size of cursor (percentage filled) */
783     IN  int          cursor_visible;/* cursor visibility flag */
784     IN  VARARG(title,string);       /* console title */
785 };
786 #define SET_CONSOLE_INFO_CURSOR 0x01
787 #define SET_CONSOLE_INFO_TITLE  0x02
788
789 /* Get info about a console (output only) */
790 struct get_console_info_request
791 {
792     REQUEST_HEADER;                 /* request header */
793     IN  handle_t     handle;        /* handle to the console */
794     OUT int          cursor_size;   /* size of cursor (percentage filled) */
795     OUT int          cursor_visible;/* cursor visibility flag */
796     OUT int          pid;           /* pid of xterm (hack) */
797     OUT VARARG(title,string);       /* console title */
798 };
799
800
801 /* Add input records to a console input queue */
802 struct write_console_input_request
803 {
804     REQUEST_HEADER;                 /* request header */
805     IN  handle_t     handle;        /* handle to the console input */
806     OUT int          written;       /* number of records written */
807     IN  VARARG(rec,input_records);  /* input records */
808 };
809
810 /* Fetch input records from a console input queue */
811 struct read_console_input_request
812 {
813     REQUEST_HEADER;                 /* request header */
814     IN  handle_t     handle;        /* handle to the console input */
815     IN  int          flush;         /* flush the retrieved records from the queue? */
816     OUT int          read;          /* number of records read */
817     OUT VARARG(rec,input_records);  /* input records */
818 };
819
820
821 /* Create a change notification */
822 struct create_change_notification_request
823 {
824     REQUEST_HEADER;                 /* request header */
825     IN  int          subtree;       /* watch all the subtree */
826     IN  int          filter;        /* notification filter */
827     OUT handle_t     handle;        /* handle to the change notification */
828 };
829
830
831 /* Create a file mapping */
832 struct create_mapping_request
833 {
834     REQUEST_HEADER;                 /* request header */
835     IN  int          size_high;     /* mapping size */
836     IN  int          size_low;      /* mapping size */
837     IN  int          protect;       /* protection flags (see below) */
838     IN  int          inherit;       /* inherit flag */
839     IN  handle_t     file_handle;   /* file handle */
840     OUT handle_t     handle;        /* handle to the mapping */
841     IN  VARARG(name,unicode_str);   /* object name */
842 };
843 /* protection flags */
844 #define VPROT_READ       0x01
845 #define VPROT_WRITE      0x02
846 #define VPROT_EXEC       0x04
847 #define VPROT_WRITECOPY  0x08
848 #define VPROT_GUARD      0x10
849 #define VPROT_NOCACHE    0x20
850 #define VPROT_COMMITTED  0x40
851 #define VPROT_IMAGE      0x80
852
853
854 /* Open a mapping */
855 struct open_mapping_request
856 {
857     REQUEST_HEADER;                 /* request header */
858     IN  unsigned int access;        /* wanted access rights */
859     IN  int          inherit;       /* inherit flag */
860     OUT handle_t     handle;        /* handle to the mapping */
861     IN  VARARG(name,unicode_str);   /* object name */
862 };
863
864
865 /* Get information about a file mapping */
866 struct get_mapping_info_request
867 {
868     REQUEST_HEADER;                 /* request header */
869     IN  handle_t     handle;        /* handle to the mapping */
870     OUT int          size_high;     /* mapping size */
871     OUT int          size_low;      /* mapping size */
872     OUT int          protect;       /* protection flags */
873     OUT int          header_size;   /* header size (for VPROT_IMAGE mapping) */
874     OUT void*        base;          /* default base addr (for VPROT_IMAGE mapping) */
875     OUT handle_t     shared_file;   /* shared mapping file handle */
876     OUT int          shared_size;   /* shared mapping size */
877 };
878
879
880 /* Create a device */
881 struct create_device_request
882 {
883     REQUEST_HEADER;                 /* request header */
884     IN  unsigned int access;        /* wanted access rights */
885     IN  int          inherit;       /* inherit flag */
886     IN  int          id;            /* client private id */
887     OUT handle_t     handle;        /* handle to the device */
888 };
889
890
891 /* Create a snapshot */
892 struct create_snapshot_request
893 {
894     REQUEST_HEADER;                 /* request header */
895     IN  int          inherit;       /* inherit flag */
896     IN  int          flags;         /* snapshot flags (TH32CS_*) */
897     IN  void*        pid;           /* process id */
898     OUT handle_t     handle;        /* handle to the snapshot */
899 };
900
901
902 /* Get the next process from a snapshot */
903 struct next_process_request
904 {
905     REQUEST_HEADER;                 /* request header */
906     IN  handle_t     handle;        /* handle to the snapshot */
907     IN  int          reset;         /* reset snapshot position? */
908     OUT int          count;         /* process usage count */
909     OUT void*        pid;           /* process id */
910     OUT int          threads;       /* number of threads */
911     OUT int          priority;      /* process priority */
912 };
913
914
915 /* Get the next thread from a snapshot */
916 struct next_thread_request
917 {
918     REQUEST_HEADER;                 /* request header */
919     IN  handle_t     handle;        /* handle to the snapshot */
920     IN  int          reset;         /* reset snapshot position? */
921     OUT int          count;         /* thread usage count */
922     OUT void*        pid;           /* process id */
923     OUT void*        tid;           /* thread id */
924     OUT int          base_pri;      /* base priority */
925     OUT int          delta_pri;     /* delta priority */
926 };
927
928
929 /* Get the next module from a snapshot */
930 struct next_module_request
931 {
932     REQUEST_HEADER;                 /* request header */
933     IN  handle_t     handle;        /* handle to the snapshot */
934     IN  int          reset;         /* reset snapshot position? */
935     OUT void*        pid;           /* process id */
936     OUT void*        base;          /* module base address */
937 };
938
939
940 /* Wait for a debug event */
941 struct wait_debug_event_request
942 {
943     REQUEST_HEADER;                /* request header */
944     IN  int           get_handle;  /* should we alloc a handle for waiting? */
945     OUT void*         pid;         /* process id */
946     OUT void*         tid;         /* thread id */
947     OUT handle_t      wait;        /* wait handle if no event ready */
948     OUT VARARG(event,debug_event); /* debug event data */
949 };
950
951
952 /* Queue an exception event */
953 struct queue_exception_event_request
954 {
955     REQUEST_HEADER;                /* request header */
956     IN  int              first;    /* first chance exception? */
957     OUT handle_t         handle;   /* handle to the queued event */
958     IN  VARARG(record,exc_event);  /* thread context followed by exception record */
959 };
960
961
962 /* Retrieve the status of an exception event */
963 struct get_exception_status_request
964 {
965     REQUEST_HEADER;                /* request header */
966     OUT handle_t         handle;   /* handle to the queued event */
967     OUT int              status;   /* event continuation status */
968     OUT VARARG(context,context);   /* modified thread context */
969 };
970
971
972 /* Send an output string to the debugger */
973 struct output_debug_string_request
974 {
975     REQUEST_HEADER;                /* request header */
976     IN  void*         string;      /* string to display (in debugged process address space) */
977     IN  int           unicode;     /* is it Unicode? */
978     IN  int           length;      /* string length */
979 };
980
981
982 /* Continue a debug event */
983 struct continue_debug_event_request
984 {
985     REQUEST_HEADER;                /* request header */
986     IN  void*        pid;          /* process id to continue */
987     IN  void*        tid;          /* thread id to continue */
988     IN  int          status;       /* continuation status */
989 };
990
991
992 /* Start debugging an existing process */
993 struct debug_process_request
994 {
995     REQUEST_HEADER;                /* request header */
996     IN  void*        pid;          /* id of the process to debug */
997 };
998
999
1000 /* Read data from a process address space */
1001 struct read_process_memory_request
1002 {
1003     REQUEST_HEADER;                /* request header */
1004     IN  handle_t     handle;       /* process handle */
1005     IN  void*        addr;         /* addr to read from (must be int-aligned) */
1006     IN  int          len;          /* number of ints to read */
1007     OUT VARARG(data,bytes);        /* result data */
1008 };
1009
1010
1011 /* Write data to a process address space */
1012 struct write_process_memory_request
1013 {
1014     REQUEST_HEADER;                /* request header */
1015     IN  handle_t     handle;       /* process handle */
1016     IN  void*        addr;         /* addr to write to (must be int-aligned) */
1017     IN  int          len;          /* number of ints to write */
1018     IN  unsigned int first_mask;   /* mask for first word */
1019     IN  unsigned int last_mask;    /* mask for last word */
1020     IN  VARARG(data,bytes);        /* result data */
1021 };
1022
1023
1024 /* Create a registry key */
1025 struct create_key_request
1026 {
1027     REQUEST_HEADER;                /* request header */
1028     IN  handle_t     parent;       /* handle to the parent key */
1029     IN  unsigned int access;       /* desired access rights */
1030     IN  unsigned int options;      /* creation options */
1031     IN  time_t       modif;        /* last modification time */
1032     OUT handle_t     hkey;         /* handle to the created key */
1033     OUT int          created;      /* has it been newly created? */
1034     IN  VARARG(name,unicode_len_str);  /* key name */
1035     IN  VARARG(class,unicode_str);     /* class name */
1036 };
1037
1038 /* Open a registry key */
1039 struct open_key_request
1040 {
1041     REQUEST_HEADER;                /* request header */
1042     IN  handle_t     parent;       /* handle to the parent key */
1043     IN  unsigned int access;       /* desired access rights */
1044     OUT handle_t     hkey;         /* handle to the open key */
1045     IN  VARARG(name,unicode_str);  /* key name */
1046 };
1047
1048
1049 /* Delete a registry key */
1050 struct delete_key_request
1051 {
1052     REQUEST_HEADER;                /* request header */
1053     IN  handle_t     hkey;         /* handle to the key */
1054 };
1055
1056
1057 /* Enumerate registry subkeys */
1058 struct enum_key_request
1059 {
1060     REQUEST_HEADER;                /* request header */
1061     IN  handle_t     hkey;         /* handle to registry key */
1062     IN  int          index;        /* index of subkey (or -1 for current key) */
1063     IN  int          full;         /* return the full info? */
1064     OUT int          subkeys;      /* number of subkeys */
1065     OUT int          max_subkey;   /* longest subkey name */
1066     OUT int          max_class;    /* longest class name */
1067     OUT int          values;       /* number of values */
1068     OUT int          max_value;    /* longest value name */
1069     OUT int          max_data;     /* longest value data */
1070     OUT time_t       modif;        /* last modification time */
1071     OUT VARARG(name,unicode_len_str);  /* key name */
1072     OUT VARARG(class,unicode_str);     /* class name */
1073 };
1074
1075
1076 /* Set a value of a registry key */
1077 struct set_key_value_request
1078 {
1079     REQUEST_HEADER;                /* request header */
1080     IN  handle_t     hkey;         /* handle to registry key */
1081     IN  int          type;         /* value type */
1082     IN  unsigned int total;        /* total value len */
1083     IN  unsigned int offset;       /* offset for setting data */
1084     IN  VARARG(name,unicode_len_str);  /* value name */
1085     IN  VARARG(data,bytes);        /* value data */
1086 };
1087
1088
1089 /* Retrieve the value of a registry key */
1090 struct get_key_value_request
1091 {
1092     REQUEST_HEADER;                /* request header */
1093     IN  handle_t     hkey;         /* handle to registry key */
1094     IN  unsigned int offset;       /* offset for getting data */
1095     OUT int          type;         /* value type */
1096     OUT int          len;          /* value data len */
1097     IN  VARARG(name,unicode_len_str);  /* value name */
1098     OUT VARARG(data,bytes);        /* value data */
1099 };
1100
1101
1102 /* Enumerate a value of a registry key */
1103 struct enum_key_value_request
1104 {
1105     REQUEST_HEADER;                /* request header */
1106     IN  handle_t     hkey;         /* handle to registry key */
1107     IN  int          index;        /* value index */
1108     IN  unsigned int offset;       /* offset for getting data */
1109     OUT int          type;         /* value type */
1110     OUT int          len;          /* value data len */
1111     OUT VARARG(name,unicode_len_str);  /* value name */
1112     OUT VARARG(data,bytes);        /* value data */
1113 };
1114
1115
1116 /* Delete a value of a registry key */
1117 struct delete_key_value_request
1118 {
1119     REQUEST_HEADER;                /* request header */
1120     IN  handle_t     hkey;         /* handle to registry key */
1121     IN  VARARG(name,unicode_str);  /* value name */
1122 };
1123
1124
1125 /* Load a registry branch from a file */
1126 struct load_registry_request
1127 {
1128     REQUEST_HEADER;                /* request header */
1129     IN  handle_t     hkey;         /* root key to load to */
1130     IN  handle_t     file;         /* file to load from */
1131     IN  VARARG(name,unicode_str);  /* subkey name */
1132 };
1133
1134
1135 /* Save a registry branch to a file */
1136 struct save_registry_request
1137 {
1138     REQUEST_HEADER;                /* request header */
1139     IN  handle_t     hkey;         /* key to save */
1140     IN  handle_t     file;         /* file to save to */
1141 };
1142
1143
1144 /* Save a registry branch at server exit */
1145 struct save_registry_atexit_request
1146 {
1147     REQUEST_HEADER;                /* request header */
1148     IN  handle_t     hkey;         /* key to save */
1149     IN  VARARG(file,string);       /* file to save to */
1150 };
1151
1152
1153 /* Set the current and saving level for the registry */
1154 struct set_registry_levels_request
1155 {
1156     REQUEST_HEADER;                /* request header */
1157     IN  int          current;      /* new current level */
1158     IN  int          saving;       /* new saving level */
1159     IN  int          period;       /* duration between periodic saves (milliseconds) */
1160 };
1161
1162
1163 /* Create a waitable timer */
1164 struct create_timer_request
1165 {
1166     REQUEST_HEADER;                 /* request header */
1167     IN  int          inherit;       /* inherit flag */
1168     IN  int          manual;        /* manual reset */
1169     OUT handle_t     handle;        /* handle to the timer */
1170     IN  VARARG(name,unicode_str);   /* object name */
1171 };
1172
1173
1174 /* Open a waitable timer */
1175 struct open_timer_request
1176 {
1177     REQUEST_HEADER;                 /* request header */
1178     IN  unsigned int access;        /* wanted access rights */
1179     IN  int          inherit;       /* inherit flag */
1180     OUT handle_t     handle;        /* handle to the timer */
1181     IN  VARARG(name,unicode_str);   /* object name */
1182 };
1183
1184 /* Set a waitable timer */
1185 struct set_timer_request
1186 {
1187     REQUEST_HEADER;                 /* request header */
1188     IN  handle_t     handle;        /* handle to the timer */
1189     IN  int          sec;           /* next expiration absolute time */
1190     IN  int          usec;          /* next expiration absolute time */
1191     IN  int          period;        /* timer period in ms */
1192     IN  void*        callback;      /* callback function */
1193     IN  void*        arg;           /* callback argument */
1194 };
1195
1196 /* Cancel a waitable timer */
1197 struct cancel_timer_request
1198 {
1199     REQUEST_HEADER;                 /* request header */
1200     IN  handle_t     handle;        /* handle to the timer */
1201 };
1202
1203
1204 /* Retrieve the current context of a thread */
1205 struct get_thread_context_request
1206 {
1207     REQUEST_HEADER;                /* request header */
1208     IN  handle_t     handle;       /* thread handle */
1209     IN  unsigned int flags;        /* context flags */
1210     OUT VARARG(context,context);   /* thread context */
1211 };
1212
1213
1214 /* Set the current context of a thread */
1215 struct set_thread_context_request
1216 {
1217     REQUEST_HEADER;                /* request header */
1218     IN  handle_t     handle;       /* thread handle */
1219     IN  unsigned int flags;        /* context flags */
1220     IN  VARARG(context,context);   /* thread context */
1221 };
1222
1223
1224 /* Fetch a selector entry for a thread */
1225 struct get_selector_entry_request
1226 {
1227     REQUEST_HEADER;                /* request header */
1228     IN  handle_t      handle;      /* thread handle */
1229     IN  int           entry;       /* LDT entry */
1230     OUT unsigned int  base;        /* selector base */
1231     OUT unsigned int  limit;       /* selector limit */
1232     OUT unsigned char flags;       /* selector flags */
1233 };
1234
1235
1236 /* Add an atom */
1237 struct add_atom_request
1238 {
1239     REQUEST_HEADER;                /* request header */
1240     IN  int           local;       /* is atom in local process table? */
1241     OUT int           atom;        /* resulting atom */
1242     IN  VARARG(name,unicode_str);  /* atom name */
1243 };
1244
1245
1246 /* Delete an atom */
1247 struct delete_atom_request
1248 {
1249     REQUEST_HEADER;                /* request header */
1250     IN  int           atom;        /* atom handle */
1251     IN  int           local;       /* is atom in local process table? */
1252 };
1253
1254
1255 /* Find an atom */
1256 struct find_atom_request
1257 {
1258     REQUEST_HEADER;                /* request header */
1259     IN  int          local;        /* is atom in local process table? */
1260     OUT int          atom;         /* atom handle */
1261     IN  VARARG(name,unicode_str);  /* atom name */
1262 };
1263
1264
1265 /* Get an atom name */
1266 struct get_atom_name_request
1267 {
1268     REQUEST_HEADER;                /* request header */
1269     IN  int          atom;         /* atom handle */
1270     IN  int          local;        /* is atom in local process table? */
1271     OUT int          count;        /* atom lock count */
1272     OUT VARARG(name,unicode_str);  /* atom name */
1273 };
1274
1275
1276 /* Init the process atom table */
1277 struct init_atom_table_request
1278 {
1279     REQUEST_HEADER;                /* request header */
1280     IN  int          entries;      /* number of entries */
1281 };
1282
1283
1284 /* Get the message queue of the current thread */
1285 struct get_msg_queue_request
1286 {
1287     REQUEST_HEADER;                /* request header */
1288     OUT handle_t     handle;       /* handle to the queue */
1289 };
1290
1291 /* Wake up a message queue */
1292 struct wake_queue_request
1293 {
1294     REQUEST_HEADER;                /* request header */
1295     IN  handle_t     handle;       /* handle to the queue */
1296     IN  unsigned int bits;         /* wake bits */
1297 };
1298
1299 /* Wait for a process to start waiting on input */
1300 struct wait_input_idle_request
1301 {
1302     REQUEST_HEADER;                /* request header */
1303     IN  handle_t     handle;       /* process handle */
1304     IN  int          timeout;      /* timeout */
1305     OUT handle_t     event;        /* handle to idle event */
1306 };
1307
1308 struct create_serial_request
1309 {
1310     REQUEST_HEADER;                /* request header */
1311     IN  unsigned int access;       /* wanted access rights */
1312     IN  int          inherit;      /* inherit flag */
1313     IN  unsigned int sharing;      /* sharing flags */
1314     OUT handle_t     handle;       /* handle to the port */
1315     IN  VARARG(name,string);       /* file name */
1316 };
1317
1318 struct get_serial_info_request
1319 {
1320     REQUEST_HEADER;                /* request header */
1321     IN  handle_t     handle;       /* handle to comm port */
1322     OUT unsigned int readinterval;
1323     OUT unsigned int readconst;
1324     OUT unsigned int readmult;
1325     OUT unsigned int writeconst;
1326     OUT unsigned int writemult;
1327     OUT unsigned int eventmask;
1328     OUT unsigned int commerror;
1329 };
1330
1331 struct set_serial_info_request
1332 {
1333     REQUEST_HEADER;                /* request header */
1334     IN  handle_t     handle;       /* handle to comm port */
1335     IN  int          flags;        /* bitmask to set values (see below) */
1336     IN  unsigned int readinterval;
1337     IN  unsigned int readconst;
1338     IN  unsigned int readmult;
1339     IN  unsigned int writeconst;
1340     IN  unsigned int writemult;
1341     IN  unsigned int eventmask;
1342     IN  unsigned int commerror;
1343 };
1344 #define SERIALINFO_SET_TIMEOUTS  0x01
1345 #define SERIALINFO_SET_MASK      0x02
1346 #define SERIALINFO_SET_ERROR     0x04
1347
1348 struct create_async_request
1349 {
1350     REQUEST_HEADER;                /* request header */
1351     IN  handle_t     file_handle;  /* handle to comm port */
1352     IN  void*        overlapped;
1353     IN  void*        buffer;
1354     IN  int          count;
1355     IN  void*        func;
1356     IN  int          type;
1357     OUT handle_t     ov_handle;
1358 };
1359 #define ASYNC_TYPE_READ  0x01
1360 #define ASYNC_TYPE_WRITE 0x02
1361 #define ASYNC_TYPE_WAIT  0x03
1362
1363 /*
1364  * Used by service thread to tell the server that the current
1365  * operation has completed
1366  */
1367 struct async_result_request
1368 {
1369     REQUEST_HEADER;                /* request header */
1370     IN  handle_t     ov_handle;
1371     IN  int          result;       /* NT status code */
1372 };
1373
1374 /* Everything below this line is generated automatically by tools/make_requests */
1375 /* ### make_requests begin ### */
1376
1377 enum request
1378 {
1379     REQ_new_process,
1380     REQ_get_new_process_info,
1381     REQ_new_thread,
1382     REQ_boot_done,
1383     REQ_init_process,
1384     REQ_init_process_done,
1385     REQ_init_thread,
1386     REQ_set_thread_buffer,
1387     REQ_terminate_process,
1388     REQ_terminate_thread,
1389     REQ_get_process_info,
1390     REQ_set_process_info,
1391     REQ_get_thread_info,
1392     REQ_set_thread_info,
1393     REQ_suspend_thread,
1394     REQ_resume_thread,
1395     REQ_load_dll,
1396     REQ_unload_dll,
1397     REQ_queue_apc,
1398     REQ_get_apc,
1399     REQ_close_handle,
1400     REQ_set_handle_info,
1401     REQ_dup_handle,
1402     REQ_open_process,
1403     REQ_select,
1404     REQ_create_event,
1405     REQ_event_op,
1406     REQ_open_event,
1407     REQ_create_mutex,
1408     REQ_release_mutex,
1409     REQ_open_mutex,
1410     REQ_create_semaphore,
1411     REQ_release_semaphore,
1412     REQ_open_semaphore,
1413     REQ_create_file,
1414     REQ_alloc_file_handle,
1415     REQ_get_handle_fd,
1416     REQ_set_file_pointer,
1417     REQ_truncate_file,
1418     REQ_set_file_time,
1419     REQ_flush_file,
1420     REQ_get_file_info,
1421     REQ_lock_file,
1422     REQ_unlock_file,
1423     REQ_create_pipe,
1424     REQ_create_socket,
1425     REQ_accept_socket,
1426     REQ_set_socket_event,
1427     REQ_get_socket_event,
1428     REQ_enable_socket_event,
1429     REQ_alloc_console,
1430     REQ_free_console,
1431     REQ_open_console,
1432     REQ_set_console_fd,
1433     REQ_get_console_mode,
1434     REQ_set_console_mode,
1435     REQ_set_console_info,
1436     REQ_get_console_info,
1437     REQ_write_console_input,
1438     REQ_read_console_input,
1439     REQ_create_change_notification,
1440     REQ_create_mapping,
1441     REQ_open_mapping,
1442     REQ_get_mapping_info,
1443     REQ_create_device,
1444     REQ_create_snapshot,
1445     REQ_next_process,
1446     REQ_next_thread,
1447     REQ_next_module,
1448     REQ_wait_debug_event,
1449     REQ_queue_exception_event,
1450     REQ_get_exception_status,
1451     REQ_output_debug_string,
1452     REQ_continue_debug_event,
1453     REQ_debug_process,
1454     REQ_read_process_memory,
1455     REQ_write_process_memory,
1456     REQ_create_key,
1457     REQ_open_key,
1458     REQ_delete_key,
1459     REQ_enum_key,
1460     REQ_set_key_value,
1461     REQ_get_key_value,
1462     REQ_enum_key_value,
1463     REQ_delete_key_value,
1464     REQ_load_registry,
1465     REQ_save_registry,
1466     REQ_save_registry_atexit,
1467     REQ_set_registry_levels,
1468     REQ_create_timer,
1469     REQ_open_timer,
1470     REQ_set_timer,
1471     REQ_cancel_timer,
1472     REQ_get_thread_context,
1473     REQ_set_thread_context,
1474     REQ_get_selector_entry,
1475     REQ_add_atom,
1476     REQ_delete_atom,
1477     REQ_find_atom,
1478     REQ_get_atom_name,
1479     REQ_init_atom_table,
1480     REQ_get_msg_queue,
1481     REQ_wake_queue,
1482     REQ_wait_input_idle,
1483     REQ_create_serial,
1484     REQ_get_serial_info,
1485     REQ_set_serial_info,
1486     REQ_create_async,
1487     REQ_async_result,
1488     REQ_NB_REQUESTS
1489 };
1490
1491 union generic_request
1492 {
1493     struct request_max_size max_size;
1494     struct request_header header;
1495     struct new_process_request new_process;
1496     struct get_new_process_info_request get_new_process_info;
1497     struct new_thread_request new_thread;
1498     struct boot_done_request boot_done;
1499     struct init_process_request init_process;
1500     struct init_process_done_request init_process_done;
1501     struct init_thread_request init_thread;
1502     struct set_thread_buffer_request set_thread_buffer;
1503     struct terminate_process_request terminate_process;
1504     struct terminate_thread_request terminate_thread;
1505     struct get_process_info_request get_process_info;
1506     struct set_process_info_request set_process_info;
1507     struct get_thread_info_request get_thread_info;
1508     struct set_thread_info_request set_thread_info;
1509     struct suspend_thread_request suspend_thread;
1510     struct resume_thread_request resume_thread;
1511     struct load_dll_request load_dll;
1512     struct unload_dll_request unload_dll;
1513     struct queue_apc_request queue_apc;
1514     struct get_apc_request get_apc;
1515     struct close_handle_request close_handle;
1516     struct set_handle_info_request set_handle_info;
1517     struct dup_handle_request dup_handle;
1518     struct open_process_request open_process;
1519     struct select_request select;
1520     struct create_event_request create_event;
1521     struct event_op_request event_op;
1522     struct open_event_request open_event;
1523     struct create_mutex_request create_mutex;
1524     struct release_mutex_request release_mutex;
1525     struct open_mutex_request open_mutex;
1526     struct create_semaphore_request create_semaphore;
1527     struct release_semaphore_request release_semaphore;
1528     struct open_semaphore_request open_semaphore;
1529     struct create_file_request create_file;
1530     struct alloc_file_handle_request alloc_file_handle;
1531     struct get_handle_fd_request get_handle_fd;
1532     struct set_file_pointer_request set_file_pointer;
1533     struct truncate_file_request truncate_file;
1534     struct set_file_time_request set_file_time;
1535     struct flush_file_request flush_file;
1536     struct get_file_info_request get_file_info;
1537     struct lock_file_request lock_file;
1538     struct unlock_file_request unlock_file;
1539     struct create_pipe_request create_pipe;
1540     struct create_socket_request create_socket;
1541     struct accept_socket_request accept_socket;
1542     struct set_socket_event_request set_socket_event;
1543     struct get_socket_event_request get_socket_event;
1544     struct enable_socket_event_request enable_socket_event;
1545     struct alloc_console_request alloc_console;
1546     struct free_console_request free_console;
1547     struct open_console_request open_console;
1548     struct set_console_fd_request set_console_fd;
1549     struct get_console_mode_request get_console_mode;
1550     struct set_console_mode_request set_console_mode;
1551     struct set_console_info_request set_console_info;
1552     struct get_console_info_request get_console_info;
1553     struct write_console_input_request write_console_input;
1554     struct read_console_input_request read_console_input;
1555     struct create_change_notification_request create_change_notification;
1556     struct create_mapping_request create_mapping;
1557     struct open_mapping_request open_mapping;
1558     struct get_mapping_info_request get_mapping_info;
1559     struct create_device_request create_device;
1560     struct create_snapshot_request create_snapshot;
1561     struct next_process_request next_process;
1562     struct next_thread_request next_thread;
1563     struct next_module_request next_module;
1564     struct wait_debug_event_request wait_debug_event;
1565     struct queue_exception_event_request queue_exception_event;
1566     struct get_exception_status_request get_exception_status;
1567     struct output_debug_string_request output_debug_string;
1568     struct continue_debug_event_request continue_debug_event;
1569     struct debug_process_request debug_process;
1570     struct read_process_memory_request read_process_memory;
1571     struct write_process_memory_request write_process_memory;
1572     struct create_key_request create_key;
1573     struct open_key_request open_key;
1574     struct delete_key_request delete_key;
1575     struct enum_key_request enum_key;
1576     struct set_key_value_request set_key_value;
1577     struct get_key_value_request get_key_value;
1578     struct enum_key_value_request enum_key_value;
1579     struct delete_key_value_request delete_key_value;
1580     struct load_registry_request load_registry;
1581     struct save_registry_request save_registry;
1582     struct save_registry_atexit_request save_registry_atexit;
1583     struct set_registry_levels_request set_registry_levels;
1584     struct create_timer_request create_timer;
1585     struct open_timer_request open_timer;
1586     struct set_timer_request set_timer;
1587     struct cancel_timer_request cancel_timer;
1588     struct get_thread_context_request get_thread_context;
1589     struct set_thread_context_request set_thread_context;
1590     struct get_selector_entry_request get_selector_entry;
1591     struct add_atom_request add_atom;
1592     struct delete_atom_request delete_atom;
1593     struct find_atom_request find_atom;
1594     struct get_atom_name_request get_atom_name;
1595     struct init_atom_table_request init_atom_table;
1596     struct get_msg_queue_request get_msg_queue;
1597     struct wake_queue_request wake_queue;
1598     struct wait_input_idle_request wait_input_idle;
1599     struct create_serial_request create_serial;
1600     struct get_serial_info_request get_serial_info;
1601     struct set_serial_info_request set_serial_info;
1602     struct create_async_request create_async;
1603     struct async_result_request async_result;
1604 };
1605
1606 #define SERVER_PROTOCOL_VERSION 41
1607
1608 /* ### make_requests end ### */
1609 /* Everything above this line is generated automatically by tools/make_requests */
1610
1611 #undef REQUEST_HEADER
1612 #undef VARARG
1613
1614 /* client-side functions */
1615
1616 #ifndef __WINE_SERVER__
1617
1618 #include "thread.h"
1619 #include "ntddk.h"
1620 #include "wine/exception.h"
1621
1622 /* client communication functions */
1623
1624 extern unsigned int wine_server_call( union generic_request *req, size_t size );
1625 extern void server_protocol_error( const char *err, ... ) WINE_NORETURN;
1626 extern void server_protocol_perror( const char *err ) WINE_NORETURN;
1627 extern void wine_server_alloc_req( union generic_request *req, size_t size );
1628 extern void wine_server_send_fd( int fd );
1629 extern int wine_server_recv_fd( handle_t handle );
1630 extern const char *get_config_dir(void);
1631
1632 /* do a server call and set the last error code */
1633 inline static unsigned int __server_call_err( union generic_request *req, size_t size )
1634 {
1635     unsigned int res = wine_server_call( req, size );
1636     if (res) SetLastError( RtlNtStatusToDosError(res) );
1637     return res;
1638 }
1639
1640 /* get a pointer to the variable part of the request */
1641 inline static void *server_data_ptr( const void *req )
1642 {
1643     return (char *)NtCurrentTeb()->buffer + ((struct request_header *)req)->var_offset;
1644 }
1645
1646 /* get the size of the variable part of the request */
1647 inline static size_t server_data_size( const void *req )
1648 {
1649     return ((struct request_header *)req)->var_size;
1650 }
1651
1652
1653 /* exception support for server calls */
1654
1655 extern DWORD __wine_server_exception_handler( PEXCEPTION_RECORD record, EXCEPTION_FRAME *frame,
1656                                               CONTEXT *context, EXCEPTION_FRAME **pdispatcher );
1657
1658 struct __server_exception_frame
1659 {
1660     EXCEPTION_FRAME  frame;
1661     unsigned int     buffer_pos;  /* saved buffer position */
1662 };
1663
1664
1665 /* macros for server requests */
1666
1667 #define SERVER_START_REQ(type) \
1668     do { \
1669         union generic_request __req; \
1670         struct type##_request * const req = &__req.type; \
1671         __req.header.req = REQ_##type; \
1672         __req.header.var_size = 0; \
1673         do
1674
1675 #define SERVER_END_REQ \
1676         while(0); \
1677     } while(0)
1678
1679 #define SERVER_START_VAR_REQ(type,size) \
1680     do { \
1681         struct __server_exception_frame __f; \
1682         union generic_request __req; \
1683         struct type##_request * const req = &__req.type; \
1684         __f.frame.Handler = __wine_server_exception_handler; \
1685         __f.buffer_pos = NtCurrentTeb()->buffer_pos; \
1686         __wine_push_frame( &__f.frame ); \
1687         __req.header.req = REQ_##type; \
1688         wine_server_alloc_req( &__req, (size) ); \
1689         do
1690
1691 #define SERVER_END_VAR_REQ \
1692         while(0); \
1693         NtCurrentTeb()->buffer_pos = __f.buffer_pos; \
1694         __wine_pop_frame( &__f.frame ); \
1695     } while(0)
1696
1697 #define SERVER_CALL()      (wine_server_call( &__req, sizeof(*req) ))
1698 #define SERVER_CALL_ERR()  (__server_call_err( &__req, sizeof(*req) ))
1699
1700
1701 extern void CLIENT_InitServer(void);
1702 extern void CLIENT_InitThread(void);
1703 extern void CLIENT_BootDone( int debug_level );
1704 extern int CLIENT_IsBootThread(void);
1705 #endif  /* __WINE_SERVER__ */
1706
1707 #endif  /* __WINE_SERVER_H */