Changed wait_process and wait_debug_event requests to never block;
waiting is always done through WaitForSingleObject().

diff --git a/dlls/kernel/debugger.c b/dlls/kernel/debugger.c
index 6dc274a..0db2981 100644
--- a/dlls/kernel/debugger.c
+++ b/dlls/kernel/debugger.c
@@ -31,82 +31,92 @@
 	 DWORD timeout /* Number of milliseconds to wait for event. */)
 {
     BOOL ret;
-    SERVER_START_REQ
+    DWORD res;
+
+    for (;;)
     {
-        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 */
+        HANDLE wait = 0;
+        SERVER_START_REQ
         {
-            SetLastError( ERROR_SEM_TIMEOUT );
-            ret = FALSE;
-            goto done;
+            debug_event_t *data;
+            struct wait_debug_event_request *req = server_alloc_req( sizeof(*req), sizeof(*data) );
+
+            req->get_handle = (timeout != 0);
+            if (!(ret = !server_call( REQ_WAIT_DEBUG_EVENT ))) goto done;
+
+            if (!server_data_size(req))  /* timeout */
+            {
+                wait = req->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)
+            {
+            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;
+            }
+        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:
+        SERVER_END_REQ;
+        if (ret) return TRUE;
+        if (!wait) break;
+        res = WaitForSingleObject( wait, timeout );
+        CloseHandle( wait );
+        if (res != STATUS_WAIT_0) break;
     }
-    SERVER_END_REQ;
-    return ret;
+    SetLastError( ERROR_SEM_TIMEOUT );
+    return FALSE;
 }