Converted a lot of server requests to the new exception handling
mechanism.
diff --git a/server/trace.c b/server/trace.c
index c6b5e91..89b0998 100644
--- a/server/trace.c
+++ b/server/trace.c
@@ -10,23 +10,14 @@
#include <sys/uio.h>
#include "winsock2.h"
#include "winnt.h"
+#include "winbase.h"
+#include "wincon.h"
#include "request.h"
#include "unicode.h"
/* utility functions */
-static void dump_ints( const int *ptr, int len )
-{
- fputc( '{', stderr );
- while (len > 0)
- {
- fprintf( stderr, "%d", *ptr++ );
- if (--len) fputc( ',', stderr );
- }
- fputc( '}', stderr );
-}
-
static void dump_uints( const int *ptr, int len )
{
fputc( '{', stderr );
@@ -68,25 +59,7 @@
dump_unicode_string( req, *path );
}
-static void dump_context( const void *req, 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_exc_record( const void *req, const EXCEPTION_RECORD *rec )
+static void dump_exc_record( const EXCEPTION_RECORD *rec )
{
int i;
fprintf( stderr, "{code=%lx,flags=%lx,rec=%p,addr=%p,params={",
@@ -128,6 +101,11 @@
fputc( '}', stderr );
}
+static void dump_varargs_string( const void *ptr, size_t len )
+{
+ fprintf( stderr, "\"%.*s\"", (int)len, (char *)ptr );
+}
+
static void dump_varargs_unicode_str( const void *ptr, size_t len )
{
fprintf( stderr, "L\"" );
@@ -135,15 +113,48 @@
fputc( '\"', stderr );
}
+static void dump_varargs_context( const void *ptr, size_t len )
+{
+ const CONTEXT *context = ptr;
+#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_varargs_exc_event( const void *ptr, size_t len )
+{
+ fprintf( stderr, "{context=" );
+ dump_varargs_context( ptr, sizeof(CONTEXT) );
+ fprintf( stderr, ",rec=" );
+ dump_exc_record( (EXCEPTION_RECORD *)((CONTEXT *)ptr + 1) );
+ fputc( '}', stderr );
+}
+
static void dump_varargs_debug_event( const void *ptr, size_t len )
{
const debug_event_t *event = ptr;
+ if (!len)
+ {
+ fprintf( stderr, "{}" );
+ return;
+ }
switch(event->code)
{
case EXCEPTION_DEBUG_EVENT:
fprintf( stderr, "{exception," );
- dump_exc_record( ptr, &event->info.exception.record );
+ dump_exc_record( &event->info.exception.record );
fprintf( stderr, ",first=%d}", event->info.exception.first );
break;
case CREATE_THREAD_DEBUG_EVENT:
@@ -193,13 +204,23 @@
}
}
-/* dumping for functions for requests that have a variable part */
-
-static void dump_varargs_get_socket_event_reply( const struct get_socket_event_request *req )
+static void dump_varargs_input_records( const void *ptr, size_t len )
{
- dump_ints( req->errors, FD_MAX_EVENTS );
+ const INPUT_RECORD *rec = ptr;
+ len /= sizeof(*rec);
+
+ fputc( '{', stderr );
+ while (len > 0)
+ {
+ fprintf( stderr, "{%04x,...}", rec->EventType );
+ rec++;
+ if (--len) fputc( ',', stderr );
+ }
+ fputc( '}', stderr );
}
+/* dumping for functions for requests that have a variable part */
+
static void dump_varargs_read_process_memory_reply( const struct read_process_memory_request *req )
{
int count = min( req->len, get_req_size( req, req->data, sizeof(int) ));
@@ -247,7 +268,7 @@
fprintf( stderr, " cmd_show=%d,", req->cmd_show );
fprintf( stderr, " alloc_fd=%d,", req->alloc_fd );
fprintf( stderr, " filename=" );
- dump_string( req, req->filename );
+ dump_varargs_string( get_req_data(req), get_req_data_size(req) );
}
static void dump_wait_process_request( const struct wait_process_request *req )
@@ -300,7 +321,7 @@
fprintf( stderr, " hstderr=%d,", req->hstderr );
fprintf( stderr, " cmd_show=%d,", req->cmd_show );
fprintf( stderr, " filename=" );
- dump_string( req, req->filename );
+ dump_varargs_string( get_req_data(req), get_req_data_size(req) );
}
static void dump_init_process_done_request( const struct init_process_done_request *req )
@@ -627,8 +648,8 @@
fprintf( stderr, " sharing=%08x,", req->sharing );
fprintf( stderr, " create=%d,", req->create );
fprintf( stderr, " attrs=%08x,", req->attrs );
- fprintf( stderr, " name=" );
- dump_string( req, req->name );
+ fprintf( stderr, " filename=" );
+ dump_varargs_string( get_req_data(req), get_req_data_size(req) );
}
static void dump_create_file_reply( const struct create_file_request *req )
@@ -782,7 +803,7 @@
fprintf( stderr, " pmask=%08x,", req->pmask );
fprintf( stderr, " state=%08x,", req->state );
fprintf( stderr, " errors=" );
- dump_varargs_get_socket_event_reply( req );
+ dump_varargs_ints( get_req_data(req), get_req_data_size(req) );
}
static void dump_enable_socket_event_request( const struct enable_socket_event_request *req )
@@ -851,7 +872,7 @@
fprintf( stderr, " cursor_size=%d,", req->cursor_size );
fprintf( stderr, " cursor_visible=%d,", req->cursor_visible );
fprintf( stderr, " title=" );
- dump_string( req, req->title );
+ dump_varargs_string( get_req_data(req), get_req_data_size(req) );
}
static void dump_get_console_info_request( const struct get_console_info_request *req )
@@ -865,13 +886,14 @@
fprintf( stderr, " cursor_visible=%d,", req->cursor_visible );
fprintf( stderr, " pid=%d,", req->pid );
fprintf( stderr, " title=" );
- dump_string( req, req->title );
+ dump_varargs_string( get_req_data(req), get_req_data_size(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 );
+ fprintf( stderr, " rec=" );
+ dump_varargs_input_records( get_req_data(req), get_req_data_size(req) );
}
static void dump_write_console_input_reply( const struct write_console_input_request *req )
@@ -882,13 +904,14 @@
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( const struct read_console_input_request *req )
{
- fprintf( stderr, " read=%d", req->read );
+ fprintf( stderr, " read=%d,", req->read );
+ fprintf( stderr, " rec=" );
+ dump_varargs_input_records( get_req_data(req), get_req_data_size(req) );
}
static void dump_create_change_notification_request( const struct create_change_notification_request *req )
@@ -1027,17 +1050,16 @@
static void dump_exception_event_request( const struct exception_event_request *req )
{
- fprintf( stderr, " record=" );
- dump_exc_record( req, &req->record );
- fprintf( stderr, "," );
fprintf( stderr, " first=%d,", req->first );
- fprintf( stderr, " context=" );
- dump_context( req, &req->context );
+ fprintf( stderr, " record=" );
+ dump_varargs_exc_event( get_req_data(req), get_req_data_size(req) );
}
static void dump_exception_event_reply( const struct exception_event_request *req )
{
- fprintf( stderr, " status=%d", req->status );
+ fprintf( stderr, " status=%d,", req->status );
+ fprintf( stderr, " context=" );
+ dump_varargs_context( get_req_data(req), get_req_data_size(req) );
}
static void dump_output_debug_string_request( const struct output_debug_string_request *req )
@@ -1297,7 +1319,7 @@
static void dump_get_thread_context_reply( const struct get_thread_context_request *req )
{
fprintf( stderr, " context=" );
- dump_context( req, &req->context );
+ dump_varargs_context( get_req_data(req), get_req_data_size(req) );
}
static void dump_set_thread_context_request( const struct set_thread_context_request *req )
@@ -1305,7 +1327,7 @@
fprintf( stderr, " handle=%d,", req->handle );
fprintf( stderr, " flags=%08x,", req->flags );
fprintf( stderr, " context=" );
- dump_context( req, &req->context );
+ dump_varargs_context( get_req_data(req), get_req_data_size(req) );
}
static void dump_get_selector_entry_request( const struct get_selector_entry_request *req )