Redesign of the server communication protocol to allow arbitrary sized
data to be exchanged.
Split request and reply structures to make backwards compatibility
easier.
Moved many console functions to dlls/kernel, added code page support,
changed a few requests to behave properly with the new protocol.

diff --git a/server/request.h b/server/request.h
index 5866641..b1409aa 100644
--- a/server/request.h
+++ b/server/request.h
@@ -7,6 +7,8 @@
 #ifndef __WINE_SERVER_REQUEST_H
 #define __WINE_SERVER_REQUEST_H
 
+#include <assert.h>
+
 #include "thread.h"
 #include "wine/server_protocol.h"
 
@@ -14,7 +16,8 @@
 #define MAX_REQUEST_LENGTH  8192
 
 /* request handler definition */
-#define DECL_HANDLER(name) void req_##name( struct name##_request *req )
+#define DECL_HANDLER(name) \
+    void req_##name( const struct name##_request *req, struct name##_reply *reply )
 
 /* request functions */
 
@@ -33,36 +36,54 @@
 #endif
 
 extern const char *get_config_dir(void);
+extern void *set_reply_data_size( size_t size );
 extern int receive_fd( struct process *process );
 extern int send_client_fd( struct process *process, int fd, handle_t handle );
 extern void read_request( struct thread *thread );
-extern void send_reply( struct thread *thread, union generic_request *request );
+extern void write_reply( struct thread *thread );
 extern unsigned int get_tick_count(void);
 extern void open_master_socket(void);
 extern void close_master_socket(void);
 extern void lock_master_socket( int locked );
 
-extern void trace_request( struct thread *thread, const union generic_request *request );
-extern void trace_reply( struct thread *thread, const union generic_request *request );
+extern void trace_request(void);
+extern void trace_reply( enum request req, const union generic_reply *reply );
 
 /* get the request vararg data */
-inline static void *get_req_data( const void *req )
+inline static const void *get_req_data(void)
 {
-    return (char *)current->buffer + ((struct request_header *)req)->var_offset;
+    return current->req_data;
 }
 
 /* get the request vararg size */
-inline static size_t get_req_data_size( const void *req )
+inline static size_t get_req_data_size(void)
 {
-    return ((struct request_header *)req)->var_size;
+    return current->req.request_header.request_size;
 }
 
-/* set the request vararg size */
-inline static void set_req_data_size( const void *req, size_t size )
+/* get the reply maximum vararg size */
+inline static size_t get_reply_max_size(void)
 {
-    ((struct request_header *)req)->var_size = size;
+    return current->req.request_header.reply_size;
 }
 
+/* allocate and fill the reply data */
+inline static void *set_reply_data( const void *data, size_t size )
+{
+    void *ret = set_reply_data_size( size );
+    if (ret) memcpy( ret, data, size );
+    return ret;
+}
+
+/* set the reply data pointer directly (will be freed by request code) */
+inline static void set_reply_data_ptr( void *data, size_t size )
+{
+    assert( size <= get_reply_max_size() );
+    current->reply_size = size;
+    current->reply_data = data;
+}
+
+
 /* Everything below this line is generated automatically by tools/make_requests */
 /* ### make_requests begin ### */
 
@@ -73,7 +94,6 @@
 DECL_HANDLER(init_process);
 DECL_HANDLER(init_process_done);
 DECL_HANDLER(init_thread);
-DECL_HANDLER(set_thread_buffer);
 DECL_HANDLER(terminate_process);
 DECL_HANDLER(terminate_thread);
 DECL_HANDLER(get_process_info);
@@ -132,6 +152,7 @@
 DECL_HANDLER(write_console_input);
 DECL_HANDLER(read_console_input);
 DECL_HANDLER(write_console_output);
+DECL_HANDLER(fill_console_output);
 DECL_HANDLER(read_console_output);
 DECL_HANDLER(move_console_output);
 DECL_HANDLER(create_change_notification);
@@ -217,7 +238,7 @@
 
 #ifdef WANT_REQUEST_HANDLERS
 
-typedef void (*req_handler)( void *req );
+typedef void (*req_handler)( const void *req, void *reply );
 static const req_handler req_handlers[REQ_NB_REQUESTS] =
 {
     (req_handler)req_new_process,
@@ -227,7 +248,6 @@
     (req_handler)req_init_process,
     (req_handler)req_init_process_done,
     (req_handler)req_init_thread,
-    (req_handler)req_set_thread_buffer,
     (req_handler)req_terminate_process,
     (req_handler)req_terminate_thread,
     (req_handler)req_get_process_info,
@@ -286,6 +306,7 @@
     (req_handler)req_write_console_input,
     (req_handler)req_read_console_input,
     (req_handler)req_write_console_output,
+    (req_handler)req_fill_console_output,
     (req_handler)req_read_console_output,
     (req_handler)req_move_console_output,
     (req_handler)req_create_change_notification,