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/dlls/kernel/debugger.c b/dlls/kernel/debugger.c
index 0fdd382..fbe8ff6 100644
--- a/dlls/kernel/debugger.c
+++ b/dlls/kernel/debugger.c
@@ -36,78 +36,78 @@
     for (;;)
     {
         HANDLE wait = 0;
-        debug_event_t *data;
-        SERVER_START_VAR_REQ( wait_debug_event, sizeof(*data) )
+        debug_event_t data;
+        SERVER_START_REQ( wait_debug_event )
         {
             req->get_handle = (timeout != 0);
-            if (!(ret = !SERVER_CALL_ERR())) goto done;
+            wine_server_set_reply( req, &data, sizeof(data) );
+            if (!(ret = !wine_server_call_err( req ))) goto done;
 
-            if (!server_data_size(req))  /* timeout */
+            if (!wine_server_reply_size(reply))  /* timeout */
             {
-                wait = req->wait;
+                wait = reply->wait;
                 ret = FALSE;
                 goto done;
             }
-            data = server_data_ptr(req);
-            event->dwDebugEventCode = data->code;
-            event->dwProcessId      = (DWORD)req->pid;
-            event->dwThreadId       = (DWORD)req->tid;
-            switch(data->code)
+            event->dwDebugEventCode = data.code;
+            event->dwProcessId      = (DWORD)reply->pid;
+            event->dwThreadId       = (DWORD)reply->tid;
+            switch(data.code)
             {
             case EXCEPTION_DEBUG_EVENT:
-                event->u.Exception.ExceptionRecord = data->info.exception.record;
-                event->u.Exception.dwFirstChance   = data->info.exception.first;
+                event->u.Exception.ExceptionRecord = data.info.exception.record;
+                event->u.Exception.dwFirstChance   = data.info.exception.first;
                 break;
             case CREATE_THREAD_DEBUG_EVENT:
-                event->u.CreateThread.hThread           = data->info.create_thread.handle;
-                event->u.CreateThread.lpThreadLocalBase = data->info.create_thread.teb;
-                event->u.CreateThread.lpStartAddress    = data->info.create_thread.start;
+                event->u.CreateThread.hThread           = data.info.create_thread.handle;
+                event->u.CreateThread.lpThreadLocalBase = data.info.create_thread.teb;
+                event->u.CreateThread.lpStartAddress    = data.info.create_thread.start;
                 break;
             case CREATE_PROCESS_DEBUG_EVENT:
-                event->u.CreateProcessInfo.hFile                 = data->info.create_process.file;
-                event->u.CreateProcessInfo.hProcess              = data->info.create_process.process;
-                event->u.CreateProcessInfo.hThread               = data->info.create_process.thread;
-                event->u.CreateProcessInfo.lpBaseOfImage         = data->info.create_process.base;
-                event->u.CreateProcessInfo.dwDebugInfoFileOffset = data->info.create_process.dbg_offset;
-                event->u.CreateProcessInfo.nDebugInfoSize        = data->info.create_process.dbg_size;
-                event->u.CreateProcessInfo.lpThreadLocalBase     = data->info.create_process.teb;
-                event->u.CreateProcessInfo.lpStartAddress        = data->info.create_process.start;
-                event->u.CreateProcessInfo.lpImageName           = data->info.create_process.name;
-                event->u.CreateProcessInfo.fUnicode              = data->info.create_process.unicode;
-                if (data->info.create_process.file == -1) event->u.CreateProcessInfo.hFile = 0;
+                event->u.CreateProcessInfo.hFile                 = data.info.create_process.file;
+                event->u.CreateProcessInfo.hProcess              = data.info.create_process.process;
+                event->u.CreateProcessInfo.hThread               = data.info.create_process.thread;
+                event->u.CreateProcessInfo.lpBaseOfImage         = data.info.create_process.base;
+                event->u.CreateProcessInfo.dwDebugInfoFileOffset = data.info.create_process.dbg_offset;
+                event->u.CreateProcessInfo.nDebugInfoSize        = data.info.create_process.dbg_size;
+                event->u.CreateProcessInfo.lpThreadLocalBase     = data.info.create_process.teb;
+                event->u.CreateProcessInfo.lpStartAddress        = data.info.create_process.start;
+                event->u.CreateProcessInfo.lpImageName           = data.info.create_process.name;
+                event->u.CreateProcessInfo.fUnicode              = data.info.create_process.unicode;
+                if (data.info.create_process.file == -1) event->u.CreateProcessInfo.hFile = 0;
                 break;
             case EXIT_THREAD_DEBUG_EVENT:
-                event->u.ExitThread.dwExitCode = data->info.exit.exit_code;
+                event->u.ExitThread.dwExitCode = data.info.exit.exit_code;
                 break;
             case EXIT_PROCESS_DEBUG_EVENT:
-                event->u.ExitProcess.dwExitCode = data->info.exit.exit_code;
+                event->u.ExitProcess.dwExitCode = data.info.exit.exit_code;
                 break;
             case LOAD_DLL_DEBUG_EVENT:
-                event->u.LoadDll.hFile                 = data->info.load_dll.handle;
-                event->u.LoadDll.lpBaseOfDll           = data->info.load_dll.base;
-                event->u.LoadDll.dwDebugInfoFileOffset = data->info.load_dll.dbg_offset;
-                event->u.LoadDll.nDebugInfoSize        = data->info.load_dll.dbg_size;
-                event->u.LoadDll.lpImageName           = data->info.load_dll.name;
-                event->u.LoadDll.fUnicode              = data->info.load_dll.unicode;
-                if (data->info.load_dll.handle == -1) event->u.LoadDll.hFile = 0;
+                event->u.LoadDll.hFile                 = data.info.load_dll.handle;
+                event->u.LoadDll.lpBaseOfDll           = data.info.load_dll.base;
+                event->u.LoadDll.dwDebugInfoFileOffset = data.info.load_dll.dbg_offset;
+                event->u.LoadDll.nDebugInfoSize        = data.info.load_dll.dbg_size;
+                event->u.LoadDll.lpImageName           = data.info.load_dll.name;
+                event->u.LoadDll.fUnicode              = data.info.load_dll.unicode;
+                if (data.info.load_dll.handle == -1) event->u.LoadDll.hFile = 0;
                 break;
             case UNLOAD_DLL_DEBUG_EVENT:
-                event->u.UnloadDll.lpBaseOfDll = data->info.unload_dll.base;
+                event->u.UnloadDll.lpBaseOfDll = data.info.unload_dll.base;
                 break;
             case OUTPUT_DEBUG_STRING_EVENT:
-                event->u.DebugString.lpDebugStringData  = data->info.output_string.string;
-                event->u.DebugString.fUnicode           = data->info.output_string.unicode;
-                event->u.DebugString.nDebugStringLength = data->info.output_string.length;
+                event->u.DebugString.lpDebugStringData  = data.info.output_string.string;
+                event->u.DebugString.fUnicode           = data.info.output_string.unicode;
+                event->u.DebugString.nDebugStringLength = data.info.output_string.length;
                 break;
             case RIP_EVENT:
-                event->u.RipInfo.dwError = data->info.rip_info.error;
-                event->u.RipInfo.dwType  = data->info.rip_info.type;
+                event->u.RipInfo.dwError = data.info.rip_info.error;
+                event->u.RipInfo.dwType  = data.info.rip_info.type;
                 break;
             }
         done:
             /* nothing */ ;
         }
-        SERVER_END_VAR_REQ;
+        SERVER_END_REQ;
         if (ret) return TRUE;
         if (!wait) break;
         res = WaitForSingleObject( wait, timeout );
@@ -140,7 +140,7 @@
         req->pid    = (void *)pid;
         req->tid    = (void *)tid;
         req->status = status;
-        ret = !SERVER_CALL_ERR();
+        ret = !wine_server_call_err( req );
     }
     SERVER_END_REQ;
     return ret;
@@ -163,7 +163,7 @@
     SERVER_START_REQ( debug_process )
     {
         req->pid = (void *)pid;
-        ret = !SERVER_CALL_ERR();
+        ret = !wine_server_call_err( req );
     }
     SERVER_END_REQ;
     return ret;
@@ -184,7 +184,7 @@
         req->string  = (void *)str;
         req->unicode = 0;
         req->length  = strlen(str) + 1;
-        SERVER_CALL();
+        wine_server_call( req );
     }
     SERVER_END_REQ;
     WARN("%s\n", str);
@@ -205,7 +205,7 @@
         req->string  = (void *)str;
         req->unicode = 1;
         req->length  = (lstrlenW(str) + 1) * sizeof(WCHAR);
-        SERVER_CALL();
+        wine_server_call( req );
     }
     SERVER_END_REQ;
     WARN("%s\n", debugstr_w(str));
@@ -278,7 +278,7 @@
     SERVER_START_REQ( get_process_info )
     {
         req->handle = GetCurrentProcess();
-        if (!SERVER_CALL_ERR()) ret = req->debugged;
+        if (!wine_server_call_err( req )) ret = reply->debugged;
     }
     SERVER_END_REQ;
     return ret;