server: Simplify the debug_event_t structure.
diff --git a/server/debugger.c b/server/debugger.c
index d8d425d..3201d88 100644
--- a/server/debugger.c
+++ b/server/debugger.c
@@ -114,7 +114,8 @@
 
 static int fill_exception_event( struct debug_event *event, const void *arg )
 {
-    memcpy( &event->data.info.exception, arg, sizeof(event->data.info.exception) );
+    const debug_event_t *data = arg;
+    event->data.exception = data->exception;
     return 1;
 }
 
@@ -127,9 +128,9 @@
 
     /* documented: THREAD_GET_CONTEXT | THREAD_SET_CONTEXT | THREAD_SUSPEND_RESUME */
     if (!(handle = alloc_handle( debugger, thread, THREAD_ALL_ACCESS, 0 ))) return 0;
-    event->data.info.create_thread.handle = handle;
-    event->data.info.create_thread.teb    = thread->teb;
-    if (entry) event->data.info.create_thread.start = *entry;
+    event->data.create_thread.handle = handle;
+    event->data.create_thread.teb    = thread->teb;
+    if (entry) event->data.create_thread.start = *entry;
     return 1;
 }
 
@@ -144,47 +145,47 @@
 
     /* documented: PROCESS_VM_READ | PROCESS_VM_WRITE */
     if (!(handle = alloc_handle( debugger, process, PROCESS_ALL_ACCESS, 0 ))) return 0;
-    event->data.info.create_process.process = handle;
+    event->data.create_process.process = handle;
 
     /* documented: THREAD_GET_CONTEXT | THREAD_SET_CONTEXT | THREAD_SUSPEND_RESUME */
     if (!(handle = alloc_handle( debugger, thread, THREAD_ALL_ACCESS, 0 )))
     {
-        close_handle( debugger, event->data.info.create_process.process );
+        close_handle( debugger, event->data.create_process.process );
         return 0;
     }
-    event->data.info.create_process.thread = handle;
+    event->data.create_process.thread = handle;
 
     handle = 0;
     if (exe_module->file &&
         /* the doc says write access too, but this doesn't seem a good idea */
         !(handle = alloc_handle( debugger, exe_module->file, GENERIC_READ, 0 )))
     {
-        close_handle( debugger, event->data.info.create_process.process );
-        close_handle( debugger, event->data.info.create_process.thread );
+        close_handle( debugger, event->data.create_process.process );
+        close_handle( debugger, event->data.create_process.thread );
         return 0;
     }
-    event->data.info.create_process.file       = handle;
-    event->data.info.create_process.teb        = thread->teb;
-    event->data.info.create_process.base       = exe_module->base;
-    event->data.info.create_process.start      = *entry;
-    event->data.info.create_process.dbg_offset = exe_module->dbg_offset;
-    event->data.info.create_process.dbg_size   = exe_module->dbg_size;
-    event->data.info.create_process.name       = exe_module->name;
-    event->data.info.create_process.unicode    = 1;
+    event->data.create_process.file       = handle;
+    event->data.create_process.teb        = thread->teb;
+    event->data.create_process.base       = exe_module->base;
+    event->data.create_process.start      = *entry;
+    event->data.create_process.dbg_offset = exe_module->dbg_offset;
+    event->data.create_process.dbg_size   = exe_module->dbg_size;
+    event->data.create_process.name       = exe_module->name;
+    event->data.create_process.unicode    = 1;
     return 1;
 }
 
 static int fill_exit_thread_event( struct debug_event *event, const void *arg )
 {
     const struct thread *thread = arg;
-    event->data.info.exit.exit_code = thread->exit_code;
+    event->data.exit.exit_code = thread->exit_code;
     return 1;
 }
 
 static int fill_exit_process_event( struct debug_event *event, const void *arg )
 {
     const struct process *process = arg;
-    event->data.info.exit.exit_code = process->exit_code;
+    event->data.exit.exit_code = process->exit_code;
     return 1;
 }
 
@@ -196,26 +197,26 @@
 
     if (dll->file && !(handle = alloc_handle( debugger, dll->file, GENERIC_READ, 0 )))
         return 0;
-    event->data.info.load_dll.handle     = handle;
-    event->data.info.load_dll.base       = dll->base;
-    event->data.info.load_dll.dbg_offset = dll->dbg_offset;
-    event->data.info.load_dll.dbg_size   = dll->dbg_size;
-    event->data.info.load_dll.name       = dll->name;
-    event->data.info.load_dll.unicode    = 1;
+    event->data.load_dll.handle     = handle;
+    event->data.load_dll.base       = dll->base;
+    event->data.load_dll.dbg_offset = dll->dbg_offset;
+    event->data.load_dll.dbg_size   = dll->dbg_size;
+    event->data.load_dll.name       = dll->name;
+    event->data.load_dll.unicode    = 1;
     return 1;
 }
 
 static int fill_unload_dll_event( struct debug_event *event, const void *arg )
 {
     const mod_handle_t *base = arg;
-    event->data.info.unload_dll.base = *base;
+    event->data.unload_dll.base = *base;
     return 1;
 }
 
 static int fill_output_debug_string_event( struct debug_event *event, const void *arg )
 {
-    const struct debug_event_output_string *data = arg;
-    event->data.info.output_string = *data;
+    const debug_event_t *data = arg;
+    event->data.output_string = data->output_string;
     return 1;
 }
 
@@ -297,17 +298,17 @@
         switch(event->data.code)
         {
         case CREATE_THREAD_DEBUG_EVENT:
-            close_handle( debugger, event->data.info.create_thread.handle );
+            close_handle( debugger, event->data.create_thread.handle );
             break;
         case CREATE_PROCESS_DEBUG_EVENT:
-            if (event->data.info.create_process.file)
-                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 );
+            if (event->data.create_process.file)
+                close_handle( debugger, event->data.create_process.file );
+            close_handle( debugger, event->data.create_process.thread );
+            close_handle( debugger, event->data.create_process.process );
             break;
         case LOAD_DLL_DEBUG_EVENT:
-            if (event->data.info.load_dll.handle)
-                close_handle( debugger, event->data.info.load_dll.handle );
+            if (event->data.load_dll.handle)
+                close_handle( debugger, event->data.load_dll.handle );
             break;
         }
     }
@@ -390,7 +391,6 @@
     event->sender    = (struct thread *)grab_object( thread );
     event->debugger  = (struct thread *)grab_object( debugger );
     memset( &event->data, 0, sizeof(event->data) );
-    event->data.code = code;
 
     if (!fill_debug_event[code-1]( event, arg ))
     {
@@ -398,6 +398,7 @@
         release_object( event );
         return NULL;
     }
+    event->data.code = code;
     if (context)
     {
         memcpy( &event->context, context, sizeof(event->context) );
@@ -635,7 +636,7 @@
     reply->handle = 0;
     if (current->process->debugger)
     {
-        struct debug_event_exception data;
+        debug_event_t data;
         struct debug_event *event;
         const CONTEXT *context = get_req_data();
         const EXCEPTION_RECORD *rec = (const EXCEPTION_RECORD *)(context + 1);
@@ -645,8 +646,8 @@
             set_error( STATUS_INVALID_PARAMETER );
             return;
         }
-        data.record = *rec;
-        data.first  = req->first;
+        data.exception.record = *rec;
+        data.exception.first  = req->first;
         if ((event = alloc_debug_event( current, EXCEPTION_DEBUG_EVENT, &data, context )))
         {
             if ((reply->handle = alloc_handle( current->process, event, SYNCHRONIZE, 0 )))
@@ -686,11 +687,11 @@
 /* send an output string to the debugger */
 DECL_HANDLER(output_debug_string)
 {
-    struct debug_event_output_string data;
+    debug_event_t data;
 
-    data.string  = req->string;
-    data.unicode = req->unicode;
-    data.length  = req->length;
+    data.output_string.string  = req->string;
+    data.output_string.unicode = req->unicode;
+    data.output_string.length  = req->length;
     generate_debug_event( current, OUTPUT_DEBUG_STRING_EVENT, &data );
 }
 
diff --git a/server/protocol.def b/server/protocol.def
index 737714f..d13ea52 100644
--- a/server/protocol.def
+++ b/server/protocol.def
@@ -69,76 +69,71 @@
 #define LAST_USER_HANDLE  0xffef  /* last possible value for low word of user handle */
 
 
-/* definitions of the event data depending on the event code */
-struct debug_event_exception
-{
-    EXCEPTION_RECORD record;   /* exception record */
-    int              first;    /* first chance exception? */
-};
-struct debug_event_create_thread
-{
-    obj_handle_t handle;     /* handle to the new thread */
-    client_ptr_t teb;        /* thread teb (in debugged process address space) */
-    client_ptr_t start;      /* thread startup routine */
-};
-struct debug_event_create_process
-{
-    obj_handle_t file;       /* handle to the process exe file */
-    obj_handle_t process;    /* handle to the new process */
-    obj_handle_t thread;     /* handle to the new thread */
-    mod_handle_t base;       /* base of executable image */
-    int          dbg_offset; /* offset of debug info in file */
-    int          dbg_size;   /* size of debug info */
-    client_ptr_t teb;        /* thread teb (in debugged process address space) */
-    client_ptr_t start;      /* thread startup routine */
-    client_ptr_t 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
-{
-    obj_handle_t handle;     /* file handle for the dll */
-    mod_handle_t base;       /* base address of the dll */
-    int          dbg_offset; /* offset of debug info in file */
-    int          dbg_size;   /* size of debug info */
-    client_ptr_t name;       /* image name (optional) */
-    int          unicode;    /* is it Unicode? */
-};
-struct debug_event_unload_dll
-{
-    mod_handle_t base;       /* base address of the dll */
-};
-struct debug_event_output_string
-{
-    client_ptr_t string;     /* string to display (in debugged process address space) */
-    int          unicode;    /* is it Unicode? */
-    data_size_t  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
+typedef union
 {
-    int                      code;   /* event code */
-    union debug_event_data   info;   /* event information */
+    int code;   /* event code */
+    struct
+    {
+        int              code;     /* EXCEPTION_DEBUG_EVENT */
+        int              first;    /* first chance exception? */
+        EXCEPTION_RECORD record;   /* exception record */
+    } exception;
+    struct
+    {
+        int          code;       /* CREATE_THREAD_DEBUG_EVENT */
+        obj_handle_t handle;     /* handle to the new thread */
+        client_ptr_t teb;        /* thread teb (in debugged process address space) */
+        client_ptr_t start;      /* thread startup routine */
+    } create_thread;
+    struct
+    {
+        int          code;       /* CREATE_PROCESS_DEBUG_EVENT */
+        obj_handle_t file;       /* handle to the process exe file */
+        obj_handle_t process;    /* handle to the new process */
+        obj_handle_t thread;     /* handle to the new thread */
+        mod_handle_t base;       /* base of executable image */
+        int          dbg_offset; /* offset of debug info in file */
+        int          dbg_size;   /* size of debug info */
+        client_ptr_t teb;        /* thread teb (in debugged process address space) */
+        client_ptr_t start;      /* thread startup routine */
+        client_ptr_t name;       /* image name (optional) */
+        int          unicode;    /* is it Unicode? */
+    } create_process;
+    struct
+    {
+        int          code;       /* EXIT_THREAD_DEBUG_EVENT/EXIT_PROCESS_DEBUG_EVENT */
+        int          exit_code;  /* thread or process exit code */
+    } exit;
+    struct
+    {
+        int          code;       /* LOAD_DLL_DEBUG_EVENT */
+        obj_handle_t handle;     /* file handle for the dll */
+        mod_handle_t base;       /* base address of the dll */
+        int          dbg_offset; /* offset of debug info in file */
+        int          dbg_size;   /* size of debug info */
+        client_ptr_t name;       /* image name (optional) */
+        int          unicode;    /* is it Unicode? */
+    } load_dll;
+    struct
+    {
+        int          code;       /* UNLOAD_DLL_DEBUG_EVENT */
+        int          __pad;
+        mod_handle_t base;       /* base address of the dll */
+    } unload_dll;
+    struct
+    {
+        int          code;       /* OUTPUT_DEBUG_STRING_EVENT */
+        int          unicode;    /* is it Unicode? */
+        client_ptr_t string;     /* string to display (in debugged process address space) */
+        data_size_t  length;     /* string length */
+    } output_string;
+    struct
+    {
+        int          code;       /* RIP_EVENT */
+        int          error;      /* ??? */
+        int          type;       /* ??? */
+    } rip_info;
 } debug_event_t;
 
 /* structure used in sending an fd from client to server */
diff --git a/server/thread.c b/server/thread.c
index aea0c70..6b58785 100644
--- a/server/thread.c
+++ b/server/thread.c
@@ -932,16 +932,16 @@
 /* trigger a breakpoint event in a given thread */
 void break_thread( struct thread *thread )
 {
-    struct debug_event_exception data;
+    debug_event_t data;
 
     assert( thread->context );
 
-    data.record.ExceptionCode    = STATUS_BREAKPOINT;
-    data.record.ExceptionFlags   = EXCEPTION_CONTINUABLE;
-    data.record.ExceptionRecord  = NULL;
-    data.record.ExceptionAddress = get_context_ip( thread->context );
-    data.record.NumberParameters = 0;
-    data.first = 1;
+    data.exception.record.ExceptionCode    = STATUS_BREAKPOINT;
+    data.exception.record.ExceptionFlags   = EXCEPTION_CONTINUABLE;
+    data.exception.record.ExceptionRecord  = NULL;
+    data.exception.record.ExceptionAddress = get_context_ip( thread->context );
+    data.exception.record.NumberParameters = 0;
+    data.exception.first = 1;
     generate_debug_event( thread, EXCEPTION_DEBUG_EVENT, &data );
     thread->debug_break = 0;
 }
diff --git a/server/trace.c b/server/trace.c
index 557880d..e9af47b 100644
--- a/server/trace.c
+++ b/server/trace.c
@@ -495,58 +495,58 @@
     {
     case EXCEPTION_DEBUG_EVENT:
         fprintf( stderr, "{exception," );
-        dump_exc_record( &event->info.exception.record );
-        fprintf( stderr, ",first=%d}", event->info.exception.first );
+        dump_exc_record( &event->exception.record );
+        fprintf( stderr, ",first=%d}", event->exception.first );
         break;
     case CREATE_THREAD_DEBUG_EVENT:
-        fprintf( stderr, "{create_thread,thread=%04x,teb=", event->info.create_thread.handle );
-        dump_uint64( &event->info.create_thread.teb );
+        fprintf( stderr, "{create_thread,thread=%04x,teb=", event->create_thread.handle );
+        dump_uint64( &event->create_thread.teb );
         fprintf( stderr, ",start=" );
-        dump_uint64( &event->info.create_thread.start );
+        dump_uint64( &event->create_thread.start );
         fputc( '}', stderr );
         break;
     case CREATE_PROCESS_DEBUG_EVENT:
         fprintf( stderr, "{create_process,file=%04x,process=%04x,thread=%04x,base=",
-                 event->info.create_process.file, event->info.create_process.process,
-                 event->info.create_process.thread );
-        dump_uint64( &event->info.create_process.base );
+                 event->create_process.file, event->create_process.process,
+                 event->create_process.thread );
+        dump_uint64( &event->create_process.base );
         fprintf( stderr, ",offset=%d,size=%d,teb=",
-                 event->info.create_process.dbg_offset, event->info.create_process.dbg_size );
-        dump_uint64( &event->info.create_process.teb );
+                 event->create_process.dbg_offset, event->create_process.dbg_size );
+        dump_uint64( &event->create_process.teb );
         fprintf( stderr, ",start=" );
-        dump_uint64( &event->info.create_process.start );
+        dump_uint64( &event->create_process.start );
         fprintf( stderr, ",name=" );
-        dump_uint64( &event->info.create_process.name );
-        fprintf( stderr, ",unicode=%d}", event->info.create_process.unicode );
+        dump_uint64( &event->create_process.name );
+        fprintf( stderr, ",unicode=%d}", event->create_process.unicode );
         break;
     case EXIT_THREAD_DEBUG_EVENT:
-        fprintf( stderr, "{exit_thread,code=%d}", event->info.exit.exit_code );
+        fprintf( stderr, "{exit_thread,code=%d}", event->exit.exit_code );
         break;
     case EXIT_PROCESS_DEBUG_EVENT:
-        fprintf( stderr, "{exit_process,code=%d}", event->info.exit.exit_code );
+        fprintf( stderr, "{exit_process,code=%d}", event->exit.exit_code );
         break;
     case LOAD_DLL_DEBUG_EVENT:
-        fprintf( stderr, "{load_dll,file=%04x,base", event->info.load_dll.handle );
-        dump_uint64( &event->info.load_dll.base );
+        fprintf( stderr, "{load_dll,file=%04x,base", event->load_dll.handle );
+        dump_uint64( &event->load_dll.base );
         fprintf( stderr, ",offset=%d,size=%d,name=",
-                 event->info.load_dll.dbg_offset, event->info.load_dll.dbg_size );
-        dump_uint64( &event->info.load_dll.name );
-        fprintf( stderr, ",unicode=%d}", event->info.load_dll.unicode );
+                 event->load_dll.dbg_offset, event->load_dll.dbg_size );
+        dump_uint64( &event->load_dll.name );
+        fprintf( stderr, ",unicode=%d}", event->load_dll.unicode );
         break;
     case UNLOAD_DLL_DEBUG_EVENT:
         fputs( "{unload_dll,base=", stderr );
-        dump_uint64( &event->info.unload_dll.base );
+        dump_uint64( &event->unload_dll.base );
         fputc( '}', stderr );
         break;
     case OUTPUT_DEBUG_STRING_EVENT:
         fprintf( stderr, "{output_string,string=" );
-        dump_uint64( &event->info.output_string.string );
+        dump_uint64( &event->output_string.string );
         fprintf( stderr, ",unicode=%d,len=%u}",
-                 event->info.output_string.unicode, event->info.output_string.length );
+                 event->output_string.unicode, event->output_string.length );
         break;
     case RIP_EVENT:
         fprintf( stderr, "{rip,err=%d,type=%d}",
-                 event->info.rip_info.error, event->info.rip_info.type );
+                 event->rip_info.error, event->rip_info.type );
         break;
     case 0:  /* zero is the code returned on timeouts */
         fprintf( stderr, "{}" );