Commit 5dc91e6c authored by Rein Klazes's avatar Rein Klazes Committed by Alexandre Julliard

A starting process must obey the STARTF_USESTDHANDLES flag and use the

standard io handles from the StartupInfo structure, even if it is starting a new console.
parent da10a46c
......@@ -1142,6 +1142,7 @@ BOOL WINAPI AllocConsole(void)
if (!start_console_renderer(&siConsole))
goto the_end;
if( !(siCurrent.dwFlags & STARTF_USESTDHANDLES) ) {
/* all std I/O handles are inheritable by default */
sa.nLength = sizeof(sa);
sa.lpSecurityDescriptor = NULL;
......@@ -1155,9 +1156,15 @@ BOOL WINAPI AllocConsole(void)
0, &sa, OPEN_EXISTING, 0, 0 );
if (handle_out == INVALID_HANDLE_VALUE) goto the_end;
if (!DuplicateHandle(GetCurrentProcess(), handle_out, GetCurrentProcess(), &handle_err,
0, TRUE, DUPLICATE_SAME_ACCESS))
if (!DuplicateHandle(GetCurrentProcess(), handle_out, GetCurrentProcess(),
&handle_err, 0, TRUE, DUPLICATE_SAME_ACCESS))
goto the_end;
} else {
/* STARTF_USESTDHANDLES flag: use handles from StartupInfo */
handle_in = siCurrent.hStdInput;
handle_out = siCurrent.hStdOutput;
handle_err = siCurrent.hStdError;
}
/* NT resets the STD_*_HANDLEs on console alloc */
SetStdHandle(STD_INPUT_HANDLE, handle_in);
......
......@@ -207,12 +207,9 @@ static void set_process_startup_state( struct process *process, enum startup_sta
static int set_process_console( struct process *process, struct thread *parent_thread,
struct startup_info *info, struct init_process_reply *reply )
{
if (process->create_flags & CREATE_NEW_CONSOLE)
if (info)
{
/* let the process init do the allocation */
return 1;
}
else if (info && !(process->create_flags & DETACHED_PROCESS))
if (!(process->create_flags & (DETACHED_PROCESS | CREATE_NEW_CONSOLE)))
{
/* FIXME: some better error checking should be done...
* like if hConOut and hConIn are console handles, then they should be on the same
......@@ -220,9 +217,7 @@ static int set_process_console( struct process *process, struct thread *parent_t
*/
inherit_console( parent_thread, process, info->inherit_all ? info->hstdin : 0 );
}
if (info)
{
if (!info->inherit_all)
if (!info->inherit_all && !(process->create_flags & CREATE_NEW_CONSOLE))
{
reply->hstdin = duplicate_handle( parent_thread->process, info->hstdin, process,
0, TRUE, DUPLICATE_SAME_ACCESS );
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment