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:
Rein Klazes 2004-12-15 10:47:23 +00:00 committed by Alexandre Julliard
parent da10a46ca7
commit 5dc91e6c08
2 changed files with 32 additions and 30 deletions

View file

@ -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);

View file

@ -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 );