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.
This commit is contained in:
parent
da10a46ca7
commit
5dc91e6c08
|
@ -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);
|
||||
|
|
|
@ -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 );
|
||||
|
|
Loading…
Reference in New Issue