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( ¶ms, 0, sizeof(params) );
+ memcpy( ¶ms, 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( ¶ms.CurrentDirectoryName, cur_data, size );
+ fprintf( stderr, "\",DllPath=L\"" );
+ dump_inline_unicode_string( ¶ms.DllPath, cur_data, size );
+ fprintf( stderr, "\",ImagePathName=L\"" );
+ dump_inline_unicode_string( ¶ms.ImagePathName, cur_data, size );
+ fprintf( stderr, "\",CommandLine=L\"" );
+ dump_inline_unicode_string( ¶ms.CommandLine, cur_data, size );
+ fprintf( stderr, "\",WindowTitle=L\"" );
+ dump_inline_unicode_string( ¶ms.WindowTitle, cur_data, size );
+ fprintf( stderr, "\",Desktop=L\"" );
+ dump_inline_unicode_string( ¶ms.Desktop, cur_data, size );
+ fprintf( stderr, "\",ShellInfo=L\"" );
+ dump_inline_unicode_string( ¶ms.ShellInfo, cur_data, size );
+ fprintf( stderr, "\",RuntimeInfo=L\"" );
+ dump_inline_unicode_string( ¶ms.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 )