Added exception handling wrapper to a number of server requests.
Changed a few requests to use the new vararg mechanism.

diff --git a/scheduler/debugger.c b/scheduler/debugger.c
index 9231a89..f3d5df6 100644
--- a/scheduler/debugger.c
+++ b/scheduler/debugger.c
@@ -26,72 +26,83 @@
  */
 BOOL WINAPI WaitForDebugEvent( LPDEBUG_EVENT event, DWORD timeout )
 {
-    struct wait_debug_event_request *req = get_req_buffer();
-
-    req->timeout = timeout;
-    if (server_call( REQ_WAIT_DEBUG_EVENT )) return FALSE;
-    if ((req->event.code < 0) || (req->event.code > RIP_EVENT))
-        server_protocol_error( "WaitForDebugEvent: bad code %d\n", req->event.code );
-
-    event->dwDebugEventCode = req->event.code;
-    event->dwProcessId      = (DWORD)req->pid;
-    event->dwThreadId       = (DWORD)req->tid;
-    switch(req->event.code)
+    BOOL ret;
+    SERVER_START_REQ
     {
-    case 0:  /* timeout */
-        SetLastError( ERROR_SEM_TIMEOUT );
-        return FALSE;
-    case EXCEPTION_DEBUG_EVENT:
-        event->u.Exception.ExceptionRecord = req->event.info.exception.record;
-        event->u.Exception.dwFirstChance   = req->event.info.exception.first;
-        break;
-    case CREATE_THREAD_DEBUG_EVENT:
-        event->u.CreateThread.hThread           = req->event.info.create_thread.handle;
-        event->u.CreateThread.lpThreadLocalBase = req->event.info.create_thread.teb;
-        event->u.CreateThread.lpStartAddress    = req->event.info.create_thread.start;
-        break;
-    case CREATE_PROCESS_DEBUG_EVENT:
-        event->u.CreateProcessInfo.hFile                 = req->event.info.create_process.file;
-        event->u.CreateProcessInfo.hProcess              = req->event.info.create_process.process;
-        event->u.CreateProcessInfo.hThread               = req->event.info.create_process.thread;
-        event->u.CreateProcessInfo.lpBaseOfImage         = req->event.info.create_process.base;
-        event->u.CreateProcessInfo.dwDebugInfoFileOffset = req->event.info.create_process.dbg_offset;
-        event->u.CreateProcessInfo.nDebugInfoSize        = req->event.info.create_process.dbg_size;
-        event->u.CreateProcessInfo.lpThreadLocalBase     = req->event.info.create_process.teb;
-        event->u.CreateProcessInfo.lpStartAddress        = req->event.info.create_process.start;
-        event->u.CreateProcessInfo.lpImageName           = req->event.info.create_process.name;
-        event->u.CreateProcessInfo.fUnicode              = req->event.info.create_process.unicode;
-        if (req->event.info.create_process.file == -1) event->u.CreateProcessInfo.hFile = 0;
-        break;
-    case EXIT_THREAD_DEBUG_EVENT:
-        event->u.ExitThread.dwExitCode = req->event.info.exit.exit_code;
-        break;
-    case EXIT_PROCESS_DEBUG_EVENT:
-        event->u.ExitProcess.dwExitCode = req->event.info.exit.exit_code;
-        break;
-    case LOAD_DLL_DEBUG_EVENT:
-        event->u.LoadDll.hFile                 = req->event.info.load_dll.handle;
-        event->u.LoadDll.lpBaseOfDll           = req->event.info.load_dll.base;
-        event->u.LoadDll.dwDebugInfoFileOffset = req->event.info.load_dll.dbg_offset;
-        event->u.LoadDll.nDebugInfoSize        = req->event.info.load_dll.dbg_size;
-        event->u.LoadDll.lpImageName           = req->event.info.load_dll.name;
-        event->u.LoadDll.fUnicode              = req->event.info.load_dll.unicode;
-        if (req->event.info.load_dll.handle == -1) event->u.LoadDll.hFile = 0;
-        break;
-    case UNLOAD_DLL_DEBUG_EVENT:
-        event->u.UnloadDll.lpBaseOfDll = req->event.info.unload_dll.base;
-        break;
-    case OUTPUT_DEBUG_STRING_EVENT:
-        event->u.DebugString.lpDebugStringData  = req->event.info.output_string.string;
-        event->u.DebugString.fUnicode           = req->event.info.output_string.unicode;
-        event->u.DebugString.nDebugStringLength = req->event.info.output_string.length;
-        break;
-    case RIP_EVENT:
-        event->u.RipInfo.dwError = req->event.info.rip_info.error;
-        event->u.RipInfo.dwType  = req->event.info.rip_info.type;
-        break;
+        debug_event_t *data;
+        struct wait_debug_event_request *req = server_alloc_req( sizeof(*req), sizeof(*data) );
+
+        req->timeout = timeout;
+        if (!(ret = !server_call( REQ_WAIT_DEBUG_EVENT ))) goto done;
+
+        if (!server_data_size(req))  /* timeout */
+        {
+            SetLastError( ERROR_SEM_TIMEOUT );
+            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)
+        {
+        case EXCEPTION_DEBUG_EVENT:
+            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;
+            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;
+            break;
+        case EXIT_THREAD_DEBUG_EVENT:
+            event->u.ExitThread.dwExitCode = data->info.exit.exit_code;
+            break;
+        case EXIT_PROCESS_DEBUG_EVENT:
+            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;
+            break;
+        case UNLOAD_DLL_DEBUG_EVENT:
+            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;
+            break;
+        case RIP_EVENT:
+            event->u.RipInfo.dwError = data->info.rip_info.error;
+            event->u.RipInfo.dwType  = data->info.rip_info.type;
+            break;
+        default:
+            server_protocol_error( "WaitForDebugEvent: bad code %d\n", data->code );
+        }
+    done:
     }
-    return TRUE;
+    SERVER_END_REQ;
+    return ret;
 }
 
 
@@ -100,11 +111,17 @@
  */
 BOOL WINAPI ContinueDebugEvent( DWORD pid, DWORD tid, DWORD status )
 {
-    struct continue_debug_event_request *req = get_req_buffer();
-    req->pid    = (void *)pid;
-    req->tid    = (void *)tid;
-    req->status = status;
-    return !server_call( REQ_CONTINUE_DEBUG_EVENT );
+    BOOL ret;
+    SERVER_START_REQ
+    {
+        struct continue_debug_event_request *req = server_alloc_req( sizeof(*req), 0 );
+        req->pid    = (void *)pid;
+        req->tid    = (void *)tid;
+        req->status = status;
+        ret = !server_call( REQ_CONTINUE_DEBUG_EVENT );
+    }
+    SERVER_END_REQ;
+    return ret;
 }
 
 
@@ -113,9 +130,15 @@
  */
 BOOL WINAPI DebugActiveProcess( DWORD pid )
 {
-    struct debug_process_request *req = get_req_buffer();
-    req->pid = (void *)pid;
-    return !server_call( REQ_DEBUG_PROCESS );
+    BOOL ret;
+    SERVER_START_REQ
+    {
+        struct debug_process_request *req = server_alloc_req( sizeof(*req), 0 );
+        req->pid = (void *)pid;
+        ret = !server_call( REQ_DEBUG_PROCESS );
+    }
+    SERVER_END_REQ;
+    return ret;
 }
 
 
@@ -124,11 +147,15 @@
  */
 void WINAPI OutputDebugStringA( LPCSTR str )
 {
-    struct output_debug_string_request *req = get_req_buffer();
-    req->string  = (void *)str;
-    req->unicode = 0;
-    req->length  = strlen(str) + 1;
-    server_call_noerr( REQ_OUTPUT_DEBUG_STRING );
+    SERVER_START_REQ
+    {
+        struct output_debug_string_request *req = server_alloc_req( sizeof(*req), 0 );
+        req->string  = (void *)str;
+        req->unicode = 0;
+        req->length  = strlen(str) + 1;
+        server_call_noerr( REQ_OUTPUT_DEBUG_STRING );
+    }
+    SERVER_END_REQ;
     WARN("%s\n", str);
 }
 
@@ -138,11 +165,15 @@
  */
 void WINAPI OutputDebugStringW( LPCWSTR str )
 {
-    struct output_debug_string_request *req = get_req_buffer();
-    req->string  = (void *)str;
-    req->unicode = 1;
-    req->length  = (lstrlenW(str) + 1) * sizeof(WCHAR);
-    server_call_noerr( REQ_OUTPUT_DEBUG_STRING );
+    SERVER_START_REQ
+    {
+        struct output_debug_string_request *req = server_alloc_req( sizeof(*req), 0 );
+        req->string  = (void *)str;
+        req->unicode = 1;
+        req->length  = (lstrlenW(str) + 1) * sizeof(WCHAR);
+        server_call_noerr( REQ_OUTPUT_DEBUG_STRING );
+    }
+    SERVER_END_REQ;
     WARN("%s\n", debugstr_w(str));
 }
 
@@ -189,8 +220,12 @@
 BOOL WINAPI IsDebuggerPresent(void)
 {
     BOOL ret = FALSE;
-    struct get_process_info_request *req = get_req_buffer();
-    req->handle = GetCurrentProcess();
-    if (!server_call( REQ_GET_PROCESS_INFO )) ret = req->debugged;
+    SERVER_START_REQ
+    {
+        struct get_process_info_request *req = server_alloc_req( sizeof(*req), 0 );
+        req->handle = GetCurrentProcess();
+        if (!server_call( REQ_GET_PROCESS_INFO )) ret = req->debugged;
+    }
+    SERVER_END_REQ;
     return ret;
 }