Transfer the full process startup info as well as the command-line
through the server.

diff --git a/scheduler/process.c b/scheduler/process.c
index 8cf22a1..e127ca2 100644
--- a/scheduler/process.c
+++ b/scheduler/process.c
@@ -116,7 +116,8 @@
 unsigned int server_startticks;
 
 /* memory/environ.c */
-extern struct _ENVDB *ENV_BuildEnvironment(void);
+extern struct _ENVDB *ENV_InitStartupInfo( handle_t info_handle, size_t info_size,
+                                           char *main_exe_name, size_t main_exe_size );
 extern BOOL ENV_BuildCommandLine( char **argv );
 extern STARTUPINFOA current_startupinfo;
 
@@ -243,6 +244,8 @@
 {
     BOOL ret;
     int create_flags = 0;
+    size_t info_size = 0;
+    handle_t info = 0;
 
     /* store the program name */
     argv0 = argv[0];
@@ -271,9 +274,9 @@
             main_exe_name[len] = 0;
             main_exe_file = reply->exe_file;
             create_flags  = reply->create_flags;
-            current_startupinfo.dwFlags     = reply->start_flags;
+            info_size     = reply->info_size;
+            info          = reply->info;
             server_startticks               = reply->server_start;
-            current_startupinfo.wShowWindow = reply->cmd_show;
             current_startupinfo.hStdInput   = reply->hstdin;
             current_startupinfo.hStdOutput  = reply->hstdout;
             current_startupinfo.hStdError   = reply->hstderr;
@@ -308,7 +311,9 @@
     PTHREAD_init_done();
 
     /* Copy the parent environment */
-    if (!(current_process.env_db = ENV_BuildEnvironment())) return FALSE;
+    if (!(current_process.env_db = ENV_InitStartupInfo( info, info_size,
+                                                        main_exe_name, sizeof(main_exe_name) )))
+        return FALSE;
 
     /* Parse command line arguments */
     OPTIONS_ParseOptions( argv );
@@ -861,6 +866,7 @@
     DOS_FULL_NAME full_dir, full_name;
     HANDLE load_done_evt = 0;
     HANDLE process_info;
+    startup_info_t startup_info;
 
     info->hThread = info->hProcess = 0;
     info->dwProcessId = info->dwThreadId = 0;
@@ -880,15 +886,33 @@
         }
     }
 
+    /* fill the startup info structure */
+
+    startup_info.size        = sizeof(startup_info);
+    /* startup_info.filename_len is set below */
+    startup_info.cmdline_len = cmd_line ? strlen(cmd_line) : 0;
+    startup_info.desktop_len = startup->lpDesktop ? strlen(startup->lpDesktop) : 0;
+    startup_info.title_len   = startup->lpTitle ? strlen(startup->lpTitle) : 0;
+    startup_info.x           = startup->dwX;
+    startup_info.y           = startup->dwY;
+    startup_info.cx          = startup->dwXSize;
+    startup_info.cy          = startup->dwYSize;
+    startup_info.x_chars     = startup->dwXCountChars;
+    startup_info.y_chars     = startup->dwYCountChars;
+    startup_info.attribute   = startup->dwFillAttribute;
+    startup_info.cmd_show    = startup->wShowWindow;
+    startup_info.flags       = startup->dwFlags;
+
     /* create the process on the server side */
 
     SERVER_START_REQ( new_process )
     {
         char buf[MAX_PATH];
+        LPCSTR nameptr;
 
         req->inherit_all  = inherit;
         req->create_flags = flags;
-        req->start_flags  = startup->dwFlags;
+        req->use_handles  = (startup->dwFlags & STARTF_USESTDHANDLES) != 0;
         req->exe_file     = hFile;
         if (startup->dwFlags & STARTF_USESTDHANDLES)
         {
@@ -902,22 +926,28 @@
             req->hstdout = GetStdHandle( STD_OUTPUT_HANDLE );
             req->hstderr = GetStdHandle( STD_ERROR_HANDLE );
         }
-        req->cmd_show = startup->wShowWindow;
 
         if (!hFile)  /* unix process */
         {
             unixfilename = filename;
             if (DOSFS_GetFullName( filename, TRUE, &full_name ))
                 unixfilename = full_name.long_name;
-            wine_server_add_data( req, unixfilename, strlen(unixfilename) );
+            nameptr = unixfilename;
         }
         else  /* new wine process */
         {
             if (GetLongPathNameA( filename, buf, MAX_PATH ))
-                wine_server_add_data( req, buf, strlen(buf) );
+                nameptr = buf;
             else
-                wine_server_add_data( req, filename, strlen(filename) );
+                nameptr = filename;
         }
+        startup_info.filename_len = strlen(nameptr);
+        wine_server_add_data( req, &startup_info, sizeof(startup_info) );
+        wine_server_add_data( req, nameptr, startup_info.filename_len );
+        wine_server_add_data( req, cmd_line, startup_info.cmdline_len );
+        wine_server_add_data( req, startup->lpDesktop, startup_info.desktop_len );
+        wine_server_add_data( req, startup->lpTitle, startup_info.title_len );
+
         ret = !wine_server_call_err( req );
         process_info = reply->info;
     }