From: Eric Pouech epouech@codeweavers.com
And don't infer detached console state from std handle values, but rely on explicit pseudo console handle value.
Signed-off-by: Eric Pouech epouech@codeweavers.com --- dlls/kernel32/tests/process.c | 13 +++++++------ dlls/kernelbase/console.c | 2 ++ dlls/kernelbase/process.c | 13 ++++++------- dlls/ntdll/unix/process.c | 4 ++-- include/wine/condrv.h | 5 +++-- 5 files changed, 20 insertions(+), 17 deletions(-)
diff --git a/dlls/kernel32/tests/process.c b/dlls/kernel32/tests/process.c index 2a9a1b4c02f..e329f28ac8b 100644 --- a/dlls/kernel32/tests/process.c +++ b/dlls/kernel32/tests/process.c @@ -3307,7 +3307,8 @@ struct std_handle_test unsigned args; /* output */ DWORD expected; - unsigned is_todo; /* bitmask: 1 on TEB values, 2 on StartupInfoA values, 4 on StartupInfoW values, 8 dangling in StartupInfoW */ + unsigned is_todo; /* bitmask: 1 on TEB values, 2 on StartupInfoA values, 4 on StartupInfoW values, + 8 dangling in StartupInfoW, 16 dangling in TEB */ DWORD is_broken; /* Win7 broken file types */ };
@@ -3340,8 +3341,8 @@ static void test_StdHandleInheritance(void) {ARG_STD | ARG_HANDLE_PROTECT | H_DISK, HATTR_TYPE | HATTR_PROTECT | FILE_TYPE_DISK},
/* all others handles type behave as H_DISK */ - {ARG_STARTUPINFO | ARG_CP_INHERIT | H_DISK, HATTR_DANGLING, .is_todo = 8, .is_broken = HATTR_TYPE | FILE_TYPE_UNKNOWN}, - {ARG_STD | ARG_CP_INHERIT | H_DISK, HATTR_DANGLING}, + {ARG_STARTUPINFO | ARG_CP_INHERIT | H_DISK, HATTR_DANGLING, .is_todo = 24, .is_broken = HATTR_TYPE | FILE_TYPE_UNKNOWN}, + {ARG_STD | ARG_CP_INHERIT | H_DISK, HATTR_DANGLING, .is_todo = 16},
/* all others handles type behave as H_DISK */ /*10*/ {ARG_STARTUPINFO | H_DEVIL, HATTR_NULL, .is_broken = HATTR_TYPE | FILE_TYPE_UNKNOWN}, @@ -3368,8 +3369,8 @@ static void test_StdHandleInheritance(void) {ARG_STD | ARG_HANDLE_INHERIT | H_DISK, HATTR_NULL},
/* all others handles type behave as H_DISK */ -/*10*/ {ARG_STARTUPINFO | ARG_CP_INHERIT | H_DISK, HATTR_DANGLING, .is_todo = 8}, - {ARG_STD | ARG_CP_INHERIT | H_DISK, HATTR_DANGLING}, +/*10*/ {ARG_STARTUPINFO | ARG_CP_INHERIT | H_DISK, HATTR_DANGLING, .is_todo = 24}, + {ARG_STD | ARG_CP_INHERIT | H_DISK, HATTR_DANGLING, .is_todo = 16},
/* all others handles type behave as H_DISK */ {ARG_STARTUPINFO | H_DISK, HATTR_NULL, .is_broken = HATTR_TYPE | FILE_TYPE_UNKNOWN}, @@ -3467,7 +3468,7 @@ static void test_StdHandleInheritance(void) okChildHexInt("StartupInfoW", "hStdOutput", (DWORD_PTR)hstd[1], std_tests[i].is_broken); }
- todo_wine + todo_wine_if(std_tests[i].is_todo & 16) { okChildHexInt("TEB", "hStdInput", (DWORD_PTR)hstd[0], std_tests[i].is_broken); okChildHexInt("TEB", "hStdOutput", (DWORD_PTR)hstd[1], std_tests[i].is_broken); diff --git a/dlls/kernelbase/console.c b/dlls/kernelbase/console.c index 4209d2e6991..4f318115f1d 100644 --- a/dlls/kernelbase/console.c +++ b/dlls/kernelbase/console.c @@ -2384,6 +2384,8 @@ void init_console( void ) if (RtlImageNtHeader( mod )->OptionalHeader.Subsystem == IMAGE_SUBSYSTEM_WINDOWS_CUI) alloc_console( no_window ); } + else if (params->ConsoleHandle == CONSOLE_HANDLE_DETACHED) + params->ConsoleHandle = NULL; else if (params->ConsoleHandle && params->ConsoleHandle != CONSOLE_HANDLE_SHELL_NO_WINDOW) create_console_connection( params->ConsoleHandle ); } diff --git a/dlls/kernelbase/process.c b/dlls/kernelbase/process.c index 1aeb8f55257..79f5c592689 100644 --- a/dlls/kernelbase/process.c +++ b/dlls/kernelbase/process.c @@ -202,6 +202,7 @@ static RTL_USER_PROCESS_PARAMETERS *create_process_params( const WCHAR *filename if (!params->ConsoleHandle) params->ConsoleHandle = CONSOLE_HANDLE_ALLOC; } } + else params->ConsoleHandle = CONSOLE_HANDLE_DETACHED;
if (startup->dwFlags & STARTF_USESTDHANDLES) { @@ -209,19 +210,17 @@ static RTL_USER_PROCESS_PARAMETERS *create_process_params( const WCHAR *filename params->hStdOutput = startup->hStdOutput; params->hStdError = startup->hStdError; } - else if (flags & (DETACHED_PROCESS | CREATE_NEW_CONSOLE)) - { - params->hStdInput = INVALID_HANDLE_VALUE; - params->hStdOutput = INVALID_HANDLE_VALUE; - params->hStdError = INVALID_HANDLE_VALUE; - } - else + else if (!(flags & (DETACHED_PROCESS | CREATE_NEW_CONSOLE))) { params->hStdInput = NtCurrentTeb()->Peb->ProcessParameters->hStdInput; params->hStdOutput = NtCurrentTeb()->Peb->ProcessParameters->hStdOutput; params->hStdError = NtCurrentTeb()->Peb->ProcessParameters->hStdError; }
+ if (params->hStdInput == INVALID_HANDLE_VALUE) params->hStdInput = NULL; + if (params->hStdOutput == INVALID_HANDLE_VALUE) params->hStdOutput = NULL; + if (params->hStdError == INVALID_HANDLE_VALUE) params->hStdError = NULL; + params->dwX = startup->dwX; params->dwY = startup->dwY; params->dwXSize = startup->dwXSize; diff --git a/dlls/ntdll/unix/process.c b/dlls/ntdll/unix/process.c index 71eab55920d..53911049d5c 100644 --- a/dlls/ntdll/unix/process.c +++ b/dlls/ntdll/unix/process.c @@ -444,7 +444,7 @@ static NTSTATUS spawn_process( const RTL_USER_PROCESS_PARAMETERS *params, int so if ((peb->ProcessParameters && params->ProcessGroupId != peb->ProcessParameters->ProcessGroupId) || params->ConsoleHandle == CONSOLE_HANDLE_ALLOC || params->ConsoleHandle == CONSOLE_HANDLE_ALLOC_NO_WINDOW || - (params->hStdInput == INVALID_HANDLE_VALUE && params->hStdOutput == INVALID_HANDLE_VALUE)) + params->ConsoleHandle == CONSOLE_HANDLE_DETACHED) { setsid(); set_stdio_fd( -1, -1 ); /* close stdin and stdout */ @@ -623,7 +623,7 @@ static NTSTATUS fork_and_exec( OBJECT_ATTRIBUTES *attr, int unixdir, if ((peb->ProcessParameters && params->ProcessGroupId != peb->ProcessParameters->ProcessGroupId) || params->ConsoleHandle == CONSOLE_HANDLE_ALLOC || params->ConsoleHandle == CONSOLE_HANDLE_ALLOC_NO_WINDOW || - (params->hStdInput == INVALID_HANDLE_VALUE && params->hStdOutput == INVALID_HANDLE_VALUE)) + params->ConsoleHandle == CONSOLE_HANDLE_DETACHED) { setsid(); set_stdio_fd( -1, -1 ); /* close stdin and stdout */ diff --git a/include/wine/condrv.h b/include/wine/condrv.h index 51534720444..7510654ffa0 100644 --- a/include/wine/condrv.h +++ b/include/wine/condrv.h @@ -197,7 +197,8 @@ struct condrv_ctrl_event /* Wine specific values for console inheritance (params->ConsoleHandle) */ #define CONSOLE_HANDLE_ALLOC LongToHandle(-1) #define CONSOLE_HANDLE_ALLOC_NO_WINDOW LongToHandle(-2) -#define CONSOLE_HANDLE_SHELL LongToHandle(-3) -#define CONSOLE_HANDLE_SHELL_NO_WINDOW LongToHandle(-4) +#define CONSOLE_HANDLE_DETACHED LongToHandle(-3) +#define CONSOLE_HANDLE_SHELL LongToHandle(-4) +#define CONSOLE_HANDLE_SHELL_NO_WINDOW LongToHandle(-5)
#endif /* _INC_CONDRV */