This patch should take care of it. It also gets rid of unneeded information in the server.
A+ -- Eric Pouech
Name: cp_ioinh ChangeLog: fixed regression in process creation (std handle inheritance) License: X11 GenDate: 2003/08/15 08:15:40 UTC ModifiedFiles: scheduler/process.c server/protocol.def server/console.c server/process.c =================================================================== RCS file: /home/cvs/cvsroot/wine/wine/scheduler/process.c,v retrieving revision 1.225 diff -u -u -r1.225 process.c --- scheduler/process.c 3 Jul 2003 18:23:10 -0000 1.225 +++ scheduler/process.c 15 Aug 2003 07:02:38 -0000 @@ -341,6 +341,10 @@ } else { + /* convert value from server: + * + 0 => INVALID_HANDLE_VALUE + * + console handle need to be mapped + */ if (!process_pmts.hStdInput) process_pmts.hStdInput = INVALID_HANDLE_VALUE; else if (VerifyConsoleIoHandle(console_handle_map(process_pmts.hStdInput))) @@ -944,7 +948,6 @@ req->inherit_all = inherit; req->create_flags = flags; - req->use_handles = (startup->dwFlags & STARTF_USESTDHANDLES) != 0; req->unix_pid = pid; req->exe_file = hFile; if (startup->dwFlags & STARTF_USESTDHANDLES) Index: server/protocol.def =================================================================== RCS file: /home/cvs/cvsroot/wine/wine/server/protocol.def,v retrieving revision 1.78 diff -u -u -r1.78 protocol.def --- server/protocol.def 26 Jul 2003 20:36:43 -0000 1.78 +++ server/protocol.def 15 Aug 2003 06:59:53 -0000 @@ -204,7 +204,6 @@ /* Create a new process from the context of the parent */ @REQ(new_process) int inherit_all; /* inherit all handles from parent */ - int use_handles; /* use stdio handles */ int create_flags; /* creation flags */ int unix_pid; /* Unix pid of new process */ obj_handle_t exe_file; /* file handle for main exe */ Index: server/console.c =================================================================== RCS file: /home/cvs/cvsroot/wine/wine/server/console.c,v retrieving revision 1.51 diff -u -u -r1.51 console.c --- server/console.c 23 Jun 2003 03:37:14 -0000 1.51 +++ server/console.c 15 Aug 2003 07:45:22 -0000 @@ -347,9 +347,11 @@ { struct console_input* console; - if ((console = (struct console_input*)get_handle_obj( parent, hconin, 0, NULL ))) + /* FIXME: should we check some access rights ? */ + if ((console = (struct console_input*)get_handle_obj( parent, hconin, + 0, &console_input_ops ))) { - if (console->renderer == parent_thread) + if (console->renderer == parent_thread) { process->console = (struct console_input*)grab_object( console ); process->console->num_proc++; Index: server/process.c =================================================================== RCS file: /home/cvs/cvsroot/wine/wine/server/process.c,v retrieving revision 1.106 diff -u -u -r1.106 process.c --- server/process.c 24 Jul 2003 00:07:00 -0000 1.106 +++ server/process.c 15 Aug 2003 07:44:38 -0000 @@ -83,7 +83,6 @@ struct object obj; /* object header */ struct list entry; /* entry in list of startup infos */ int inherit_all; /* inherit all handles from parent */ - int use_handles; /* use stdio handles */ int create_flags; /* creation flags */ int unix_pid; /* Unix pid of new process */ obj_handle_t hstdin; /* handle for stdin */ @@ -216,14 +215,25 @@ * like if hConOut and hConIn are console handles, then they should be on the same * physical console */ - inherit_console( parent_thread, process, - (info->inherit_all || info->use_handles) ? info->hstdin : 0 ); + inherit_console( parent_thread, process, info->inherit_all ? info->hstdin : 0 ); } if (info) { - reply->hstdin = info->hstdin; - reply->hstdout = info->hstdout; - reply->hstderr = info->hstderr; + if (!info->inherit_all) + { + reply->hstdin = duplicate_handle( parent_thread->process, info->hstdin, process, + 0, TRUE, DUPLICATE_SAME_ACCESS ); + reply->hstdout = duplicate_handle( parent_thread->process, info->hstdout, process, + 0, TRUE, DUPLICATE_SAME_ACCESS ); + reply->hstderr = duplicate_handle( parent_thread->process, info->hstderr, process, + 0, TRUE, DUPLICATE_SAME_ACCESS ); + } + else + { + reply->hstdin = info->hstdin; + reply->hstdout = info->hstdout; + reply->hstderr = info->hstderr; + } } else reply->hstdin = reply->hstdout = reply->hstderr = 0; /* some handles above may have been invalid; this is not an error */ @@ -870,7 +882,6 @@ if (!(info = alloc_object( &startup_info_ops ))) return; list_add_head( &startup_info_list, &info->entry ); info->inherit_all = req->inherit_all; - info->use_handles = req->use_handles; info->create_flags = req->create_flags; info->unix_pid = req->unix_pid; info->hstdin = req->hstdin;