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;
}