Converted process creation to Unicode.

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 )