diff --git a/dlls/kernel/console.c b/dlls/kernel/console.c index 2788e71a931..322d7b5c049 100644 --- a/dlls/kernel/console.c +++ b/dlls/kernel/console.c @@ -1142,22 +1142,29 @@ BOOL WINAPI AllocConsole(void) if (!start_console_renderer(&siConsole)) goto the_end; - /* all std I/O handles are inheritable by default */ - sa.nLength = sizeof(sa); - sa.lpSecurityDescriptor = NULL; - sa.bInheritHandle = TRUE; - - handle_in = CreateFileA( "CONIN$", GENERIC_READ|GENERIC_WRITE|SYNCHRONIZE, - 0, &sa, OPEN_EXISTING, 0, 0 ); - if (handle_in == INVALID_HANDLE_VALUE) goto the_end; - - handle_out = CreateFileA( "CONOUT$", GENERIC_READ|GENERIC_WRITE, - 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)) - goto the_end; + if( !(siCurrent.dwFlags & STARTF_USESTDHANDLES) ) { + /* all std I/O handles are inheritable by default */ + sa.nLength = sizeof(sa); + sa.lpSecurityDescriptor = NULL; + sa.bInheritHandle = TRUE; + + handle_in = CreateFileA( "CONIN$", GENERIC_READ|GENERIC_WRITE|SYNCHRONIZE, + 0, &sa, OPEN_EXISTING, 0, 0 ); + if (handle_in == INVALID_HANDLE_VALUE) goto the_end; + + handle_out = CreateFileA( "CONOUT$", GENERIC_READ|GENERIC_WRITE, + 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)) + 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); diff --git a/server/process.c b/server/process.c index 93b9a55a176..1c04ba712bc 100644 --- a/server/process.c +++ b/server/process.c @@ -207,22 +207,17 @@ 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) - { - /* let the process init do the allocation */ - return 1; - } - else if (info && !(process->create_flags & DETACHED_PROCESS)) - { - /* FIXME: some better error checking should be done... - * 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->hstdin : 0 ); - } if (info) { - if (!info->inherit_all) + 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 + * physical console + */ + inherit_console( parent_thread, process, info->inherit_all ? info->hstdin : 0 ); + } + 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 );