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;