Converted process creation to Unicode.

diff --git a/server/process.c b/server/process.c
index 066b232..0e5da95 100644
--- a/server/process.c
+++ b/server/process.c
@@ -95,7 +95,7 @@
     struct process     *process;      /* created process */
     struct thread      *thread;       /* created thread */
     size_t              data_size;    /* size of startup data */
-    startup_info_t     *data;         /* data for startup info */
+    void               *data;         /* data for startup info */
 };
 
 static void startup_info_dump( struct object *obj, int verbose );
@@ -900,8 +900,7 @@
         !(info->exe_file = get_file_obj( current->process, req->exe_file, GENERIC_READ )))
         goto done;
 
-    if (!(info->data = mem_alloc( info->data_size ))) goto done;
-    memcpy( info->data, get_req_data(), info->data_size );
+    if (!(info->data = memdup( get_req_data(), info->data_size ))) goto done;
     reply->info = alloc_handle( current->process, info, SYNCHRONIZE, FALSE );
 
  done:
diff --git a/server/protocol.def b/server/protocol.def
index 3892a3c..c895c26 100644
--- a/server/protocol.def
+++ b/server/protocol.def
@@ -147,29 +147,6 @@
     int   signaled;  /* wait result */
 };
 
-/* structure for process startup info */
-typedef struct
-{
-    size_t       size;         /* size of this structure */
-    size_t       filename_len; /* length of filename */
-    size_t       cmdline_len;  /* length of cmd line */
-    size_t       desktop_len;  /* length of desktop name */
-    size_t       title_len;    /* length of title */
-    int          x;            /* window position */
-    int          y;
-    int          cx;           /* window size */
-    int          cy;
-    int          x_chars;      /* console size */
-    int          y_chars;
-    int          attribute;    /* console attributes */
-    int          cmd_show;     /* main window show mode */
-    unsigned int flags;        /* info flags */
-    /* char filename[...]; */
-    /* char cmdline[...]; */
-    /* char desktop[...]; */
-    /* char title[...]; */
-} startup_info_t;
-
 /* structure for absolute timeouts */
 typedef struct
 {
diff --git a/server/trace.c b/server/trace.c
index dcfeb81..7b5b785 100644
--- a/server/trace.c
+++ b/server/trace.c
@@ -30,10 +30,11 @@
 #include <sys/uio.h>
 #endif
 
-
 #include "windef.h"
 #include "winbase.h"
 #include "wincon.h"
+#include "winreg.h"
+#include "winternl.h"
 #include "request.h"
 #include "unicode.h"
 
@@ -294,41 +295,68 @@
     remove_data( size );
 }
 
+/* dump a unicode string contained in a buffer; helper for dump_varargs_startup_info */
+static void dump_inline_unicode_string( const UNICODE_STRING *str, const void *data, size_t size )
+{
+    size_t length = str->Length / sizeof(WCHAR);
+    size_t offset = (size_t)str->Buffer;
+
+    if (offset >= size) return;
+    if (offset + length > size) length = size - offset;
+    dump_strW( (const WCHAR *)data + offset/sizeof(WCHAR), length, stderr, "\"\"" );
+}
+
 static void dump_varargs_startup_info( size_t size )
 {
-    const startup_info_t *ptr = cur_data;
-    startup_info_t info;
+    const RTL_USER_PROCESS_PARAMETERS *ptr = cur_data;
+    RTL_USER_PROCESS_PARAMETERS params;
 
-    if (size < sizeof(info.size))
+    if (size < sizeof(params.Size))
     {
         fprintf( stderr, "{}" );
         return;
     }
-    if (size > ptr->size) size = ptr->size;
-    memset( &info, 0, sizeof(info) );
-    memcpy( &info, ptr, min( size, sizeof(info) ));
+    if (size > ptr->Size) size = ptr->Size;
+    memset( &params, 0, sizeof(params) );
+    memcpy( &params, ptr, min( size, sizeof(params) ));
 
-    fprintf( stderr, "{size=%d", info.size );
-    fprintf( stderr, ",x=%d", info.x );
-    fprintf( stderr, ",y=%d", info.y );
-    fprintf( stderr, ",cx=%d", info.cx );
-    fprintf( stderr, ",cy=%d", info.cy );
-    fprintf( stderr, ",x_chars=%d", info.x_chars );
-    fprintf( stderr, ",y_chars=%d", info.y_chars );
-    fprintf( stderr, ",attr=%d", info.attribute );
-    fprintf( stderr, ",cmd_show=%d", info.cmd_show );
-    fprintf( stderr, ",flags=%x", info.flags );
+    fprintf( stderr, "{AllocationSize=%lx,", params.AllocationSize );
+    fprintf( stderr, "Size=%lx,", params.Size );
+    fprintf( stderr, "Flags=%lx,", params.Flags );
+    fprintf( stderr, "DebugFlags=%lx,", params.DebugFlags );
+    fprintf( stderr, "Console=%p,", params.hConsole );
+    fprintf( stderr, "ProcessGroup=%lx,", params.ProcessGroup );
+    fprintf( stderr, "hStdInput=%p,", params.hStdInput );
+    fprintf( stderr, "hStdOutput=%p,", params.hStdOutput );
+    fprintf( stderr, "hStdError=%p,", params.hStdError );
+    fprintf( stderr, "CurrentDirectoryHandle=%p,", params.CurrentDirectoryHandle );
+    fprintf( stderr, "dwX=%ld,", params.dwX );
+    fprintf( stderr, "dwY=%ld,", params.dwY );
+    fprintf( stderr, "dwXSize=%ld,", params.dwXSize );
+    fprintf( stderr, "dwYSize=%ld,", params.dwYSize );
+    fprintf( stderr, "dwXCountChars=%ld,", params.dwXCountChars );
+    fprintf( stderr, "dwYCountChars=%ld,", params.dwYCountChars );
+    fprintf( stderr, "dwFillAttribute=%lx,", params.dwFillAttribute );
+    fprintf( stderr, "dwFlags=%lx,", params.dwFlags );
+    fprintf( stderr, "wShowWindow=%lx,", params.wShowWindow );
+    fprintf( stderr, "CurrentDirectoryName=L\"" );
+    dump_inline_unicode_string( &params.CurrentDirectoryName, cur_data, size );
+    fprintf( stderr, "\",DllPath=L\"" );
+    dump_inline_unicode_string( &params.DllPath, cur_data, size );
+    fprintf( stderr, "\",ImagePathName=L\"" );
+    dump_inline_unicode_string( &params.ImagePathName, cur_data, size );
+    fprintf( stderr, "\",CommandLine=L\"" );
+    dump_inline_unicode_string( &params.CommandLine, cur_data, size );
+    fprintf( stderr, "\",WindowTitle=L\"" );
+    dump_inline_unicode_string( &params.WindowTitle, cur_data, size );
+    fprintf( stderr, "\",Desktop=L\"" );
+    dump_inline_unicode_string( &params.Desktop, cur_data, size );
+    fprintf( stderr, "\",ShellInfo=L\"" );
+    dump_inline_unicode_string( &params.ShellInfo, cur_data, size );
+    fprintf( stderr, "\",RuntimeInfo=L\"" );
+    dump_inline_unicode_string( &params.RuntimeInfo, cur_data, size );
+    fprintf( stderr, "\"}" );
     remove_data( size );
-    fprintf( stderr, ",filename=" );
-    /* FIXME: these should be unicode */
-    dump_varargs_string( min(cur_size,info.filename_len) );
-    fprintf( stderr, ",cmdline=" );
-    dump_varargs_string( min(cur_size,info.cmdline_len) );
-    fprintf( stderr, ",desktop=" );
-    dump_varargs_string( min(cur_size,info.desktop_len) );
-    fprintf( stderr, ",title=" );
-    dump_varargs_string( min(cur_size,info.title_len) );
-    fputc( '}', stderr );
 }
 
 static void dump_varargs_input_records( size_t size )