Added Get/SetThreadContext support through the server.
diff --git a/include/server.h b/include/server.h
index 76694e0..a19287e 100644
--- a/include/server.h
+++ b/include/server.h
@@ -27,6 +27,86 @@
/* a path name for server requests (Unicode) */
typedef WCHAR path_t[MAX_PATH+1];
+
+/* definitions of the event data depending on the event code */
+struct debug_event_exception
+{
+ int code; /* exception code */
+ int flags; /* exception flags */
+ void *record; /* exception record ptr */
+ void *addr; /* exception address */
+ int nb_params; /* exceptions parameters */
+ int params[15];
+ int first_chance; /* first chance to handle it? */
+ CONTEXT context; /* thread context */
+};
+struct debug_event_create_thread
+{
+ int handle; /* handle to the new thread */
+ void *teb; /* thread teb (in debugged process address space) */
+ void *start; /* thread startup routine */
+};
+struct debug_event_create_process
+{
+ int file; /* handle to the process exe file */
+ int process; /* handle to the new process */
+ int thread; /* handle to the new thread */
+ void *base; /* base of executable image */
+ int dbg_offset; /* offset of debug info in file */
+ int dbg_size; /* size of debug info */
+ void *teb; /* thread teb (in debugged process address space) */
+ void *start; /* thread startup routine */
+ void *name; /* image name (optional) */
+ int unicode; /* is it Unicode? */
+};
+struct debug_event_exit
+{
+ int exit_code; /* thread or process exit code */
+};
+struct debug_event_load_dll
+{
+ int handle; /* file handle for the dll */
+ void *base; /* base address of the dll */
+ int dbg_offset; /* offset of debug info in file */
+ int dbg_size; /* size of debug info */
+ void *name; /* image name (optional) */
+ int unicode; /* is it Unicode? */
+};
+struct debug_event_unload_dll
+{
+ void *base; /* base address of the dll */
+};
+struct debug_event_output_string
+{
+ void *string; /* string to display (in debugged process address space) */
+ int unicode; /* is it Unicode? */
+ int length; /* string length */
+};
+struct debug_event_rip_info
+{
+ int error; /* ??? */
+ int type; /* ??? */
+};
+union debug_event_data
+{
+ struct debug_event_exception exception;
+ struct debug_event_create_thread create_thread;
+ struct debug_event_create_process create_process;
+ struct debug_event_exit exit;
+ struct debug_event_load_dll load_dll;
+ struct debug_event_unload_dll unload_dll;
+ struct debug_event_output_string output_string;
+ struct debug_event_rip_info rip_info;
+};
+
+/* debug event data */
+typedef struct
+{
+ int code; /* event code */
+ union debug_event_data info; /* event information */
+} debug_event_t;
+
+
/* Create a new process from the context of the parent */
struct new_process_request
{
@@ -707,92 +787,18 @@
/* Wait for a debug event */
struct wait_debug_event_request
{
- IN int timeout; /* timeout in ms */
- OUT int code; /* event code */
- OUT void* pid; /* process id */
- OUT void* tid; /* thread id */
-/* OUT union debug_event_data data; */
+ IN int timeout; /* timeout in ms */
+ OUT void* pid; /* process id */
+ OUT void* tid; /* thread id */
+ OUT debug_event_t event; /* debug event data */
};
/* Send a debug event */
struct send_debug_event_request
{
- IN int code; /* event code */
- OUT int status; /* event continuation status */
-/* IN union debug_event_data data; */
-};
-
-
-/* definitions of the event data depending on the event code */
-struct debug_event_exception
-{
- int code; /* exception code */
- int flags; /* exception flags */
- void *record; /* exception record ptr */
- void *addr; /* exception address */
- int nb_params; /* exceptions parameters */
- int params[15];
- int first_chance; /* first chance to handle it? */
- CONTEXT context; /* thread context */
-};
-struct debug_event_create_thread
-{
- int handle; /* handle to the new thread */
- void *teb; /* thread teb (in debugged process address space) */
- void *start; /* thread startup routine */
-};
-struct debug_event_create_process
-{
- int file; /* handle to the process exe file */
- int process; /* handle to the new process */
- int thread; /* handle to the new thread */
- void *base; /* base of executable image */
- int dbg_offset; /* offset of debug info in file */
- int dbg_size; /* size of debug info */
- void *teb; /* thread teb (in debugged process address space) */
- void *start; /* thread startup routine */
- void *name; /* image name (optional) */
- int unicode; /* is it Unicode? */
-};
-struct debug_event_exit
-{
- int exit_code; /* thread or process exit code */
-};
-struct debug_event_load_dll
-{
- int handle; /* file handle for the dll */
- void *base; /* base address of the dll */
- int dbg_offset; /* offset of debug info in file */
- int dbg_size; /* size of debug info */
- void *name; /* image name (optional) */
- int unicode; /* is it Unicode? */
-};
-struct debug_event_unload_dll
-{
- void *base; /* base address of the dll */
-};
-struct debug_event_output_string
-{
- void *string; /* string to display (in debugged process address space) */
- int unicode; /* is it Unicode? */
- int length; /* string length */
-};
-struct debug_event_rip_info
-{
- int error; /* ??? */
- int type; /* ??? */
-};
-union debug_event_data
-{
- struct debug_event_exception exception;
- struct debug_event_create_thread create_thread;
- struct debug_event_create_process create_process;
- struct debug_event_exit exit;
- struct debug_event_load_dll load_dll;
- struct debug_event_unload_dll unload_dll;
- struct debug_event_output_string output_string;
- struct debug_event_rip_info rip_info;
+ OUT int status; /* event continuation status */
+ IN debug_event_t event; /* debug event data */
};
@@ -1005,6 +1011,24 @@
};
+/* Retrieve the current context of a thread */
+struct get_thread_context_request
+{
+ IN int handle; /* thread handle */
+ IN unsigned int flags; /* context flags */
+ OUT CONTEXT context; /* thread context */
+};
+
+
+/* Set the current context of a thread */
+struct set_thread_context_request
+{
+ IN int handle; /* thread handle */
+ IN unsigned int flags; /* context flags */
+ IN CONTEXT context; /* thread context */
+};
+
+
/* Everything below this line is generated automatically by tools/make_requests */
/* ### make_requests begin ### */
@@ -1100,6 +1124,8 @@
REQ_OPEN_TIMER,
REQ_SET_TIMER,
REQ_CANCEL_TIMER,
+ REQ_GET_THREAD_CONTEXT,
+ REQ_SET_THREAD_CONTEXT,
REQ_NB_REQUESTS
};
diff --git a/scheduler/debugger.c b/scheduler/debugger.c
index 53fd9ed..8a09485 100644
--- a/scheduler/debugger.c
+++ b/scheduler/debugger.c
@@ -11,22 +11,7 @@
#include "server.h"
#include "debugtools.h"
-DEFAULT_DEBUG_CHANNEL(debugstr)
-
-/**********************************************************************
- * DEBUG_SendEvent
- *
- * Internal helper to send a debug event request to the server.
- */
-static DWORD DEBUG_SendEvent( int code, void *data, int size )
-{
- DWORD ret = 0;
- struct send_debug_event_request *req = get_req_buffer();
- req->code = code;
- memcpy( req + 1, data, size );
- if (!server_call( REQ_SEND_DEBUG_EVENT )) ret = req->status;
- return ret;
-}
+DEFAULT_DEBUG_CHANNEL(debugstr);
/**********************************************************************
@@ -39,21 +24,21 @@
int i;
DWORD ret = 0;
struct send_debug_event_request *req = get_req_buffer();
- struct debug_event_exception *event = (struct debug_event_exception *)(req + 1);
- req->code = EXCEPTION_DEBUG_EVENT;
- event->code = rec->ExceptionCode;
- event->flags = rec->ExceptionFlags;
- event->record = rec->ExceptionRecord;
- event->addr = rec->ExceptionAddress;
- event->nb_params = rec->NumberParameters;
- for (i = 0; i < event->nb_params; i++) event->params[i] = rec->ExceptionInformation[i];
- event->first_chance = first_chance;
- event->context = *context;
+ req->event.code = EXCEPTION_DEBUG_EVENT;
+ req->event.info.exception.code = rec->ExceptionCode;
+ req->event.info.exception.flags = rec->ExceptionFlags;
+ req->event.info.exception.record = rec->ExceptionRecord;
+ req->event.info.exception.addr = rec->ExceptionAddress;
+ req->event.info.exception.nb_params = rec->NumberParameters;
+ req->event.info.exception.first_chance = first_chance;
+ req->event.info.exception.context = *context;
+ for (i = 0; i < req->event.info.exception.nb_params; i++)
+ req->event.info.exception.params[i] = rec->ExceptionInformation[i];
if (!server_call( REQ_SEND_DEBUG_EVENT ))
{
ret = req->status;
- *context = event->context;
+ *context = req->event.info.exception.context;
}
return ret;
}
@@ -67,22 +52,24 @@
*/
DWORD DEBUG_SendCreateProcessEvent( HFILE file, HMODULE module, void *entry )
{
- struct debug_event_create_process event;
+ DWORD ret = 0;
+ struct send_debug_event_request *req = get_req_buffer();
- event.file = file;
- event.process = 0; /* will be filled by server */
- event.thread = 0; /* will be filled by server */
- event.base = (void *)module;
- event.dbg_offset = 0; /* FIXME */
- event.dbg_size = 0; /* FIXME */
- event.teb = NtCurrentTeb();
- event.start = entry;
- event.name = 0; /* FIXME */
- event.unicode = 0; /* FIXME */
- return DEBUG_SendEvent( CREATE_PROCESS_DEBUG_EVENT, &event, sizeof(event) );
+ req->event.code = CREATE_PROCESS_DEBUG_EVENT;
+ req->event.info.create_process.file = file;
+ req->event.info.create_process.process = 0; /* will be filled by server */
+ req->event.info.create_process.thread = 0; /* will be filled by server */
+ req->event.info.create_process.base = (void *)module;
+ req->event.info.create_process.dbg_offset = 0; /* FIXME */
+ req->event.info.create_process.dbg_size = 0; /* FIXME */
+ req->event.info.create_process.teb = NtCurrentTeb();
+ req->event.info.create_process.start = entry;
+ req->event.info.create_process.name = 0; /* FIXME */
+ req->event.info.create_process.unicode = 0; /* FIXME */
+ if (!server_call( REQ_SEND_DEBUG_EVENT )) ret = req->status;
+ return ret;
}
-
/**********************************************************************
* DEBUG_SendCreateThreadEvent
*
@@ -91,12 +78,15 @@
*/
DWORD DEBUG_SendCreateThreadEvent( void *entry )
{
- struct debug_event_create_thread event;
+ DWORD ret = 0;
+ struct send_debug_event_request *req = get_req_buffer();
- event.handle = 0; /* will be filled by server */
- event.teb = NtCurrentTeb();
- event.start = entry;
- return DEBUG_SendEvent( CREATE_THREAD_DEBUG_EVENT, &event, sizeof(event) );
+ req->event.code = CREATE_THREAD_DEBUG_EVENT;
+ req->event.info.create_thread.handle = 0; /* will be filled by server */
+ req->event.info.create_thread.teb = NtCurrentTeb();
+ req->event.info.create_thread.start = entry;
+ if (!server_call( REQ_SEND_DEBUG_EVENT )) ret = req->status;
+ return ret;
}
@@ -107,15 +97,18 @@
*/
DWORD DEBUG_SendLoadDLLEvent( HFILE file, HMODULE module, LPSTR *name )
{
- struct debug_event_load_dll event;
+ DWORD ret = 0;
+ struct send_debug_event_request *req = get_req_buffer();
- event.handle = file;
- event.base = (void *)module;
- event.dbg_offset = 0; /* FIXME */
- event.dbg_size = 0; /* FIXME */
- event.name = name;
- event.unicode = 0;
- return DEBUG_SendEvent( LOAD_DLL_DEBUG_EVENT, &event, sizeof(event) );
+ req->event.code = LOAD_DLL_DEBUG_EVENT;
+ req->event.info.load_dll.handle = file;
+ req->event.info.load_dll.base = (void *)module;
+ req->event.info.load_dll.dbg_offset = 0; /* FIXME */
+ req->event.info.load_dll.dbg_size = 0; /* FIXME */
+ req->event.info.load_dll.name = name;
+ req->event.info.load_dll.unicode = 0;
+ if (!server_call( REQ_SEND_DEBUG_EVENT )) ret = req->status;
+ return ret;
}
@@ -126,10 +119,13 @@
*/
DWORD DEBUG_SendUnloadDLLEvent( HMODULE module )
{
- struct debug_event_unload_dll event;
+ DWORD ret = 0;
+ struct send_debug_event_request *req = get_req_buffer();
- event.base = (void *)module;
- return DEBUG_SendEvent( UNLOAD_DLL_DEBUG_EVENT, &event, sizeof(event) );
+ req->event.code = UNLOAD_DLL_DEBUG_EVENT;
+ req->event.info.unload_dll.base = (void *)module;
+ if (!server_call( REQ_SEND_DEBUG_EVENT )) ret = req->status;
+ return ret;
}
@@ -147,73 +143,72 @@
BOOL WINAPI WaitForDebugEvent( LPDEBUG_EVENT event, DWORD timeout )
{
struct wait_debug_event_request *req = get_req_buffer();
- union debug_event_data *data = (union debug_event_data *)(req + 1);
int i;
req->timeout = timeout;
if (server_call( REQ_WAIT_DEBUG_EVENT )) return FALSE;
- if ((req->code < 0) || (req->code > RIP_EVENT))
- server_protocol_error( "WaitForDebugEvent: bad code %d\n", req->code );
+ if ((req->event.code < 0) || (req->event.code > RIP_EVENT))
+ server_protocol_error( "WaitForDebugEvent: bad code %d\n", req->event.code );
- event->dwDebugEventCode = req->code;
+ event->dwDebugEventCode = req->event.code;
event->dwProcessId = (DWORD)req->pid;
event->dwThreadId = (DWORD)req->tid;
- switch(req->code)
+ switch(req->event.code)
{
case EXCEPTION_DEBUG_EVENT:
- event->u.Exception.ExceptionRecord.ExceptionCode = data->exception.code;
- event->u.Exception.ExceptionRecord.ExceptionFlags = data->exception.flags;
- event->u.Exception.ExceptionRecord.ExceptionRecord = data->exception.record;
- event->u.Exception.ExceptionRecord.ExceptionAddress = data->exception.addr;
- event->u.Exception.ExceptionRecord.NumberParameters = data->exception.nb_params;
- for (i = 0; i < data->exception.nb_params; i++)
- event->u.Exception.ExceptionRecord.ExceptionInformation[i] = data->exception.params[i];
- event->u.Exception.dwFirstChance = data->exception.first_chance;
+ event->u.Exception.ExceptionRecord.ExceptionCode = req->event.info.exception.code;
+ event->u.Exception.ExceptionRecord.ExceptionFlags = req->event.info.exception.flags;
+ event->u.Exception.ExceptionRecord.ExceptionRecord = req->event.info.exception.record;
+ event->u.Exception.ExceptionRecord.ExceptionAddress = req->event.info.exception.addr;
+ event->u.Exception.ExceptionRecord.NumberParameters = req->event.info.exception.nb_params;
+ for (i = 0; i < req->event.info.exception.nb_params; i++)
+ event->u.Exception.ExceptionRecord.ExceptionInformation[i] = req->event.info.exception.params[i];
+ event->u.Exception.dwFirstChance = req->event.info.exception.first_chance;
break;
case CREATE_THREAD_DEBUG_EVENT:
- event->u.CreateThread.hThread = data->create_thread.handle;
- event->u.CreateThread.lpThreadLocalBase = data->create_thread.teb;
- event->u.CreateThread.lpStartAddress = data->create_thread.start;
+ 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 = data->create_process.file;
- event->u.CreateProcessInfo.hProcess = data->create_process.process;
- event->u.CreateProcessInfo.hThread = data->create_process.thread;
- event->u.CreateProcessInfo.lpBaseOfImage = data->create_process.base;
- event->u.CreateProcessInfo.dwDebugInfoFileOffset = data->create_process.dbg_offset;
- event->u.CreateProcessInfo.nDebugInfoSize = data->create_process.dbg_size;
- event->u.CreateProcessInfo.lpThreadLocalBase = data->create_process.teb;
- event->u.CreateProcessInfo.lpStartAddress = data->create_process.start;
- event->u.CreateProcessInfo.lpImageName = data->create_process.name;
- event->u.CreateProcessInfo.fUnicode = data->create_process.unicode;
- if (data->create_process.file == -1) event->u.CreateProcessInfo.hFile = 0;
+ 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 = data->exit.exit_code;
+ event->u.ExitThread.dwExitCode = req->event.info.exit.exit_code;
break;
case EXIT_PROCESS_DEBUG_EVENT:
- event->u.ExitProcess.dwExitCode = data->exit.exit_code;
+ event->u.ExitProcess.dwExitCode = req->event.info.exit.exit_code;
break;
case LOAD_DLL_DEBUG_EVENT:
- event->u.LoadDll.hFile = data->load_dll.handle;
- event->u.LoadDll.lpBaseOfDll = data->load_dll.base;
- event->u.LoadDll.dwDebugInfoFileOffset = data->load_dll.dbg_offset;
- event->u.LoadDll.nDebugInfoSize = data->load_dll.dbg_size;
- event->u.LoadDll.lpImageName = data->load_dll.name;
- event->u.LoadDll.fUnicode = data->load_dll.unicode;
- if (data->load_dll.handle == -1) event->u.LoadDll.hFile = 0;
+ 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 = data->unload_dll.base;
+ event->u.UnloadDll.lpBaseOfDll = req->event.info.unload_dll.base;
break;
case OUTPUT_DEBUG_STRING_EVENT:
- event->u.DebugString.lpDebugStringData = data->output_string.string;
- event->u.DebugString.fUnicode = data->output_string.unicode;
- event->u.DebugString.nDebugStringLength = data->output_string.length;
+ 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 = data->rip_info.error;
- event->u.RipInfo.dwType = data->rip_info.type;
+ event->u.RipInfo.dwError = req->event.info.rip_info.error;
+ event->u.RipInfo.dwType = req->event.info.rip_info.type;
break;
}
return TRUE;
@@ -251,11 +246,12 @@
{
if (PROCESS_Current()->flags & PDB32_DEBUGGED)
{
- struct debug_event_output_string event;
- event.string = (void *)str;
- event.unicode = 0;
- event.length = strlen(str) + 1;
- DEBUG_SendEvent( OUTPUT_DEBUG_STRING_EVENT, &event, sizeof(event) );
+ struct send_debug_event_request *req = get_req_buffer();
+ req->event.code = OUTPUT_DEBUG_STRING_EVENT;
+ req->event.info.output_string.string = (void *)str;
+ req->event.info.output_string.unicode = 0;
+ req->event.info.output_string.length = strlen(str) + 1;
+ server_call( REQ_SEND_DEBUG_EVENT );
}
TRACE("%s\n", str);
@@ -269,11 +265,12 @@
{
if (PROCESS_Current()->flags & PDB32_DEBUGGED)
{
- struct debug_event_output_string event;
- event.string = (void *)str;
- event.unicode = 1;
- event.length = (lstrlenW(str) + 1) * sizeof(WCHAR);
- DEBUG_SendEvent( OUTPUT_DEBUG_STRING_EVENT, &event, sizeof(event) );
+ struct send_debug_event_request *req = get_req_buffer();
+ req->event.code = OUTPUT_DEBUG_STRING_EVENT;
+ req->event.info.output_string.string = (void *)str;
+ req->event.info.output_string.unicode = 1;
+ req->event.info.output_string.length = (lstrlenW(str) + 1) * sizeof(WCHAR);
+ server_call( REQ_SEND_DEBUG_EVENT );
}
TRACE("%s\n", debugstr_w(str));
diff --git a/scheduler/thread.c b/scheduler/thread.c
index f4c3534..4038a8a 100644
--- a/scheduler/thread.c
+++ b/scheduler/thread.c
@@ -516,14 +516,17 @@
* Success: TRUE
* Failure: FALSE
*/
-BOOL WINAPI SetThreadContext(
- HANDLE handle, /* [in] Handle to thread with context */
- const CONTEXT *context) /* [out] Address of context structure */
+BOOL WINAPI SetThreadContext( HANDLE handle, /* [in] Handle to thread with context */
+ const CONTEXT *context ) /* [in] Address of context structure */
{
- FIXME("not implemented\n" );
- return TRUE;
+ struct set_thread_context_request *req = get_req_buffer();
+ req->handle = handle;
+ req->flags = context->ContextFlags;
+ memcpy( &req->context, context, sizeof(*context) );
+ return !server_call( REQ_SET_THREAD_CONTEXT );
}
+
/***********************************************************************
* GetThreadContext [KERNEL32.294] Retrieves context of thread.
*
@@ -531,25 +534,15 @@
* Success: TRUE
* Failure: FALSE
*/
-BOOL WINAPI GetThreadContext(
- HANDLE handle, /* [in] Handle to thread with context */
- CONTEXT *context) /* [out] Address of context structure */
+BOOL WINAPI GetThreadContext( HANDLE handle, /* [in] Handle to thread with context */
+ CONTEXT *context ) /* [out] Address of context structure */
{
-#ifdef __i386__
- WORD cs, ds;
-
- FIXME("returning dummy info\n" );
-
- /* make up some plausible values for segment registers */
- GET_CS(cs);
- GET_DS(ds);
- context->SegCs = cs;
- context->SegDs = ds;
- context->SegEs = ds;
- context->SegGs = ds;
- context->SegSs = ds;
- context->SegFs = ds;
-#endif
+ struct get_thread_context_request *req = get_req_buffer();
+ req->handle = handle;
+ req->flags = context->ContextFlags;
+ memcpy( &req->context, context, sizeof(*context) );
+ if (server_call( REQ_GET_THREAD_CONTEXT )) return FALSE;
+ memcpy( context, &req->context, sizeof(*context) );
return TRUE;
}
diff --git a/server/Makefile.in b/server/Makefile.in
index b4ec97a..e2bad9f 100644
--- a/server/Makefile.in
+++ b/server/Makefile.in
@@ -8,6 +8,7 @@
C_SRCS = \
change.c \
console.c \
+ context_i386.c \
debugger.c \
device.c \
event.c \
diff --git a/server/context_i386.c b/server/context_i386.c
new file mode 100644
index 0000000..129577c
--- /dev/null
+++ b/server/context_i386.c
@@ -0,0 +1,264 @@
+/*
+ * i386 register context support
+ *
+ * Copyright (C) 1999 Alexandre Julliard
+ */
+
+#include "config.h"
+
+#ifdef __i386__
+
+#include <assert.h>
+#include <errno.h>
+#include <sys/ptrace.h>
+#include <sys/user.h>
+
+#include "winbase.h"
+#include "winerror.h"
+
+#include "thread.h"
+#include "request.h"
+
+
+#ifndef PTRACE_PEEKUSER
+#define PTRACE_PEEKUSER PT_READ_U
+#endif
+#ifndef PTRACE_POKEUSER
+#define PTRACE_POKEUSER PT_WRITE_U
+#endif
+#ifndef PTRACE_GETREGS
+#define PTRACE_GETREGS PT_GETREGS
+#endif
+#ifndef PTRACE_GETFPREGS
+#define PTRACE_GETFPREGS PT_GETFPREGS
+#endif
+
+#ifdef linux
+
+/* debug register offset in struct user */
+#define DR_OFFSET(dr) ((int)((((struct user *)0)->u_debugreg) + (dr)))
+
+/* retrieve a debug register */
+static inline int get_debug_reg( int pid, int num, DWORD *data )
+{
+ int res = ptrace( PTRACE_PEEKUSER, pid, DR_OFFSET(num), 0 );
+ if ((res == -1) && errno)
+ {
+ file_set_error();
+ return -1;
+ }
+ *data = res;
+ return 0;
+}
+
+/* retrieve a thread context */
+static void get_thread_context( struct thread *thread, unsigned int flags, CONTEXT *context )
+{
+ int pid = thread->unix_pid;
+ if (flags & CONTEXT_FULL)
+ {
+ struct user_regs_struct regs;
+ if (ptrace( PTRACE_GETREGS, pid, 0, ®s ) == -1) goto error;
+ if (flags & CONTEXT_INTEGER)
+ {
+ context->Eax = regs.eax;
+ context->Ebx = regs.ebx;
+ context->Ecx = regs.ecx;
+ context->Edx = regs.edx;
+ context->Esi = regs.esi;
+ context->Edi = regs.edi;
+ }
+ if (flags & CONTEXT_CONTROL)
+ {
+ context->Ebp = regs.ebp;
+ context->Esp = regs.esp;
+ context->Eip = regs.eip;
+ context->SegCs = regs.xcs & 0xffff;
+ context->SegSs = regs.xss & 0xffff;
+ context->EFlags = regs.eflags;
+ }
+ if (flags & CONTEXT_SEGMENTS)
+ {
+ context->SegDs = regs.xds & 0xffff;
+ context->SegEs = regs.xes & 0xffff;
+ context->SegFs = regs.xfs & 0xffff;
+ context->SegGs = regs.xgs & 0xffff;
+ }
+ }
+ if (flags & CONTEXT_DEBUG_REGISTERS)
+ {
+ if (get_debug_reg( pid, 0, &context->Dr0 ) == -1) goto error;
+ if (get_debug_reg( pid, 1, &context->Dr1 ) == -1) goto error;
+ if (get_debug_reg( pid, 2, &context->Dr2 ) == -1) goto error;
+ if (get_debug_reg( pid, 3, &context->Dr3 ) == -1) goto error;
+ if (get_debug_reg( pid, 6, &context->Dr6 ) == -1) goto error;
+ if (get_debug_reg( pid, 7, &context->Dr7 ) == -1) goto error;
+ }
+ if (flags & CONTEXT_FLOATING_POINT)
+ {
+ /* we can use context->FloatSave directly as it is using the */
+ /* correct structure (the same as fsave/frstor) */
+ if (ptrace( PTRACE_GETFPREGS, pid, 0, &context->FloatSave ) == -1) goto error;
+ context->FloatSave.Cr0NpxState = 0; /* FIXME */
+ }
+ return;
+ error:
+ file_set_error();
+}
+
+
+/* set a thread context */
+static void set_thread_context( struct thread *thread, unsigned int flags, CONTEXT *context )
+{
+ int pid = thread->unix_pid;
+ if (flags & CONTEXT_FULL)
+ {
+ struct user_regs_struct regs;
+ if ((flags & CONTEXT_FULL) != CONTEXT_FULL) /* need to preserve some registers */
+ {
+ if (ptrace( PTRACE_GETREGS, pid, 0, ®s ) == -1) goto error;
+ }
+ if (flags & CONTEXT_INTEGER)
+ {
+ regs.eax = context->Eax;
+ regs.ebx = context->Ebx;
+ regs.ecx = context->Ecx;
+ regs.edx = context->Edx;
+ regs.esi = context->Esi;
+ regs.edi = context->Edi;
+ }
+ if (flags & CONTEXT_CONTROL)
+ {
+ regs.ebp = context->Ebp;
+ regs.esp = context->Esp;
+ regs.eip = context->Eip;
+ regs.xcs = context->SegCs;
+ regs.xss = context->SegSs;
+ regs.eflags = context->EFlags;
+ }
+ if (flags & CONTEXT_SEGMENTS)
+ {
+ regs.xds = context->SegDs;
+ regs.xes = context->SegEs;
+ regs.xfs = context->SegFs;
+ regs.xgs = context->SegGs;
+ }
+ if (ptrace( PTRACE_SETREGS, pid, 0, ®s ) == -1) goto error;
+ }
+ if (flags & CONTEXT_DEBUG_REGISTERS)
+ {
+ if (ptrace( PTRACE_POKEUSER, pid, DR_OFFSET(0), context->Dr0 ) == -1) goto error;
+ if (ptrace( PTRACE_POKEUSER, pid, DR_OFFSET(1), context->Dr1 ) == -1) goto error;
+ if (ptrace( PTRACE_POKEUSER, pid, DR_OFFSET(2), context->Dr2 ) == -1) goto error;
+ if (ptrace( PTRACE_POKEUSER, pid, DR_OFFSET(3), context->Dr3 ) == -1) goto error;
+ if (ptrace( PTRACE_POKEUSER, pid, DR_OFFSET(6), context->Dr6 ) == -1) goto error;
+ if (ptrace( PTRACE_POKEUSER, pid, DR_OFFSET(7), context->Dr7 ) == -1) goto error;
+ }
+ if (flags & CONTEXT_FLOATING_POINT)
+ {
+ /* we can use context->FloatSave directly as it is using the */
+ /* correct structure (the same as fsave/frstor) */
+ if (ptrace( PTRACE_SETFPREGS, pid, 0, &context->FloatSave ) == -1) goto error;
+ context->FloatSave.Cr0NpxState = 0; /* FIXME */
+ }
+ return;
+ error:
+ file_set_error();
+}
+
+#else /* linux */
+#error You must implement get/set_thread_context for your platform
+#endif /* linux */
+
+
+/* copy a context structure according to the flags */
+static void copy_context( CONTEXT *to, CONTEXT *from, int flags )
+{
+ if (flags & CONTEXT_CONTROL)
+ {
+ to->Ebp = from->Ebp;
+ to->Eip = from->Eip;
+ to->Esp = from->Esp;
+ to->SegCs = from->SegCs;
+ to->SegSs = from->SegSs;
+ to->EFlags = from->EFlags;
+ }
+ if (flags & CONTEXT_INTEGER)
+ {
+ to->Eax = from->Eax;
+ to->Ebx = from->Ebx;
+ to->Ecx = from->Ecx;
+ to->Edx = from->Edx;
+ to->Esi = from->Esi;
+ to->Edi = from->Edi;
+ }
+ if (flags & CONTEXT_SEGMENTS)
+ {
+ to->SegDs = from->SegDs;
+ to->SegEs = from->SegEs;
+ to->SegFs = from->SegFs;
+ to->SegGs = from->SegGs;
+ }
+ if (flags & CONTEXT_DEBUG_REGISTERS)
+ {
+ to->Dr0 = from->Dr0;
+ to->Dr1 = from->Dr1;
+ to->Dr2 = from->Dr2;
+ to->Dr3 = from->Dr3;
+ to->Dr6 = from->Dr6;
+ to->Dr7 = from->Dr7;
+ }
+ if (flags & CONTEXT_FLOATING_POINT)
+ {
+ to->FloatSave = from->FloatSave;
+ }
+}
+
+/* retrieve the current context of a thread */
+DECL_HANDLER(get_thread_context)
+{
+ struct thread *thread;
+ CONTEXT *context;
+
+ if ((thread = get_thread_from_handle( req->handle, THREAD_GET_CONTEXT )))
+ {
+ if ((context = get_debug_context( thread ))) /* thread is inside an exception event */
+ {
+ copy_context( &req->context, context, req->flags );
+ }
+ else
+ {
+ suspend_thread( thread, 0 );
+ if (thread->attached) get_thread_context( thread, req->flags, &req->context );
+ else set_error( ERROR_ACCESS_DENIED );
+ resume_thread( thread );
+ }
+ release_object( thread );
+ }
+}
+
+
+/* set the current context of a thread */
+DECL_HANDLER(set_thread_context)
+{
+ struct thread *thread;
+ CONTEXT *context;
+
+ if ((thread = get_thread_from_handle( req->handle, THREAD_SET_CONTEXT )))
+ {
+ if ((context = get_debug_context( thread ))) /* thread is inside an exception event */
+ {
+ copy_context( context, &req->context, req->flags );
+ }
+ else
+ {
+ suspend_thread( thread, 0 );
+ if (thread->attached) set_thread_context( thread, req->flags, &req->context );
+ else set_error( ERROR_ACCESS_DENIED );
+ resume_thread( thread );
+ }
+ release_object( thread );
+ }
+}
+
+#endif /* __i386__ */
diff --git a/server/debugger.c b/server/debugger.c
index 6e370e0..7cbf183 100644
--- a/server/debugger.c
+++ b/server/debugger.c
@@ -28,8 +28,7 @@
struct thread *debugger; /* debugger thread receiving the event */
enum debug_event_state state; /* event state */
int status; /* continuation status */
- int code; /* event code */
- union debug_event_data data; /* event data */
+ debug_event_t data; /* event data */
};
/* debug context */
@@ -84,21 +83,6 @@
debug_ctx_destroy /* destroy */
};
-/* size of the event data */
-static const int event_sizes[] =
-{
- 0,
- sizeof(struct debug_event_exception), /* EXCEPTION_DEBUG_EVENT */
- sizeof(struct debug_event_create_thread), /* CREATE_THREAD_DEBUG_EVENT */
- sizeof(struct debug_event_create_process), /* CREATE_PROCESS_DEBUG_EVENT */
- sizeof(struct debug_event_exit), /* EXIT_THREAD_DEBUG_EVENT */
- sizeof(struct debug_event_exit), /* EXIT_PROCESS_DEBUG_EVENT */
- sizeof(struct debug_event_load_dll), /* LOAD_DLL_DEBUG_EVENT */
- sizeof(struct debug_event_unload_dll), /* UNLOAD_DLL_DEBUG_EVENT */
- sizeof(struct debug_event_output_string), /* OUTPUT_DEBUG_STRING_EVENT */
- sizeof(struct debug_event_rip_info) /* RIP_EVENT */
-};
-
/* initialise the fields that do not need to be filled by the client */
static int fill_debug_event( struct thread *debugger, struct thread *thread,
@@ -107,45 +91,45 @@
int handle;
/* some events need special handling */
- switch(event->code)
+ switch(event->data.code)
{
case CREATE_THREAD_DEBUG_EVENT:
- if ((event->data.create_thread.handle = alloc_handle( debugger->process, thread,
+ if ((event->data.info.create_thread.handle = alloc_handle( debugger->process, thread,
/* documented: THREAD_GET_CONTEXT | THREAD_SET_CONTEXT | THREAD_SUSPEND_RESUME */
THREAD_ALL_ACCESS, FALSE )) == -1)
return 0;
break;
case CREATE_PROCESS_DEBUG_EVENT:
- if ((handle = event->data.create_process.file) != -1)
+ if ((handle = event->data.info.create_process.file) != -1)
{
if ((handle = duplicate_handle( thread->process, handle, debugger->process,
GENERIC_READ, FALSE, 0 )) == -1)
return 0;
- event->data.create_process.file = handle;
+ event->data.info.create_process.file = handle;
}
- if ((event->data.create_process.process = alloc_handle( debugger->process, thread->process,
+ if ((event->data.info.create_process.process = alloc_handle( debugger->process, thread->process,
/* documented: PROCESS_VM_READ | PROCESS_VM_WRITE */
PROCESS_ALL_ACCESS, FALSE )) == -1)
{
if (handle != -1) close_handle( debugger->process, handle );
return 0;
}
- if ((event->data.create_process.thread = alloc_handle( debugger->process, thread,
+ if ((event->data.info.create_process.thread = alloc_handle( debugger->process, thread,
/* documented: THREAD_GET_CONTEXT | THREAD_SET_CONTEXT | THREAD_SUSPEND_RESUME */
THREAD_ALL_ACCESS, FALSE )) == -1)
{
if (handle != -1) close_handle( debugger->process, handle );
- close_handle( debugger->process, event->data.create_process.process );
+ close_handle( debugger->process, event->data.info.create_process.process );
return 0;
}
break;
case LOAD_DLL_DEBUG_EVENT:
- if ((handle = event->data.load_dll.handle) != -1)
+ if ((handle = event->data.info.load_dll.handle) != -1)
{
if ((handle = duplicate_handle( thread->process, handle, debugger->process,
GENERIC_READ, FALSE, 0 )) == -1)
return 0;
- event->data.load_dll.handle = handle;
+ event->data.info.load_dll.handle = handle;
}
break;
}
@@ -196,14 +180,14 @@
event->state = EVENT_SENT;
debug_ctx->to_send = event->next;
- req->code = event->code;
+ req->event.code = event->data.code;
req->pid = event->sender->process;
req->tid = event->sender;
- memcpy( req + 1, &event->data, event_sizes[event->code] );
+ memcpy( &req->event, &event->data, sizeof(req->event) );
}
else /* timeout or error */
{
- req->code = 0;
+ req->event.code = 0;
req->pid = 0;
req->tid = 0;
thread->error = signaled;
@@ -219,8 +203,10 @@
req->status = event->status;
/* copy the context into the reply */
- if (event->code == EXCEPTION_DEBUG_EVENT)
- memcpy( req + 1, &event->data, event_sizes[event->code] );
+ if (event->data.code == EXCEPTION_DEBUG_EVENT)
+ memcpy( &req->event.info.exception.context,
+ &event->data.info.exception.context,
+ sizeof(req->event.info.exception.context) );
}
static void debug_event_dump( struct object *obj, int verbose )
@@ -228,7 +214,7 @@
struct debug_event *debug_event = (struct debug_event *)obj;
assert( obj->ops == &debug_event_ops );
fprintf( stderr, "Debug event sender=%p code=%d state=%d\n",
- debug_event->sender, debug_event->code, debug_event->state );
+ debug_event->sender, debug_event->data.code, debug_event->state );
}
static int debug_event_signaled( struct object *obj, struct thread *thread )
@@ -252,20 +238,20 @@
if (event->state == EVENT_QUEUED)
{
struct process *debugger = event->debugger->process;
- switch(event->code)
+ switch(event->data.code)
{
case CREATE_THREAD_DEBUG_EVENT:
- close_handle( debugger, event->data.create_thread.handle );
+ close_handle( debugger, event->data.info.create_thread.handle );
break;
case CREATE_PROCESS_DEBUG_EVENT:
- if (event->data.create_process.file != -1)
- close_handle( debugger, event->data.create_process.file );
- close_handle( debugger, event->data.create_process.thread );
- close_handle( debugger, event->data.create_process.process );
+ if (event->data.info.create_process.file != -1)
+ close_handle( debugger, event->data.info.create_process.file );
+ close_handle( debugger, event->data.info.create_process.thread );
+ close_handle( debugger, event->data.info.create_process.process );
break;
case LOAD_DLL_DEBUG_EVENT:
- if (event->data.load_dll.handle != -1)
- close_handle( debugger, event->data.load_dll.handle );
+ if (event->data.info.load_dll.handle != -1)
+ close_handle( debugger, event->data.info.load_dll.handle );
break;
}
}
@@ -346,7 +332,7 @@
/* queue a debug event for a debugger */
static struct debug_event *queue_debug_event( struct thread *debugger, struct thread *thread,
- int code, void *data )
+ debug_event_t *data )
{
struct debug_ctx *debug_ctx = debugger->debug_ctx;
struct debug_event *event;
@@ -360,14 +346,13 @@
event->next = NULL;
event->prev = NULL;
event->state = EVENT_QUEUED;
- event->code = code;
event->sender = (struct thread *)grab_object( thread );
event->debugger = (struct thread *)grab_object( debugger );
- memcpy( &event->data, data, event_sizes[code] );
+ memcpy( &event->data, data, sizeof(event->data) );
if (!fill_debug_event( debugger, thread, event ))
{
- event->code = -1; /* make sure we don't attempt to close handles */
+ event->data.code = -1; /* make sure we don't attempt to close handles */
release_object( event );
return NULL;
}
@@ -377,6 +362,22 @@
return event;
}
+/* return a pointer to the context in case the thread is inside an exception event */
+CONTEXT *get_debug_context( struct thread *thread )
+{
+ struct debug_event *event;
+ struct thread *debugger = thread->process->debugger;
+
+ if (!debugger) return NULL; /* not being debugged */
+ assert( debugger->debug_ctx );
+
+ /* find the exception event in the debugger's queue */
+ for (event = debugger->debug_ctx->event_head; event; event = event->next)
+ if (event->sender == thread && (event->data.code == EXCEPTION_DEBUG_EVENT))
+ return &event->data.info.exception.context;
+ return NULL;
+}
+
/* attach a process to a debugger thread */
int debugger_attach( struct process *process, struct thread *debugger )
{
@@ -417,13 +418,12 @@
if (debugger) /* being debugged -> send an event to the debugger */
{
struct debug_event *event;
- struct debug_event_exit exit;
- exit.exit_code = exit_code;
- if (thread->process->running_threads == 1)
- /* this is the last thread, send an exit process event */
- event = queue_debug_event( debugger, thread, EXIT_PROCESS_DEBUG_EVENT, &exit );
- else
- event = queue_debug_event( debugger, thread, EXIT_THREAD_DEBUG_EVENT, &exit );
+ debug_event_t exit;
+ exit.info.exit.exit_code = exit_code;
+ /* if this is the last thread, send an exit process event */
+ exit.code = ((thread->process->running_threads == 1) ?
+ EXIT_PROCESS_DEBUG_EVENT : EXIT_THREAD_DEBUG_EVENT);
+ event = queue_debug_event( debugger, thread, &exit );
if (event) release_object( event );
}
@@ -441,9 +441,9 @@
{
if (!wait_for_debug_event( req->timeout ))
{
- req->code = 0;
- req->pid = NULL;
- req->tid = NULL;
+ req->event.code = 0;
+ req->pid = NULL;
+ req->tid = NULL;
}
}
@@ -481,13 +481,13 @@
struct thread *debugger = current->process->debugger;
struct debug_event *event;
- if ((req->code <= 0) || (req->code > RIP_EVENT))
+ if ((req->event.code <= 0) || (req->event.code > RIP_EVENT))
{
- fatal_protocol_error( current, "send_debug_event: bad code %d\n", req->code );
+ fatal_protocol_error( current, "send_debug_event: bad code %d\n", req->event.code );
return;
}
req->status = 0;
- if (debugger && ((event = queue_debug_event( debugger, current, req->code, req + 1 ))))
+ if (debugger && ((event = queue_debug_event( debugger, current, &req->event ))))
{
/* wait for continue_debug_event */
struct object *obj = &event->obj;
diff --git a/server/object.h b/server/object.h
index 5825dce..fb874f7 100644
--- a/server/object.h
+++ b/server/object.h
@@ -155,6 +155,7 @@
extern int debugger_attach( struct process *process, struct thread *debugger );
extern void debug_exit_thread( struct thread *thread, int exit_code );
+extern CONTEXT *get_debug_context( struct thread *thread );
/* mapping functions */
diff --git a/server/request.h b/server/request.h
index da50d44..80ad9aa 100644
--- a/server/request.h
+++ b/server/request.h
@@ -157,6 +157,8 @@
DECL_HANDLER(open_timer);
DECL_HANDLER(set_timer);
DECL_HANDLER(cancel_timer);
+DECL_HANDLER(get_thread_context);
+DECL_HANDLER(set_thread_context);
#ifdef WANT_REQUEST_HANDLERS
@@ -254,6 +256,8 @@
{ (void(*)())req_open_timer, sizeof(struct open_timer_request) },
{ (void(*)())req_set_timer, sizeof(struct set_timer_request) },
{ (void(*)())req_cancel_timer, sizeof(struct cancel_timer_request) },
+ { (void(*)())req_get_thread_context, sizeof(struct get_thread_context_request) },
+ { (void(*)())req_set_thread_context, sizeof(struct set_thread_context_request) },
};
#endif /* WANT_REQUEST_HANDLERS */
diff --git a/server/trace.c b/server/trace.c
index 35fb9e7..7fc5eb6 100644
--- a/server/trace.c
+++ b/server/trace.c
@@ -9,6 +9,7 @@
#include <sys/types.h>
#include <sys/uio.h>
#include "winsock2.h"
+#include "winnt.h"
#include "request.h"
#include "unicode.h"
@@ -26,6 +27,17 @@
fputc( '}', stderr );
}
+static void dump_uints( const int *ptr, int len )
+{
+ fputc( '{', stderr );
+ while (len)
+ {
+ fprintf( stderr, "%08x", *ptr++ );
+ if (--len) fputc( ',', stderr );
+ }
+ fputc( '}', stderr );
+}
+
static void dump_bytes( const unsigned char *ptr, int len )
{
fputc( '{', stderr );
@@ -44,15 +56,103 @@
fputc( '\"', stderr );
}
+static void dump_path_t( const path_t *path )
+{
+ dump_unicode_string( *path );
+}
+
+static void dump_context( const CONTEXT *context )
+{
+#ifdef __i386__
+ fprintf( stderr, "{flags=%08lx,eax=%08lx,ebx=%08lx,ecx=%08lx,edx=%08lx,esi=%08lx,edi=%08lx,"
+ "ebp=%08lx,eip=%08lx,esp=%08lx,eflags=%08lx,cs=%04lx,ds=%04lx,es=%04lx,"
+ "fs=%04lx,gs=%04lx,dr0=%08lx,dr1=%08lx,dr2=%08lx,dr3=%08lx,dr6=%08lx,dr7=%08lx,",
+ context->ContextFlags, context->Eax, context->Ebx, context->Ecx, context->Edx,
+ context->Esi, context->Edi, context->Ebp, context->Eip, context->Esp, context->EFlags,
+ context->SegCs, context->SegDs, context->SegEs, context->SegFs, context->SegGs,
+ context->Dr0, context->Dr1, context->Dr2, context->Dr3, context->Dr6, context->Dr7 );
+ fprintf( stderr, "float=" );
+ dump_uints( (int *)&context->FloatSave, sizeof(context->FloatSave) / sizeof(int) );
+ fprintf( stderr, "}" );
+#else
+ dump_uints( (int *)context, sizeof(*context) / sizeof(int) );
+#endif
+}
+
+static void dump_debug_event_t( const debug_event_t *event )
+{
+ int i;
+ switch(event->code)
+ {
+ case EXCEPTION_DEBUG_EVENT:
+ fprintf( stderr, "{exception,code=%x,flags=%x,rec=%p,addr=%p,params={",
+ event->info.exception.code, event->info.exception.flags,
+ event->info.exception.record, event->info.exception.addr );
+ for (i = 0; i < event->info.exception.nb_params; i++)
+ {
+ if (i) fputc( ',', stderr );
+ fprintf( stderr, "%x", event->info.exception.params[i] );
+ }
+ fprintf( stderr, "},first_chance=%d,context=", event->info.exception.first_chance );
+ dump_context( &event->info.exception.context );
+ fputc( '}', stderr );
+ break;
+ case CREATE_THREAD_DEBUG_EVENT:
+ fprintf( stderr, "{create_thread,thread=%d,teb=%p,start=%p}",
+ event->info.create_thread.handle, event->info.create_thread.teb,
+ event->info.create_thread.start );
+ break;
+ case CREATE_PROCESS_DEBUG_EVENT:
+ fprintf( stderr, "{create_process,file=%d,process=%d,thread=%d,base=%p,offset=%d,"
+ "size=%d,teb=%p,start=%p,name=%p,unicode=%d}",
+ event->info.create_process.file, event->info.create_process.process,
+ event->info.create_process.thread, event->info.create_process.base,
+ event->info.create_process.dbg_offset, event->info.create_process.dbg_size,
+ event->info.create_process.teb, event->info.create_process.start,
+ event->info.create_process.name, event->info.create_process.unicode );
+ break;
+ case EXIT_THREAD_DEBUG_EVENT:
+ fprintf( stderr, "{exit_thread,code=%d}", event->info.exit.exit_code );
+ break;
+ case EXIT_PROCESS_DEBUG_EVENT:
+ fprintf( stderr, "{exit_process,code=%d}", event->info.exit.exit_code );
+ break;
+ case LOAD_DLL_DEBUG_EVENT:
+ fprintf( stderr, "{load_dll,file=%d,base=%p,offset=%d,size=%d,name=%p,unicode=%d}",
+ event->info.load_dll.handle, event->info.load_dll.base,
+ event->info.load_dll.dbg_offset, event->info.load_dll.dbg_size,
+ event->info.load_dll.name, event->info.load_dll.unicode );
+ break;
+ case UNLOAD_DLL_DEBUG_EVENT:
+ fprintf( stderr, "{unload_dll,base=%p}", event->info.unload_dll.base );
+ break;
+ case OUTPUT_DEBUG_STRING_EVENT:
+ fprintf( stderr, "{output_string,data=%p,unicode=%d,len=%d}",
+ event->info.output_string.string, event->info.output_string.unicode,
+ event->info.output_string.length );
+ break;
+ case RIP_EVENT:
+ fprintf( stderr, "{rip,err=%d,type=%d}",
+ event->info.rip_info.error, event->info.rip_info.type );
+ break;
+ case 0: /* zero is the code returned on timeouts */
+ fprintf( stderr, "{}" );
+ break;
+ default:
+ fprintf( stderr, "{code=??? (%d)}", event->code );
+ break;
+ }
+}
+
/* dumping for functions for requests that have a variable part */
-static void dump_varargs_select_request( struct select_request *req )
+static void dump_varargs_select_request( const struct select_request *req )
{
dump_ints( req->handles, req->count );
}
-static void dump_varargs_get_apcs_reply( struct get_apcs_request *req )
+static void dump_varargs_get_apcs_reply( const struct get_apcs_request *req )
{
int i;
for (i = 0; i < 2 * req->count; i++)
@@ -60,34 +160,34 @@
fprintf( stderr, "}" );
}
-static void dump_varargs_get_socket_event_reply( struct get_socket_event_request *req )
+static void dump_varargs_get_socket_event_reply( const struct get_socket_event_request *req )
{
dump_ints( req->errors, FD_MAX_EVENTS );
}
-static void dump_varargs_read_process_memory_reply( struct read_process_memory_request *req )
+static void dump_varargs_read_process_memory_reply( const struct read_process_memory_request *req )
{
int count = MIN( req->len, get_req_size( req->data, sizeof(int) ) );
dump_bytes( (unsigned char *)req->data, count * sizeof(int) );
}
-static void dump_varargs_write_process_memory_request( struct write_process_memory_request *req )
+static void dump_varargs_write_process_memory_request( const struct write_process_memory_request *req )
{
int count = MIN( req->len, get_req_size( req->data, sizeof(int) ) );
dump_bytes( (unsigned char *)req->data, count * sizeof(int) );
}
-static void dump_varargs_set_key_value_request( struct set_key_value_request *req )
+static void dump_varargs_set_key_value_request( const struct set_key_value_request *req )
{
dump_bytes( req->data, req->len );
}
-static void dump_varargs_get_key_value_reply( struct get_key_value_request *req )
+static void dump_varargs_get_key_value_reply( const struct get_key_value_request *req )
{
dump_bytes( req->data, req->len );
}
-static void dump_varargs_enum_key_value_reply( struct enum_key_value_request *req )
+static void dump_varargs_enum_key_value_reply( const struct enum_key_value_request *req )
{
dump_bytes( req->data, req->len );
}
@@ -97,7 +197,7 @@
/* Everything below this line is generated automatically by tools/make_requests */
/* ### make_requests begin ### */
-static void dump_new_process_request( struct new_process_request *req )
+static void dump_new_process_request( const struct new_process_request *req )
{
fprintf( stderr, " inherit=%d,", req->inherit );
fprintf( stderr, " inherit_all=%d,", req->inherit_all );
@@ -112,35 +212,35 @@
fprintf( stderr, " cmdline=\"%s\"", req->cmdline );
}
-static void dump_new_process_reply( struct new_process_request *req )
+static void dump_new_process_reply( const struct new_process_request *req )
{
fprintf( stderr, " pid=%p,", req->pid );
fprintf( stderr, " handle=%d", req->handle );
}
-static void dump_new_thread_request( struct new_thread_request *req )
+static void dump_new_thread_request( const struct new_thread_request *req )
{
fprintf( stderr, " pid=%p,", req->pid );
fprintf( stderr, " suspend=%d,", req->suspend );
fprintf( stderr, " inherit=%d", req->inherit );
}
-static void dump_new_thread_reply( struct new_thread_request *req )
+static void dump_new_thread_reply( const struct new_thread_request *req )
{
fprintf( stderr, " tid=%p,", req->tid );
fprintf( stderr, " handle=%d", req->handle );
}
-static void dump_set_debug_request( struct set_debug_request *req )
+static void dump_set_debug_request( const struct set_debug_request *req )
{
fprintf( stderr, " level=%d", req->level );
}
-static void dump_init_process_request( struct init_process_request *req )
+static void dump_init_process_request( const struct init_process_request *req )
{
}
-static void dump_init_process_reply( struct init_process_request *req )
+static void dump_init_process_reply( const struct init_process_request *req )
{
fprintf( stderr, " start_flags=%d,", req->start_flags );
fprintf( stderr, " hstdin=%d,", req->hstdin );
@@ -151,46 +251,46 @@
fprintf( stderr, " cmdline=\"%s\"", req->cmdline );
}
-static void dump_init_process_done_request( struct init_process_done_request *req )
+static void dump_init_process_done_request( const struct init_process_done_request *req )
{
fprintf( stderr, " dummy=%d", req->dummy );
}
-static void dump_init_thread_request( struct init_thread_request *req )
+static void dump_init_thread_request( const struct init_thread_request *req )
{
fprintf( stderr, " unix_pid=%d,", req->unix_pid );
fprintf( stderr, " teb=%p", req->teb );
}
-static void dump_init_thread_reply( struct init_thread_request *req )
+static void dump_init_thread_reply( const struct init_thread_request *req )
{
fprintf( stderr, " pid=%p,", req->pid );
fprintf( stderr, " tid=%p", req->tid );
}
-static void dump_get_thread_buffer_request( struct get_thread_buffer_request *req )
+static void dump_get_thread_buffer_request( const struct get_thread_buffer_request *req )
{
fprintf( stderr, " dummy=%d", req->dummy );
}
-static void dump_terminate_process_request( struct terminate_process_request *req )
+static void dump_terminate_process_request( const struct terminate_process_request *req )
{
fprintf( stderr, " handle=%d,", req->handle );
fprintf( stderr, " exit_code=%d", req->exit_code );
}
-static void dump_terminate_thread_request( struct terminate_thread_request *req )
+static void dump_terminate_thread_request( const struct terminate_thread_request *req )
{
fprintf( stderr, " handle=%d,", req->handle );
fprintf( stderr, " exit_code=%d", req->exit_code );
}
-static void dump_get_process_info_request( struct get_process_info_request *req )
+static void dump_get_process_info_request( const struct get_process_info_request *req )
{
fprintf( stderr, " handle=%d", req->handle );
}
-static void dump_get_process_info_reply( struct get_process_info_request *req )
+static void dump_get_process_info_reply( const struct get_process_info_request *req )
{
fprintf( stderr, " pid=%p,", req->pid );
fprintf( stderr, " exit_code=%d,", req->exit_code );
@@ -199,7 +299,7 @@
fprintf( stderr, " system_affinity=%d", req->system_affinity );
}
-static void dump_set_process_info_request( struct set_process_info_request *req )
+static void dump_set_process_info_request( const struct set_process_info_request *req )
{
fprintf( stderr, " handle=%d,", req->handle );
fprintf( stderr, " mask=%d,", req->mask );
@@ -207,19 +307,19 @@
fprintf( stderr, " affinity=%d", req->affinity );
}
-static void dump_get_thread_info_request( struct get_thread_info_request *req )
+static void dump_get_thread_info_request( const struct get_thread_info_request *req )
{
fprintf( stderr, " handle=%d", req->handle );
}
-static void dump_get_thread_info_reply( struct get_thread_info_request *req )
+static void dump_get_thread_info_reply( const struct get_thread_info_request *req )
{
fprintf( stderr, " tid=%p,", req->tid );
fprintf( stderr, " exit_code=%d,", req->exit_code );
fprintf( stderr, " priority=%d", req->priority );
}
-static void dump_set_thread_info_request( struct set_thread_info_request *req )
+static void dump_set_thread_info_request( const struct set_thread_info_request *req )
{
fprintf( stderr, " handle=%d,", req->handle );
fprintf( stderr, " mask=%d,", req->mask );
@@ -227,72 +327,72 @@
fprintf( stderr, " affinity=%d", req->affinity );
}
-static void dump_suspend_thread_request( struct suspend_thread_request *req )
+static void dump_suspend_thread_request( const struct suspend_thread_request *req )
{
fprintf( stderr, " handle=%d", req->handle );
}
-static void dump_suspend_thread_reply( struct suspend_thread_request *req )
+static void dump_suspend_thread_reply( const struct suspend_thread_request *req )
{
fprintf( stderr, " count=%d", req->count );
}
-static void dump_resume_thread_request( struct resume_thread_request *req )
+static void dump_resume_thread_request( const struct resume_thread_request *req )
{
fprintf( stderr, " handle=%d", req->handle );
}
-static void dump_resume_thread_reply( struct resume_thread_request *req )
+static void dump_resume_thread_reply( const struct resume_thread_request *req )
{
fprintf( stderr, " count=%d", req->count );
}
-static void dump_debugger_request( struct debugger_request *req )
+static void dump_debugger_request( const struct debugger_request *req )
{
fprintf( stderr, " op=%d", req->op );
}
-static void dump_queue_apc_request( struct queue_apc_request *req )
+static void dump_queue_apc_request( const struct queue_apc_request *req )
{
fprintf( stderr, " handle=%d,", req->handle );
fprintf( stderr, " func=%p,", req->func );
fprintf( stderr, " param=%p", req->param );
}
-static void dump_get_apcs_request( struct get_apcs_request *req )
+static void dump_get_apcs_request( const struct get_apcs_request *req )
{
}
-static void dump_get_apcs_reply( struct get_apcs_request *req )
+static void dump_get_apcs_reply( const struct get_apcs_request *req )
{
fprintf( stderr, " count=%d,", req->count );
fprintf( stderr, " apcs=" );
dump_varargs_get_apcs_reply( req );
}
-static void dump_close_handle_request( struct close_handle_request *req )
+static void dump_close_handle_request( const struct close_handle_request *req )
{
fprintf( stderr, " handle=%d", req->handle );
}
-static void dump_get_handle_info_request( struct get_handle_info_request *req )
+static void dump_get_handle_info_request( const struct get_handle_info_request *req )
{
fprintf( stderr, " handle=%d", req->handle );
}
-static void dump_get_handle_info_reply( struct get_handle_info_request *req )
+static void dump_get_handle_info_reply( const struct get_handle_info_request *req )
{
fprintf( stderr, " flags=%d", req->flags );
}
-static void dump_set_handle_info_request( struct set_handle_info_request *req )
+static void dump_set_handle_info_request( const struct set_handle_info_request *req )
{
fprintf( stderr, " handle=%d,", req->handle );
fprintf( stderr, " flags=%d,", req->flags );
fprintf( stderr, " mask=%d", req->mask );
}
-static void dump_dup_handle_request( struct dup_handle_request *req )
+static void dump_dup_handle_request( const struct dup_handle_request *req )
{
fprintf( stderr, " src_process=%d,", req->src_process );
fprintf( stderr, " src_handle=%d,", req->src_handle );
@@ -302,24 +402,24 @@
fprintf( stderr, " options=%d", req->options );
}
-static void dump_dup_handle_reply( struct dup_handle_request *req )
+static void dump_dup_handle_reply( const struct dup_handle_request *req )
{
fprintf( stderr, " handle=%d", req->handle );
}
-static void dump_open_process_request( struct open_process_request *req )
+static void dump_open_process_request( const struct open_process_request *req )
{
fprintf( stderr, " pid=%p,", req->pid );
fprintf( stderr, " access=%08x,", req->access );
fprintf( stderr, " inherit=%d", req->inherit );
}
-static void dump_open_process_reply( struct open_process_request *req )
+static void dump_open_process_reply( const struct open_process_request *req )
{
fprintf( stderr, " handle=%d", req->handle );
}
-static void dump_select_request( struct select_request *req )
+static void dump_select_request( const struct select_request *req )
{
fprintf( stderr, " count=%d,", req->count );
fprintf( stderr, " flags=%d,", req->flags );
@@ -328,12 +428,12 @@
dump_varargs_select_request( req );
}
-static void dump_select_reply( struct select_request *req )
+static void dump_select_reply( const struct select_request *req )
{
fprintf( stderr, " signaled=%d", req->signaled );
}
-static void dump_create_event_request( struct create_event_request *req )
+static void dump_create_event_request( const struct create_event_request *req )
{
fprintf( stderr, " manual_reset=%d,", req->manual_reset );
fprintf( stderr, " initial_state=%d,", req->initial_state );
@@ -342,18 +442,18 @@
dump_unicode_string( req->name );
}
-static void dump_create_event_reply( struct create_event_request *req )
+static void dump_create_event_reply( const struct create_event_request *req )
{
fprintf( stderr, " handle=%d", req->handle );
}
-static void dump_event_op_request( struct event_op_request *req )
+static void dump_event_op_request( const struct event_op_request *req )
{
fprintf( stderr, " handle=%d,", req->handle );
fprintf( stderr, " op=%d", req->op );
}
-static void dump_open_event_request( struct open_event_request *req )
+static void dump_open_event_request( const struct open_event_request *req )
{
fprintf( stderr, " access=%08x,", req->access );
fprintf( stderr, " inherit=%d,", req->inherit );
@@ -361,12 +461,12 @@
dump_unicode_string( req->name );
}
-static void dump_open_event_reply( struct open_event_request *req )
+static void dump_open_event_reply( const struct open_event_request *req )
{
fprintf( stderr, " handle=%d", req->handle );
}
-static void dump_create_mutex_request( struct create_mutex_request *req )
+static void dump_create_mutex_request( const struct create_mutex_request *req )
{
fprintf( stderr, " owned=%d,", req->owned );
fprintf( stderr, " inherit=%d,", req->inherit );
@@ -374,17 +474,17 @@
dump_unicode_string( req->name );
}
-static void dump_create_mutex_reply( struct create_mutex_request *req )
+static void dump_create_mutex_reply( const struct create_mutex_request *req )
{
fprintf( stderr, " handle=%d", req->handle );
}
-static void dump_release_mutex_request( struct release_mutex_request *req )
+static void dump_release_mutex_request( const struct release_mutex_request *req )
{
fprintf( stderr, " handle=%d", req->handle );
}
-static void dump_open_mutex_request( struct open_mutex_request *req )
+static void dump_open_mutex_request( const struct open_mutex_request *req )
{
fprintf( stderr, " access=%08x,", req->access );
fprintf( stderr, " inherit=%d,", req->inherit );
@@ -392,12 +492,12 @@
dump_unicode_string( req->name );
}
-static void dump_open_mutex_reply( struct open_mutex_request *req )
+static void dump_open_mutex_reply( const struct open_mutex_request *req )
{
fprintf( stderr, " handle=%d", req->handle );
}
-static void dump_create_semaphore_request( struct create_semaphore_request *req )
+static void dump_create_semaphore_request( const struct create_semaphore_request *req )
{
fprintf( stderr, " initial=%08x,", req->initial );
fprintf( stderr, " max=%08x,", req->max );
@@ -406,23 +506,23 @@
dump_unicode_string( req->name );
}
-static void dump_create_semaphore_reply( struct create_semaphore_request *req )
+static void dump_create_semaphore_reply( const struct create_semaphore_request *req )
{
fprintf( stderr, " handle=%d", req->handle );
}
-static void dump_release_semaphore_request( struct release_semaphore_request *req )
+static void dump_release_semaphore_request( const struct release_semaphore_request *req )
{
fprintf( stderr, " handle=%d,", req->handle );
fprintf( stderr, " count=%08x", req->count );
}
-static void dump_release_semaphore_reply( struct release_semaphore_request *req )
+static void dump_release_semaphore_reply( const struct release_semaphore_request *req )
{
fprintf( stderr, " prev_count=%08x", req->prev_count );
}
-static void dump_open_semaphore_request( struct open_semaphore_request *req )
+static void dump_open_semaphore_request( const struct open_semaphore_request *req )
{
fprintf( stderr, " access=%08x,", req->access );
fprintf( stderr, " inherit=%d,", req->inherit );
@@ -430,12 +530,12 @@
dump_unicode_string( req->name );
}
-static void dump_open_semaphore_reply( struct open_semaphore_request *req )
+static void dump_open_semaphore_reply( const struct open_semaphore_request *req )
{
fprintf( stderr, " handle=%d", req->handle );
}
-static void dump_create_file_request( struct create_file_request *req )
+static void dump_create_file_request( const struct create_file_request *req )
{
fprintf( stderr, " access=%08x,", req->access );
fprintf( stderr, " inherit=%d,", req->inherit );
@@ -445,32 +545,32 @@
fprintf( stderr, " name=\"%s\"", req->name );
}
-static void dump_create_file_reply( struct create_file_request *req )
+static void dump_create_file_reply( const struct create_file_request *req )
{
fprintf( stderr, " handle=%d", req->handle );
}
-static void dump_alloc_file_handle_request( struct alloc_file_handle_request *req )
+static void dump_alloc_file_handle_request( const struct alloc_file_handle_request *req )
{
fprintf( stderr, " access=%08x", req->access );
}
-static void dump_alloc_file_handle_reply( struct alloc_file_handle_request *req )
+static void dump_alloc_file_handle_reply( const struct alloc_file_handle_request *req )
{
fprintf( stderr, " handle=%d", req->handle );
}
-static void dump_get_read_fd_request( struct get_read_fd_request *req )
+static void dump_get_read_fd_request( const struct get_read_fd_request *req )
{
fprintf( stderr, " handle=%d", req->handle );
}
-static void dump_get_write_fd_request( struct get_write_fd_request *req )
+static void dump_get_write_fd_request( const struct get_write_fd_request *req )
{
fprintf( stderr, " handle=%d", req->handle );
}
-static void dump_set_file_pointer_request( struct set_file_pointer_request *req )
+static void dump_set_file_pointer_request( const struct set_file_pointer_request *req )
{
fprintf( stderr, " handle=%d,", req->handle );
fprintf( stderr, " low=%d,", req->low );
@@ -478,35 +578,35 @@
fprintf( stderr, " whence=%d", req->whence );
}
-static void dump_set_file_pointer_reply( struct set_file_pointer_request *req )
+static void dump_set_file_pointer_reply( const struct set_file_pointer_request *req )
{
fprintf( stderr, " new_low=%d,", req->new_low );
fprintf( stderr, " new_high=%d", req->new_high );
}
-static void dump_truncate_file_request( struct truncate_file_request *req )
+static void dump_truncate_file_request( const struct truncate_file_request *req )
{
fprintf( stderr, " handle=%d", req->handle );
}
-static void dump_set_file_time_request( struct set_file_time_request *req )
+static void dump_set_file_time_request( const struct set_file_time_request *req )
{
fprintf( stderr, " handle=%d,", req->handle );
fprintf( stderr, " access_time=%ld,", req->access_time );
fprintf( stderr, " write_time=%ld", req->write_time );
}
-static void dump_flush_file_request( struct flush_file_request *req )
+static void dump_flush_file_request( const struct flush_file_request *req )
{
fprintf( stderr, " handle=%d", req->handle );
}
-static void dump_get_file_info_request( struct get_file_info_request *req )
+static void dump_get_file_info_request( const struct get_file_info_request *req )
{
fprintf( stderr, " handle=%d", req->handle );
}
-static void dump_get_file_info_reply( struct get_file_info_request *req )
+static void dump_get_file_info_reply( const struct get_file_info_request *req )
{
fprintf( stderr, " type=%d,", req->type );
fprintf( stderr, " attr=%d,", req->attr );
@@ -520,7 +620,7 @@
fprintf( stderr, " serial=%08x", req->serial );
}
-static void dump_lock_file_request( struct lock_file_request *req )
+static void dump_lock_file_request( const struct lock_file_request *req )
{
fprintf( stderr, " handle=%d,", req->handle );
fprintf( stderr, " offset_low=%08x,", req->offset_low );
@@ -529,7 +629,7 @@
fprintf( stderr, " count_high=%08x", req->count_high );
}
-static void dump_unlock_file_request( struct unlock_file_request *req )
+static void dump_unlock_file_request( const struct unlock_file_request *req )
{
fprintf( stderr, " handle=%d,", req->handle );
fprintf( stderr, " offset_low=%08x,", req->offset_low );
@@ -538,18 +638,18 @@
fprintf( stderr, " count_high=%08x", req->count_high );
}
-static void dump_create_pipe_request( struct create_pipe_request *req )
+static void dump_create_pipe_request( const struct create_pipe_request *req )
{
fprintf( stderr, " inherit=%d", req->inherit );
}
-static void dump_create_pipe_reply( struct create_pipe_request *req )
+static void dump_create_pipe_reply( const struct create_pipe_request *req )
{
fprintf( stderr, " handle_read=%d,", req->handle_read );
fprintf( stderr, " handle_write=%d", req->handle_write );
}
-static void dump_create_socket_request( struct create_socket_request *req )
+static void dump_create_socket_request( const struct create_socket_request *req )
{
fprintf( stderr, " access=%08x,", req->access );
fprintf( stderr, " inherit=%d,", req->inherit );
@@ -558,38 +658,38 @@
fprintf( stderr, " protocol=%d", req->protocol );
}
-static void dump_create_socket_reply( struct create_socket_request *req )
+static void dump_create_socket_reply( const struct create_socket_request *req )
{
fprintf( stderr, " handle=%d", req->handle );
}
-static void dump_accept_socket_request( struct accept_socket_request *req )
+static void dump_accept_socket_request( const struct accept_socket_request *req )
{
fprintf( stderr, " lhandle=%d,", req->lhandle );
fprintf( stderr, " access=%08x,", req->access );
fprintf( stderr, " inherit=%d", req->inherit );
}
-static void dump_accept_socket_reply( struct accept_socket_request *req )
+static void dump_accept_socket_reply( const struct accept_socket_request *req )
{
fprintf( stderr, " handle=%d", req->handle );
}
-static void dump_set_socket_event_request( struct set_socket_event_request *req )
+static void dump_set_socket_event_request( const struct set_socket_event_request *req )
{
fprintf( stderr, " handle=%d,", req->handle );
fprintf( stderr, " mask=%08x,", req->mask );
fprintf( stderr, " event=%d", req->event );
}
-static void dump_get_socket_event_request( struct get_socket_event_request *req )
+static void dump_get_socket_event_request( const struct get_socket_event_request *req )
{
fprintf( stderr, " handle=%d,", req->handle );
fprintf( stderr, " service=%d,", req->service );
fprintf( stderr, " s_event=%d", req->s_event );
}
-static void dump_get_socket_event_reply( struct get_socket_event_request *req )
+static void dump_get_socket_event_reply( const struct get_socket_event_request *req )
{
fprintf( stderr, " mask=%08x,", req->mask );
fprintf( stderr, " pmask=%08x,", req->pmask );
@@ -598,7 +698,7 @@
dump_varargs_get_socket_event_reply( req );
}
-static void dump_enable_socket_event_request( struct enable_socket_event_request *req )
+static void dump_enable_socket_event_request( const struct enable_socket_event_request *req )
{
fprintf( stderr, " handle=%d,", req->handle );
fprintf( stderr, " mask=%08x,", req->mask );
@@ -606,59 +706,59 @@
fprintf( stderr, " cstate=%08x", req->cstate );
}
-static void dump_alloc_console_request( struct alloc_console_request *req )
+static void dump_alloc_console_request( const struct alloc_console_request *req )
{
fprintf( stderr, " access=%08x,", req->access );
fprintf( stderr, " inherit=%d", req->inherit );
}
-static void dump_alloc_console_reply( struct alloc_console_request *req )
+static void dump_alloc_console_reply( const struct alloc_console_request *req )
{
fprintf( stderr, " handle_in=%d,", req->handle_in );
fprintf( stderr, " handle_out=%d", req->handle_out );
}
-static void dump_free_console_request( struct free_console_request *req )
+static void dump_free_console_request( const struct free_console_request *req )
{
fprintf( stderr, " dummy=%d", req->dummy );
}
-static void dump_open_console_request( struct open_console_request *req )
+static void dump_open_console_request( const struct open_console_request *req )
{
fprintf( stderr, " output=%d,", req->output );
fprintf( stderr, " access=%08x,", req->access );
fprintf( stderr, " inherit=%d", req->inherit );
}
-static void dump_open_console_reply( struct open_console_request *req )
+static void dump_open_console_reply( const struct open_console_request *req )
{
fprintf( stderr, " handle=%d", req->handle );
}
-static void dump_set_console_fd_request( struct set_console_fd_request *req )
+static void dump_set_console_fd_request( const struct set_console_fd_request *req )
{
fprintf( stderr, " handle=%d,", req->handle );
fprintf( stderr, " file_handle=%d,", req->file_handle );
fprintf( stderr, " pid=%d", req->pid );
}
-static void dump_get_console_mode_request( struct get_console_mode_request *req )
+static void dump_get_console_mode_request( const struct get_console_mode_request *req )
{
fprintf( stderr, " handle=%d", req->handle );
}
-static void dump_get_console_mode_reply( struct get_console_mode_request *req )
+static void dump_get_console_mode_reply( const struct get_console_mode_request *req )
{
fprintf( stderr, " mode=%d", req->mode );
}
-static void dump_set_console_mode_request( struct set_console_mode_request *req )
+static void dump_set_console_mode_request( const struct set_console_mode_request *req )
{
fprintf( stderr, " handle=%d,", req->handle );
fprintf( stderr, " mode=%d", req->mode );
}
-static void dump_set_console_info_request( struct set_console_info_request *req )
+static void dump_set_console_info_request( const struct set_console_info_request *req )
{
fprintf( stderr, " handle=%d,", req->handle );
fprintf( stderr, " mask=%d,", req->mask );
@@ -667,12 +767,12 @@
fprintf( stderr, " title=\"%s\"", req->title );
}
-static void dump_get_console_info_request( struct get_console_info_request *req )
+static void dump_get_console_info_request( const struct get_console_info_request *req )
{
fprintf( stderr, " handle=%d", req->handle );
}
-static void dump_get_console_info_reply( struct get_console_info_request *req )
+static void dump_get_console_info_reply( const struct get_console_info_request *req )
{
fprintf( stderr, " cursor_size=%d,", req->cursor_size );
fprintf( stderr, " cursor_visible=%d,", req->cursor_visible );
@@ -680,41 +780,41 @@
fprintf( stderr, " title=\"%s\"", req->title );
}
-static void dump_write_console_input_request( struct write_console_input_request *req )
+static void dump_write_console_input_request( const struct write_console_input_request *req )
{
fprintf( stderr, " handle=%d,", req->handle );
fprintf( stderr, " count=%d", req->count );
}
-static void dump_write_console_input_reply( struct write_console_input_request *req )
+static void dump_write_console_input_reply( const struct write_console_input_request *req )
{
fprintf( stderr, " written=%d", req->written );
}
-static void dump_read_console_input_request( struct read_console_input_request *req )
+static void dump_read_console_input_request( const struct read_console_input_request *req )
{
fprintf( stderr, " handle=%d,", req->handle );
fprintf( stderr, " count=%d,", req->count );
fprintf( stderr, " flush=%d", req->flush );
}
-static void dump_read_console_input_reply( struct read_console_input_request *req )
+static void dump_read_console_input_reply( const struct read_console_input_request *req )
{
fprintf( stderr, " read=%d", req->read );
}
-static void dump_create_change_notification_request( struct create_change_notification_request *req )
+static void dump_create_change_notification_request( const struct create_change_notification_request *req )
{
fprintf( stderr, " subtree=%d,", req->subtree );
fprintf( stderr, " filter=%d", req->filter );
}
-static void dump_create_change_notification_reply( struct create_change_notification_request *req )
+static void dump_create_change_notification_reply( const struct create_change_notification_request *req )
{
fprintf( stderr, " handle=%d", req->handle );
}
-static void dump_create_mapping_request( struct create_mapping_request *req )
+static void dump_create_mapping_request( const struct create_mapping_request *req )
{
fprintf( stderr, " size_high=%d,", req->size_high );
fprintf( stderr, " size_low=%d,", req->size_low );
@@ -725,12 +825,12 @@
dump_unicode_string( req->name );
}
-static void dump_create_mapping_reply( struct create_mapping_request *req )
+static void dump_create_mapping_reply( const struct create_mapping_request *req )
{
fprintf( stderr, " handle=%d", req->handle );
}
-static void dump_open_mapping_request( struct open_mapping_request *req )
+static void dump_open_mapping_request( const struct open_mapping_request *req )
{
fprintf( stderr, " access=%08x,", req->access );
fprintf( stderr, " inherit=%d,", req->inherit );
@@ -738,107 +838,109 @@
dump_unicode_string( req->name );
}
-static void dump_open_mapping_reply( struct open_mapping_request *req )
+static void dump_open_mapping_reply( const struct open_mapping_request *req )
{
fprintf( stderr, " handle=%d", req->handle );
}
-static void dump_get_mapping_info_request( struct get_mapping_info_request *req )
+static void dump_get_mapping_info_request( const struct get_mapping_info_request *req )
{
fprintf( stderr, " handle=%d", req->handle );
}
-static void dump_get_mapping_info_reply( struct get_mapping_info_request *req )
+static void dump_get_mapping_info_reply( const struct get_mapping_info_request *req )
{
fprintf( stderr, " size_high=%d,", req->size_high );
fprintf( stderr, " size_low=%d,", req->size_low );
fprintf( stderr, " protect=%d", req->protect );
}
-static void dump_create_device_request( struct create_device_request *req )
+static void dump_create_device_request( const struct create_device_request *req )
{
fprintf( stderr, " access=%08x,", req->access );
fprintf( stderr, " inherit=%d,", req->inherit );
fprintf( stderr, " id=%d", req->id );
}
-static void dump_create_device_reply( struct create_device_request *req )
+static void dump_create_device_reply( const struct create_device_request *req )
{
fprintf( stderr, " handle=%d", req->handle );
}
-static void dump_create_snapshot_request( struct create_snapshot_request *req )
+static void dump_create_snapshot_request( const struct create_snapshot_request *req )
{
fprintf( stderr, " inherit=%d,", req->inherit );
fprintf( stderr, " flags=%d", req->flags );
}
-static void dump_create_snapshot_reply( struct create_snapshot_request *req )
+static void dump_create_snapshot_reply( const struct create_snapshot_request *req )
{
fprintf( stderr, " handle=%d", req->handle );
}
-static void dump_next_process_request( struct next_process_request *req )
+static void dump_next_process_request( const struct next_process_request *req )
{
fprintf( stderr, " handle=%d,", req->handle );
fprintf( stderr, " reset=%d", req->reset );
}
-static void dump_next_process_reply( struct next_process_request *req )
+static void dump_next_process_reply( const struct next_process_request *req )
{
fprintf( stderr, " pid=%p,", req->pid );
fprintf( stderr, " threads=%d,", req->threads );
fprintf( stderr, " priority=%d", req->priority );
}
-static void dump_wait_debug_event_request( struct wait_debug_event_request *req )
+static void dump_wait_debug_event_request( const struct wait_debug_event_request *req )
{
fprintf( stderr, " timeout=%d", req->timeout );
}
-static void dump_wait_debug_event_reply( struct wait_debug_event_request *req )
+static void dump_wait_debug_event_reply( const struct wait_debug_event_request *req )
{
- fprintf( stderr, " code=%d,", req->code );
fprintf( stderr, " pid=%p,", req->pid );
- fprintf( stderr, " tid=%p", req->tid );
+ fprintf( stderr, " tid=%p,", req->tid );
+ fprintf( stderr, " event=" );
+ dump_debug_event_t( &req->event );
}
-static void dump_send_debug_event_request( struct send_debug_event_request *req )
+static void dump_send_debug_event_request( const struct send_debug_event_request *req )
{
- fprintf( stderr, " code=%d", req->code );
+ fprintf( stderr, " event=" );
+ dump_debug_event_t( &req->event );
}
-static void dump_send_debug_event_reply( struct send_debug_event_request *req )
+static void dump_send_debug_event_reply( const struct send_debug_event_request *req )
{
fprintf( stderr, " status=%d", req->status );
}
-static void dump_continue_debug_event_request( struct continue_debug_event_request *req )
+static void dump_continue_debug_event_request( const struct continue_debug_event_request *req )
{
fprintf( stderr, " pid=%p,", req->pid );
fprintf( stderr, " tid=%p,", req->tid );
fprintf( stderr, " status=%d", req->status );
}
-static void dump_debug_process_request( struct debug_process_request *req )
+static void dump_debug_process_request( const struct debug_process_request *req )
{
fprintf( stderr, " pid=%p", req->pid );
}
-static void dump_read_process_memory_request( struct read_process_memory_request *req )
+static void dump_read_process_memory_request( const struct read_process_memory_request *req )
{
fprintf( stderr, " handle=%d,", req->handle );
fprintf( stderr, " addr=%p,", req->addr );
fprintf( stderr, " len=%d", req->len );
}
-static void dump_read_process_memory_reply( struct read_process_memory_request *req )
+static void dump_read_process_memory_reply( const struct read_process_memory_request *req )
{
fprintf( stderr, " data=" );
dump_varargs_read_process_memory_reply( req );
}
-static void dump_write_process_memory_request( struct write_process_memory_request *req )
+static void dump_write_process_memory_request( const struct write_process_memory_request *req )
{
fprintf( stderr, " handle=%d,", req->handle );
fprintf( stderr, " addr=%p,", req->addr );
@@ -849,72 +951,72 @@
dump_varargs_write_process_memory_request( req );
}
-static void dump_create_key_request( struct create_key_request *req )
+static void dump_create_key_request( const struct create_key_request *req )
{
fprintf( stderr, " parent=%d,", req->parent );
fprintf( stderr, " access=%08x,", req->access );
fprintf( stderr, " options=%08x,", req->options );
fprintf( stderr, " modif=%ld,", req->modif );
fprintf( stderr, " name=" );
- dump_unicode_string( req->name );
+ dump_path_t( &req->name );
fprintf( stderr, "," );
fprintf( stderr, " class=" );
dump_unicode_string( req->class );
}
-static void dump_create_key_reply( struct create_key_request *req )
+static void dump_create_key_reply( const struct create_key_request *req )
{
fprintf( stderr, " hkey=%d,", req->hkey );
fprintf( stderr, " created=%d", req->created );
}
-static void dump_open_key_request( struct open_key_request *req )
+static void dump_open_key_request( const struct open_key_request *req )
{
fprintf( stderr, " parent=%d,", req->parent );
fprintf( stderr, " access=%08x,", req->access );
fprintf( stderr, " name=" );
- dump_unicode_string( req->name );
+ dump_path_t( &req->name );
}
-static void dump_open_key_reply( struct open_key_request *req )
+static void dump_open_key_reply( const struct open_key_request *req )
{
fprintf( stderr, " hkey=%d", req->hkey );
}
-static void dump_delete_key_request( struct delete_key_request *req )
+static void dump_delete_key_request( const struct delete_key_request *req )
{
fprintf( stderr, " hkey=%d,", req->hkey );
fprintf( stderr, " name=" );
- dump_unicode_string( req->name );
+ dump_path_t( &req->name );
}
-static void dump_close_key_request( struct close_key_request *req )
+static void dump_close_key_request( const struct close_key_request *req )
{
fprintf( stderr, " hkey=%d", req->hkey );
}
-static void dump_enum_key_request( struct enum_key_request *req )
+static void dump_enum_key_request( const struct enum_key_request *req )
{
fprintf( stderr, " hkey=%d,", req->hkey );
fprintf( stderr, " index=%d", req->index );
}
-static void dump_enum_key_reply( struct enum_key_request *req )
+static void dump_enum_key_reply( const struct enum_key_request *req )
{
fprintf( stderr, " modif=%ld,", req->modif );
fprintf( stderr, " name=" );
- dump_unicode_string( req->name );
+ dump_path_t( &req->name );
fprintf( stderr, "," );
fprintf( stderr, " class=" );
dump_unicode_string( req->class );
}
-static void dump_query_key_info_request( struct query_key_info_request *req )
+static void dump_query_key_info_request( const struct query_key_info_request *req )
{
fprintf( stderr, " hkey=%d", req->hkey );
}
-static void dump_query_key_info_reply( struct query_key_info_request *req )
+static void dump_query_key_info_reply( const struct query_key_info_request *req )
{
fprintf( stderr, " subkeys=%d,", req->subkeys );
fprintf( stderr, " max_subkey=%d,", req->max_subkey );
@@ -924,32 +1026,32 @@
fprintf( stderr, " max_data=%d,", req->max_data );
fprintf( stderr, " modif=%ld,", req->modif );
fprintf( stderr, " name=" );
- dump_unicode_string( req->name );
+ dump_path_t( &req->name );
fprintf( stderr, "," );
fprintf( stderr, " class=" );
dump_unicode_string( req->class );
}
-static void dump_set_key_value_request( struct set_key_value_request *req )
+static void dump_set_key_value_request( const struct set_key_value_request *req )
{
fprintf( stderr, " hkey=%d,", req->hkey );
fprintf( stderr, " type=%d,", req->type );
fprintf( stderr, " len=%d,", req->len );
fprintf( stderr, " name=" );
- dump_unicode_string( req->name );
+ dump_path_t( &req->name );
fprintf( stderr, "," );
fprintf( stderr, " data=" );
dump_varargs_set_key_value_request( req );
}
-static void dump_get_key_value_request( struct get_key_value_request *req )
+static void dump_get_key_value_request( const struct get_key_value_request *req )
{
fprintf( stderr, " hkey=%d,", req->hkey );
fprintf( stderr, " name=" );
dump_unicode_string( req->name );
}
-static void dump_get_key_value_reply( struct get_key_value_request *req )
+static void dump_get_key_value_reply( const struct get_key_value_request *req )
{
fprintf( stderr, " type=%d,", req->type );
fprintf( stderr, " len=%d,", req->len );
@@ -957,52 +1059,52 @@
dump_varargs_get_key_value_reply( req );
}
-static void dump_enum_key_value_request( struct enum_key_value_request *req )
+static void dump_enum_key_value_request( const struct enum_key_value_request *req )
{
fprintf( stderr, " hkey=%d,", req->hkey );
fprintf( stderr, " index=%d", req->index );
}
-static void dump_enum_key_value_reply( struct enum_key_value_request *req )
+static void dump_enum_key_value_reply( const struct enum_key_value_request *req )
{
fprintf( stderr, " type=%d,", req->type );
fprintf( stderr, " len=%d,", req->len );
fprintf( stderr, " name=" );
- dump_unicode_string( req->name );
+ dump_path_t( &req->name );
fprintf( stderr, "," );
fprintf( stderr, " data=" );
dump_varargs_enum_key_value_reply( req );
}
-static void dump_delete_key_value_request( struct delete_key_value_request *req )
+static void dump_delete_key_value_request( const struct delete_key_value_request *req )
{
fprintf( stderr, " hkey=%d,", req->hkey );
fprintf( stderr, " name=" );
- dump_unicode_string( req->name );
+ dump_path_t( &req->name );
}
-static void dump_load_registry_request( struct load_registry_request *req )
+static void dump_load_registry_request( const struct load_registry_request *req )
{
fprintf( stderr, " hkey=%d,", req->hkey );
fprintf( stderr, " file=%d,", req->file );
fprintf( stderr, " name=" );
- dump_unicode_string( req->name );
+ dump_path_t( &req->name );
}
-static void dump_save_registry_request( struct save_registry_request *req )
+static void dump_save_registry_request( const struct save_registry_request *req )
{
fprintf( stderr, " hkey=%d,", req->hkey );
fprintf( stderr, " file=%d", req->file );
}
-static void dump_set_registry_levels_request( struct set_registry_levels_request *req )
+static void dump_set_registry_levels_request( const struct set_registry_levels_request *req )
{
fprintf( stderr, " current=%d,", req->current );
fprintf( stderr, " saving=%d,", req->saving );
fprintf( stderr, " version=%d", req->version );
}
-static void dump_create_timer_request( struct create_timer_request *req )
+static void dump_create_timer_request( const struct create_timer_request *req )
{
fprintf( stderr, " inherit=%d,", req->inherit );
fprintf( stderr, " manual=%d,", req->manual );
@@ -1010,12 +1112,12 @@
dump_unicode_string( req->name );
}
-static void dump_create_timer_reply( struct create_timer_request *req )
+static void dump_create_timer_reply( const struct create_timer_request *req )
{
fprintf( stderr, " handle=%d", req->handle );
}
-static void dump_open_timer_request( struct open_timer_request *req )
+static void dump_open_timer_request( const struct open_timer_request *req )
{
fprintf( stderr, " access=%08x,", req->access );
fprintf( stderr, " inherit=%d,", req->inherit );
@@ -1023,12 +1125,12 @@
dump_unicode_string( req->name );
}
-static void dump_open_timer_reply( struct open_timer_request *req )
+static void dump_open_timer_reply( const struct open_timer_request *req )
{
fprintf( stderr, " handle=%d", req->handle );
}
-static void dump_set_timer_request( struct set_timer_request *req )
+static void dump_set_timer_request( const struct set_timer_request *req )
{
fprintf( stderr, " handle=%d,", req->handle );
fprintf( stderr, " sec=%d,", req->sec );
@@ -1038,11 +1140,31 @@
fprintf( stderr, " arg=%p", req->arg );
}
-static void dump_cancel_timer_request( struct cancel_timer_request *req )
+static void dump_cancel_timer_request( const struct cancel_timer_request *req )
{
fprintf( stderr, " handle=%d", req->handle );
}
+static void dump_get_thread_context_request( const struct get_thread_context_request *req )
+{
+ fprintf( stderr, " handle=%d,", req->handle );
+ fprintf( stderr, " flags=%08x", req->flags );
+}
+
+static void dump_get_thread_context_reply( const struct get_thread_context_request *req )
+{
+ fprintf( stderr, " context=" );
+ dump_context( &req->context );
+}
+
+static void dump_set_thread_context_request( const struct set_thread_context_request *req )
+{
+ fprintf( stderr, " handle=%d,", req->handle );
+ fprintf( stderr, " flags=%08x,", req->flags );
+ fprintf( stderr, " context=" );
+ dump_context( &req->context );
+}
+
static const dump_func req_dumpers[REQ_NB_REQUESTS] = {
(dump_func)dump_new_process_request,
(dump_func)dump_new_thread_request,
@@ -1134,6 +1256,8 @@
(dump_func)dump_open_timer_request,
(dump_func)dump_set_timer_request,
(dump_func)dump_cancel_timer_request,
+ (dump_func)dump_get_thread_context_request,
+ (dump_func)dump_set_thread_context_request,
};
static const dump_func reply_dumpers[REQ_NB_REQUESTS] = {
@@ -1227,6 +1351,8 @@
(dump_func)dump_open_timer_reply,
(dump_func)0,
(dump_func)0,
+ (dump_func)dump_get_thread_context_reply,
+ (dump_func)0,
};
static const char * const req_names[REQ_NB_REQUESTS] = {
@@ -1320,6 +1446,8 @@
"open_timer",
"set_timer",
"cancel_timer",
+ "get_thread_context",
+ "set_thread_context",
};
/* ### make_requests end ### */
diff --git a/tools/make_requests b/tools/make_requests
index 62ff329..9a8e6c9 100755
--- a/tools/make_requests
+++ b/tools/make_requests
@@ -8,15 +8,17 @@
%formats =
(
- "int" => "%d",
- "long" => "%ld",
- "char" => "%c",
- "unsigned int" => "%08x",
- "void*" => "%p",
- "time_t" => "%ld",
- "path_t" => "&dump_unicode_string",
- "char[1]" => "\\\"%s\\\"",
- "WCHAR[1]" => "&dump_unicode_string"
+ "int" => "%d",
+ "long" => "%ld",
+ "char" => "%c",
+ "unsigned int" => "%08x",
+ "void*" => "%p",
+ "time_t" => "%ld",
+ "path_t" => "&dump_path_t",
+ "debug_event_t" => "&dump_debug_event_t",
+ "CONTEXT" => "&dump_context",
+ "char[1]" => "\\\"%s\\\"",
+ "WCHAR[1]" => "&dump_unicode_string"
);
my @requests = ();
@@ -123,7 +125,7 @@
{
my $name = shift;
my $req = shift;
- push @trace_lines, "static void dump_${name}_$req( struct ${name}_request *req )\n{\n";
+ push @trace_lines, "static void dump_${name}_$req( const struct ${name}_request *req )\n{\n";
while ($#_ >= 0)
{
my $type = shift;
@@ -134,7 +136,8 @@
{
my $func = $1;
push @trace_lines, " fprintf( stderr, \" $var=\" );\n";
- push @trace_lines, " $func( req->$var );\n";
+ if ($type =~ /[1]/) { push @trace_lines, " $func( req->$var );\n"; }
+ else { push @trace_lines, " $func( &req->$var );\n"; }
push @trace_lines, " fprintf( stderr, \",\" );\n" if ($#_ > 0);
}
else