From: Eric Pouech epouech@codeweavers.com
This will give us more flexibility in following changes.
Signed-off-by: Eric Pouech epouech@codeweavers.com --- dlls/kernel32/tests/console.c | 263 ++++++++++++++++++---------------- 1 file changed, 142 insertions(+), 121 deletions(-)
diff --git a/dlls/kernel32/tests/console.c b/dlls/kernel32/tests/console.c index d1f101c2409..f3fc5ed641e 100644 --- a/dlls/kernel32/tests/console.c +++ b/dlls/kernel32/tests/console.c @@ -4938,57 +4938,85 @@ static BOOL save_blackbox(const char* file, void* blackbox, int size) return TRUE; }
-enum inheritance_model {NULL_STD, CONSOLE_STD, STARTUPINFO_STD}; +enum inheritance_model {H_NULL, H_CONSOLE, H_FILE}; + +#define ARG_STD 0x80000000 +#define ARG_STARTUPINFO 0x00000000 +#define ARG_CP_INHERIT 0x40000000 +#define ARG_MODEL_MASK (~0xff000000) + +#define STD_NULL (ARG_STD | H_NULL) +#define STD_CONSOLE (ARG_STD | ARG_CP_INHERIT | H_CONSOLE) +#define STD_FILE (ARG_STD | ARG_CP_INHERIT | H_FILE) +#define STINFO_NULL (ARG_STARTUPINFO | H_NULL) +#define STINFO_CONSOLE (ARG_STARTUPINFO | ARG_CP_INHERIT | H_CONSOLE) +#define STINFO_FILE (ARG_STARTUPINFO | ARG_CP_INHERIT | H_FILE)
struct black_box { unsigned bitmask; };
-static BOOL check_child_console_bits(const char* exec, DWORD flags, enum inheritance_model inherit, +static BOOL check_child_console_bits(const char* exec, DWORD flags, unsigned args, struct black_box* result) { SECURITY_ATTRIBUTES sa = {0, NULL, TRUE}; STARTUPINFOA si = { sizeof(si) }; PROCESS_INFORMATION info; char buf[MAX_PATH]; - HANDLE handle; DWORD exit_code; BOOL res; DWORD ret; - BOOL inherit_handles = FALSE; + BOOL needs_close = FALSE; char blackbox_file[MAX_PATH]; + HANDLE hin, hout, herr;
get_temp_file_name(blackbox_file);
sprintf(buf, ""%s" console check_console %s", exec, blackbox_file); - switch (inherit) - { - case NULL_STD: SetStdHandle(STD_INPUT_HANDLE, NULL); SetStdHandle(STD_OUTPUT_HANDLE, NULL); SetStdHandle(STD_ERROR_HANDLE, NULL); + + switch (args & ARG_MODEL_MASK) + { + case H_NULL: + hin = hout = herr = NULL; break; - case CONSOLE_STD: - handle = CreateFileA("CONIN$", GENERIC_READ, 0, &sa, OPEN_EXISTING, 0, 0); - ok(handle != INVALID_HANDLE_VALUE, "Couldn't create input to console\n"); - SetStdHandle(STD_INPUT_HANDLE, handle); - handle = CreateFileA("CONOUT$", GENERIC_READ|GENERIC_WRITE, 0, &sa, OPEN_EXISTING, 0, 0); - ok(handle != INVALID_HANDLE_VALUE, "Couldn't create input to console\n"); - SetStdHandle(STD_OUTPUT_HANDLE, handle); - SetStdHandle(STD_ERROR_HANDLE, handle); + case H_CONSOLE: + hin = CreateFileA("CONIN$", GENERIC_READ, 0, &sa, OPEN_EXISTING, 0, 0); + ok(hin != INVALID_HANDLE_VALUE, "Couldn't create input to console\n"); + hout = CreateFileA("CONOUT$", GENERIC_READ|GENERIC_WRITE, 0, &sa, OPEN_EXISTING, 0, 0); + ok(hout != INVALID_HANDLE_VALUE, "Couldn't create input to console\n"); + herr = hout; + needs_close = TRUE; break; - case STARTUPINFO_STD: - si.dwFlags |= STARTF_USESTDHANDLES; - si.hStdInput = CreateFileA("CONIN$", GENERIC_READ, 0, &sa, OPEN_EXISTING, 0, 0); - ok(si.hStdInput != INVALID_HANDLE_VALUE, "Couldn't create input to console\n"); - si.hStdOutput = CreateFileA("CONOUT$", GENERIC_READ|GENERIC_WRITE, 0, &sa, OPEN_EXISTING, 0, 0); - ok(si.hStdInput != INVALID_HANDLE_VALUE, "Couldn't create output to console\n"); - si.hStdError = INVALID_HANDLE_VALUE; - inherit_handles = TRUE; + case H_FILE: + hin = CreateFileA("NUL", GENERIC_READ, 0, &sa, OPEN_EXISTING, 0, 0); + ok(hin != INVALID_HANDLE_VALUE, "Couldn't create input to console\n"); + hout = CreateFileA("NUL", GENERIC_READ|GENERIC_WRITE, 0, &sa, OPEN_EXISTING, 0, 0); + ok(hout != INVALID_HANDLE_VALUE, "Couldn't create input to console\n"); + herr = hout; + needs_close = TRUE; break; + default: + ok(0, "Unsupported handle type %x\n", args & ARG_MODEL_MASK); + return FALSE; } - res = CreateProcessA(NULL, buf, NULL, NULL, inherit_handles, flags, NULL, NULL, &si, &info); + if (args & ARG_STD) + { + SetStdHandle(STD_INPUT_HANDLE, hin); + SetStdHandle(STD_OUTPUT_HANDLE, hout); + SetStdHandle(STD_ERROR_HANDLE, herr); + } + else /* through startup info */ + { + si.dwFlags |= STARTF_USESTDHANDLES; + si.hStdInput = hin; + si.hStdOutput = hout; + si.hStdError = herr; + } + res = CreateProcessA(NULL, buf, NULL, NULL, !!(args & ARG_CP_INHERIT), flags, NULL, NULL, &si, &info); ok(res, "CreateProcess failed: %lu %s\n", GetLastError(), buf); CloseHandle(info.hThread); ret = WaitForSingleObject(info.hProcess, 30000); @@ -4997,18 +5025,11 @@ static BOOL check_child_console_bits(const char* exec, DWORD flags, enum inherit res = GetExitCodeProcess(info.hProcess, &exit_code); ok(res && exit_code == 0, "Couldn't get exit_code\n"); CloseHandle(info.hProcess); - switch (inherit) + if (needs_close) { - case NULL_STD: - break; - case CONSOLE_STD: - CloseHandle(GetStdHandle(STD_INPUT_HANDLE)); - CloseHandle(GetStdHandle(STD_OUTPUT_HANDLE)); - break; - case STARTUPINFO_STD: - CloseHandle(si.hStdInput); - CloseHandle(si.hStdOutput); - break; + CloseHandle(hin); + CloseHandle(hout); + if (hout != herr) CloseHandle(herr); } if (res) res = load_blackbox(blackbox_file, result, sizeof(*result)); @@ -5063,109 +5084,109 @@ static void test_CreateProcessCUI(void) { BOOL use_cui; DWORD cp_flags; - enum inheritance_model inherit; + unsigned args; DWORD expected; BOOL is_todo; DWORD is_broken; } no_console_tests[] = { -/* 0*/ {FALSE, 0, NULL_STD, CP_NO_STREAM}, - {FALSE, DETACHED_PROCESS, NULL_STD, CP_NO_STREAM}, - {FALSE, CREATE_NEW_CONSOLE, NULL_STD, CP_NO_STREAM}, - {FALSE, CREATE_NO_WINDOW, NULL_STD, CP_NO_STREAM}, - {FALSE, DETACHED_PROCESS | CREATE_NO_WINDOW, NULL_STD, CP_NO_STREAM}, -/* 5*/ {FALSE, CREATE_NEW_CONSOLE | CREATE_NO_WINDOW, NULL_STD, CP_NO_STREAM}, - - {TRUE, 0, NULL_STD, CP_OWN_CONSOLE | CP_WITH_WINDOW}, - {TRUE, DETACHED_PROCESS, NULL_STD, CP_NO_STREAM}, - {TRUE, CREATE_NEW_CONSOLE, NULL_STD, CP_OWN_CONSOLE | CP_WITH_WINDOW}, - {TRUE, CREATE_NO_WINDOW, NULL_STD, CP_OWN_CONSOLE}, -/*10*/ {TRUE, DETACHED_PROCESS | CREATE_NO_WINDOW, NULL_STD, CP_NO_STREAM}, - {TRUE, CREATE_NEW_CONSOLE | CREATE_NO_WINDOW, NULL_STD, CP_OWN_CONSOLE | CP_WITH_WINDOW}, +/* 0*/ {FALSE, 0, STD_NULL, CP_NO_STREAM}, + {FALSE, DETACHED_PROCESS, STD_NULL, CP_NO_STREAM}, + {FALSE, CREATE_NEW_CONSOLE, STD_NULL, CP_NO_STREAM}, + {FALSE, CREATE_NO_WINDOW, STD_NULL, CP_NO_STREAM}, + {FALSE, DETACHED_PROCESS | CREATE_NO_WINDOW, STD_NULL, CP_NO_STREAM}, +/* 5*/ {FALSE, CREATE_NEW_CONSOLE | CREATE_NO_WINDOW, STD_NULL, CP_NO_STREAM}, + + {TRUE, 0, STD_NULL, CP_OWN_CONSOLE | CP_WITH_WINDOW}, + {TRUE, DETACHED_PROCESS, STD_NULL, CP_NO_STREAM}, + {TRUE, CREATE_NEW_CONSOLE, STD_NULL, CP_OWN_CONSOLE | CP_WITH_WINDOW}, + {TRUE, CREATE_NO_WINDOW, STD_NULL, CP_OWN_CONSOLE}, +/*10*/ {TRUE, DETACHED_PROCESS | CREATE_NO_WINDOW, STD_NULL, CP_NO_STREAM}, + {TRUE, CREATE_NEW_CONSOLE | CREATE_NO_WINDOW, STD_NULL, CP_OWN_CONSOLE | CP_WITH_WINDOW}, }, with_console_tests[] = { -/* 0*/ {FALSE, 0, NULL_STD, CP_NO_STREAM}, - {FALSE, DETACHED_PROCESS, NULL_STD, CP_NO_STREAM}, - {FALSE, CREATE_NEW_CONSOLE, NULL_STD, CP_NO_STREAM}, - {FALSE, CREATE_NO_WINDOW, NULL_STD, CP_NO_STREAM}, - {FALSE, DETACHED_PROCESS | CREATE_NO_WINDOW, NULL_STD, CP_NO_STREAM}, -/* 5*/ {FALSE, CREATE_NEW_CONSOLE | CREATE_NO_WINDOW, NULL_STD, CP_NO_STREAM}, - - {FALSE, 0, CONSOLE_STD, CP_NO_STREAM, TRUE, .is_broken = CP_UNKNOWN_VALID}, - {FALSE, DETACHED_PROCESS, CONSOLE_STD, CP_NO_STREAM}, - {FALSE, CREATE_NEW_CONSOLE, CONSOLE_STD, CP_NO_STREAM}, - {FALSE, CREATE_NO_WINDOW, CONSOLE_STD, CP_NO_STREAM, TRUE}, -/*10*/ {FALSE, DETACHED_PROCESS | CREATE_NO_WINDOW, CONSOLE_STD, CP_NO_STREAM}, - {FALSE, CREATE_NEW_CONSOLE | CREATE_NO_WINDOW, CONSOLE_STD, CP_NO_STREAM}, - - {FALSE, 0, STARTUPINFO_STD, CP_NO_STREAM, TRUE, .is_broken = CP_UNKNOWN_VALID}, - {FALSE, DETACHED_PROCESS, STARTUPINFO_STD, CP_NO_STREAM, TRUE, .is_broken = CP_UNKNOWN_VALID}, - {FALSE, CREATE_NEW_CONSOLE, STARTUPINFO_STD, CP_NO_STREAM, TRUE, .is_broken = CP_UNKNOWN_VALID}, -/*15*/ {FALSE, CREATE_NO_WINDOW, STARTUPINFO_STD, CP_NO_STREAM, TRUE, .is_broken = CP_UNKNOWN_VALID}, - {FALSE, DETACHED_PROCESS | CREATE_NO_WINDOW, STARTUPINFO_STD, CP_NO_STREAM, TRUE, .is_broken = CP_UNKNOWN_VALID}, - {FALSE, CREATE_NEW_CONSOLE | CREATE_NO_WINDOW, STARTUPINFO_STD, CP_NO_STREAM, TRUE, .is_broken = CP_UNKNOWN_VALID}, - - {TRUE, 0, NULL_STD, CP_WITH_CONSOLE | CP_WITH_HANDLE | CP_WITH_WINDOW | CP_NO_STREAM}, - {TRUE, DETACHED_PROCESS, NULL_STD, CP_NO_STREAM}, -/*20*/ {TRUE, CREATE_NEW_CONSOLE, NULL_STD, CP_OWN_CONSOLE | CP_WITH_WINDOW}, - {TRUE, CREATE_NO_WINDOW, NULL_STD, CP_OWN_CONSOLE}, - {TRUE, DETACHED_PROCESS | CREATE_NO_WINDOW, NULL_STD, CP_NO_STREAM}, - {TRUE, CREATE_NEW_CONSOLE | CREATE_NO_WINDOW, NULL_STD, CP_OWN_CONSOLE | CP_WITH_WINDOW}, - - {TRUE, 0, CONSOLE_STD, CP_INH_CONSOLE | CP_WITH_WINDOW}, -/*25*/ {TRUE, DETACHED_PROCESS, CONSOLE_STD, CP_NO_STREAM}, - {TRUE, CREATE_NEW_CONSOLE, CONSOLE_STD, CP_OWN_CONSOLE | CP_WITH_WINDOW}, - {TRUE, CREATE_NO_WINDOW, CONSOLE_STD, CP_OWN_CONSOLE}, - {TRUE, DETACHED_PROCESS | CREATE_NO_WINDOW, CONSOLE_STD, CP_NO_STREAM}, - {TRUE, CREATE_NEW_CONSOLE | CREATE_NO_WINDOW, CONSOLE_STD, CP_OWN_CONSOLE | CP_WITH_WINDOW}, - -/*30*/ {TRUE, 0, STARTUPINFO_STD, CP_INH_CONSOLE | CP_WITH_WINDOW}, - {TRUE, DETACHED_PROCESS, STARTUPINFO_STD, CP_CHAR_VALID, .is_broken = CP_UNKNOWN_VALID}, - {TRUE, CREATE_NEW_CONSOLE, STARTUPINFO_STD, CP_OWN_CONSOLE | CP_WITH_WINDOW, .is_broken = CP_WITH_CONSOLE | CP_WITH_HANDLE | CP_WITH_WINDOW | CP_ALONE | CP_UNKNOWN_VALID}, - {TRUE, CREATE_NO_WINDOW, STARTUPINFO_STD, CP_OWN_CONSOLE, .is_broken = CP_WITH_CONSOLE | CP_WITH_HANDLE | CP_ALONE | CP_UNKNOWN_VALID}, - {TRUE, DETACHED_PROCESS | CREATE_NO_WINDOW, STARTUPINFO_STD, CP_CHAR_VALID, .is_broken = CP_NO_STREAM | CP_UNKNOWN_VALID}, -/*35*/ {TRUE, CREATE_NEW_CONSOLE | CREATE_NO_WINDOW, STARTUPINFO_STD, CP_OWN_CONSOLE | CP_WITH_WINDOW, .is_broken = CP_WITH_CONSOLE | CP_WITH_HANDLE | CP_WITH_WINDOW | CP_ALONE | CP_UNKNOWN_VALID}, +/* 0*/ {FALSE, 0, STD_NULL, CP_NO_STREAM}, + {FALSE, DETACHED_PROCESS, STD_NULL, CP_NO_STREAM}, + {FALSE, CREATE_NEW_CONSOLE, STD_NULL, CP_NO_STREAM}, + {FALSE, CREATE_NO_WINDOW, STD_NULL, CP_NO_STREAM}, + {FALSE, DETACHED_PROCESS | CREATE_NO_WINDOW, STD_NULL, CP_NO_STREAM}, +/* 5*/ {FALSE, CREATE_NEW_CONSOLE | CREATE_NO_WINDOW, STD_NULL, CP_NO_STREAM}, + + {FALSE, 0, STD_CONSOLE, CP_NO_STREAM, TRUE, .is_broken = CP_UNKNOWN_VALID}, + {FALSE, DETACHED_PROCESS, STD_CONSOLE, CP_NO_STREAM}, + {FALSE, CREATE_NEW_CONSOLE, STD_CONSOLE, CP_NO_STREAM}, + {FALSE, CREATE_NO_WINDOW, STD_CONSOLE, CP_NO_STREAM, TRUE}, +/*10*/ {FALSE, DETACHED_PROCESS | CREATE_NO_WINDOW, STD_CONSOLE, CP_NO_STREAM}, + {FALSE, CREATE_NEW_CONSOLE | CREATE_NO_WINDOW, STD_CONSOLE, CP_NO_STREAM}, + + {FALSE, 0, STINFO_CONSOLE, CP_NO_STREAM, TRUE, .is_broken = CP_UNKNOWN_VALID}, + {FALSE, DETACHED_PROCESS, STINFO_CONSOLE, CP_NO_STREAM, TRUE, .is_broken = CP_UNKNOWN_VALID}, + {FALSE, CREATE_NEW_CONSOLE, STINFO_CONSOLE, CP_NO_STREAM, TRUE, .is_broken = CP_UNKNOWN_VALID}, +/*15*/ {FALSE, CREATE_NO_WINDOW, STINFO_CONSOLE, CP_NO_STREAM, TRUE, .is_broken = CP_UNKNOWN_VALID}, + {FALSE, DETACHED_PROCESS | CREATE_NO_WINDOW, STINFO_CONSOLE, CP_NO_STREAM, TRUE, .is_broken = CP_UNKNOWN_VALID}, + {FALSE, CREATE_NEW_CONSOLE | CREATE_NO_WINDOW, STINFO_CONSOLE, CP_NO_STREAM, TRUE, .is_broken = CP_UNKNOWN_VALID}, + + {TRUE, 0, STD_NULL, CP_WITH_CONSOLE | CP_WITH_HANDLE | CP_WITH_WINDOW | CP_NO_STREAM}, + {TRUE, DETACHED_PROCESS, STD_NULL, CP_NO_STREAM}, +/*20*/ {TRUE, CREATE_NEW_CONSOLE, STD_NULL, CP_OWN_CONSOLE | CP_WITH_WINDOW}, + {TRUE, CREATE_NO_WINDOW, STD_NULL, CP_OWN_CONSOLE}, + {TRUE, DETACHED_PROCESS | CREATE_NO_WINDOW, STD_NULL, CP_NO_STREAM}, + {TRUE, CREATE_NEW_CONSOLE | CREATE_NO_WINDOW, STD_NULL, CP_OWN_CONSOLE | CP_WITH_WINDOW}, + + {TRUE, 0, STD_CONSOLE, CP_INH_CONSOLE | CP_WITH_WINDOW}, +/*25*/ {TRUE, DETACHED_PROCESS, STD_CONSOLE, CP_NO_STREAM}, + {TRUE, CREATE_NEW_CONSOLE, STD_CONSOLE, CP_OWN_CONSOLE | CP_WITH_WINDOW}, + {TRUE, CREATE_NO_WINDOW, STD_CONSOLE, CP_OWN_CONSOLE}, + {TRUE, DETACHED_PROCESS | CREATE_NO_WINDOW, STD_CONSOLE, CP_NO_STREAM}, + {TRUE, CREATE_NEW_CONSOLE | CREATE_NO_WINDOW, STD_CONSOLE, CP_OWN_CONSOLE | CP_WITH_WINDOW}, + +/*30*/ {TRUE, 0, STINFO_CONSOLE, CP_INH_CONSOLE | CP_WITH_WINDOW}, + {TRUE, DETACHED_PROCESS, STINFO_CONSOLE, CP_CHAR_VALID, .is_broken = CP_UNKNOWN_VALID}, + {TRUE, CREATE_NEW_CONSOLE, STINFO_CONSOLE, CP_OWN_CONSOLE | CP_WITH_WINDOW, .is_broken = CP_WITH_CONSOLE | CP_WITH_HANDLE | CP_WITH_WINDOW | CP_ALONE | CP_UNKNOWN_VALID}, + {TRUE, CREATE_NO_WINDOW, STINFO_CONSOLE, CP_OWN_CONSOLE, .is_broken = CP_WITH_CONSOLE | CP_WITH_HANDLE | CP_ALONE | CP_UNKNOWN_VALID}, + {TRUE, DETACHED_PROCESS | CREATE_NO_WINDOW, STINFO_CONSOLE, CP_CHAR_VALID, .is_broken = CP_NO_STREAM | CP_UNKNOWN_VALID}, +/*35*/ {TRUE, CREATE_NEW_CONSOLE | CREATE_NO_WINDOW, STINFO_CONSOLE, CP_OWN_CONSOLE | CP_WITH_WINDOW, .is_broken = CP_WITH_CONSOLE | CP_WITH_HANDLE | CP_WITH_WINDOW | CP_ALONE | CP_UNKNOWN_VALID}, }; static struct group_flags_tests { /* input */ BOOL use_cui; DWORD cp_flags; - enum inheritance_model inherit; + unsigned args; BOOL noctrl_flag; /* output */ DWORD expected; BOOL is_todo; - DWORD is_broken; + BOOL is_broken; /* Win7: console are of UNKNOWN file type */ } group_flags_tests[] = { -/* 0 */ {TRUE, 0, CONSOLE_STD, TRUE, CP_INH_CONSOLE | CP_WITH_WINDOW}, - {TRUE, CREATE_NEW_PROCESS_GROUP, CONSOLE_STD, TRUE, CP_INH_CONSOLE | CP_WITH_WINDOW | CP_GROUP_LEADER}, - {TRUE, 0, CONSOLE_STD, FALSE, CP_INH_CONSOLE | CP_WITH_WINDOW | CP_ENABLED_CTRLC}, - {TRUE, CREATE_NEW_PROCESS_GROUP, CONSOLE_STD, FALSE, CP_INH_CONSOLE | CP_WITH_WINDOW | CP_GROUP_LEADER}, - {TRUE, 0, STARTUPINFO_STD, TRUE, CP_INH_CONSOLE | CP_WITH_WINDOW}, -/* 5 */ {TRUE, CREATE_NEW_PROCESS_GROUP, STARTUPINFO_STD, TRUE, CP_INH_CONSOLE | CP_WITH_WINDOW | CP_GROUP_LEADER}, - {TRUE, 0, STARTUPINFO_STD, FALSE, CP_INH_CONSOLE | CP_WITH_WINDOW | CP_ENABLED_CTRLC}, - {TRUE, CREATE_NEW_PROCESS_GROUP, STARTUPINFO_STD, FALSE, CP_INH_CONSOLE | CP_WITH_WINDOW | CP_GROUP_LEADER}, - {FALSE, 0, CONSOLE_STD, TRUE, CP_NO_STREAM, .is_todo = TRUE, .is_broken = CP_UNKNOWN_VALID}, - {FALSE, CREATE_NEW_PROCESS_GROUP, CONSOLE_STD, TRUE, CP_GROUP_LEADER | CP_NO_STREAM, .is_todo = TRUE, .is_broken = CP_UNKNOWN_VALID}, -/* 10 */ {FALSE, 0, CONSOLE_STD, FALSE, CP_ENABLED_CTRLC | CP_NO_STREAM, .is_todo = TRUE, .is_broken = CP_ENABLED_CTRLC | CP_UNKNOWN_VALID}, - {FALSE, CREATE_NEW_PROCESS_GROUP, CONSOLE_STD, FALSE, CP_GROUP_LEADER | CP_NO_STREAM, .is_todo = TRUE, .is_broken = CP_UNKNOWN_VALID}, - {FALSE, 0, STARTUPINFO_STD, TRUE, CP_NO_STREAM, .is_todo = TRUE, .is_broken = CP_UNKNOWN_VALID}, - {FALSE, CREATE_NEW_PROCESS_GROUP, STARTUPINFO_STD, TRUE, CP_GROUP_LEADER | CP_NO_STREAM, .is_todo = TRUE, .is_broken = CP_UNKNOWN_VALID}, - {FALSE, 0, STARTUPINFO_STD, FALSE, CP_ENABLED_CTRLC | CP_NO_STREAM, .is_todo = TRUE, .is_broken = CP_ENABLED_CTRLC | CP_UNKNOWN_VALID}, -/* 15 */ {FALSE, CREATE_NEW_PROCESS_GROUP, STARTUPINFO_STD, FALSE, CP_GROUP_LEADER | CP_NO_STREAM, .is_todo = TRUE, .is_broken = CP_UNKNOWN_VALID}, - {TRUE, CREATE_NEW_PROCESS_GROUP | CREATE_NEW_CONSOLE, CONSOLE_STD, TRUE, CP_INH_CONSOLE | CP_WITH_WINDOW | CP_GROUP_LEADER | CP_ALONE}, - {FALSE, CREATE_NEW_PROCESS_GROUP | CREATE_NEW_CONSOLE, CONSOLE_STD, TRUE, CP_GROUP_LEADER | CP_NO_STREAM}, - {TRUE, CREATE_NEW_PROCESS_GROUP | CREATE_NEW_CONSOLE, CONSOLE_STD, FALSE, CP_INH_CONSOLE | CP_WITH_WINDOW | CP_GROUP_LEADER | CP_ALONE | CP_ENABLED_CTRLC}, - {FALSE, CREATE_NEW_PROCESS_GROUP | CREATE_NEW_CONSOLE, CONSOLE_STD, FALSE, CP_GROUP_LEADER | CP_ENABLED_CTRLC | CP_NO_STREAM}, -/* 20 */ {TRUE, CREATE_NEW_PROCESS_GROUP | DETACHED_PROCESS, CONSOLE_STD, TRUE, CP_GROUP_LEADER | CP_NO_STREAM}, - {FALSE, CREATE_NEW_PROCESS_GROUP | DETACHED_PROCESS, CONSOLE_STD, TRUE, CP_GROUP_LEADER | CP_NO_STREAM}, - {TRUE, CREATE_NEW_PROCESS_GROUP | DETACHED_PROCESS, CONSOLE_STD, FALSE, CP_GROUP_LEADER | CP_NO_STREAM}, - {FALSE, CREATE_NEW_PROCESS_GROUP | DETACHED_PROCESS, CONSOLE_STD, FALSE, CP_GROUP_LEADER | CP_NO_STREAM}, +/* 0 */ {TRUE, 0, STD_CONSOLE, TRUE, CP_INH_CONSOLE | CP_WITH_WINDOW}, + {TRUE, CREATE_NEW_PROCESS_GROUP, STD_CONSOLE, TRUE, CP_INH_CONSOLE | CP_WITH_WINDOW | CP_GROUP_LEADER}, + {TRUE, 0, STD_CONSOLE, FALSE, CP_INH_CONSOLE | CP_WITH_WINDOW | CP_ENABLED_CTRLC}, + {TRUE, CREATE_NEW_PROCESS_GROUP, STD_CONSOLE, FALSE, CP_INH_CONSOLE | CP_WITH_WINDOW | CP_GROUP_LEADER}, + {TRUE, 0, STINFO_CONSOLE, TRUE, CP_INH_CONSOLE | CP_WITH_WINDOW}, +/* 5 */ {TRUE, CREATE_NEW_PROCESS_GROUP, STINFO_CONSOLE, TRUE, CP_INH_CONSOLE | CP_WITH_WINDOW | CP_GROUP_LEADER}, + {TRUE, 0, STINFO_CONSOLE, FALSE, CP_INH_CONSOLE | CP_WITH_WINDOW | CP_ENABLED_CTRLC}, + {TRUE, CREATE_NEW_PROCESS_GROUP, STINFO_CONSOLE, FALSE, CP_INH_CONSOLE | CP_WITH_WINDOW | CP_GROUP_LEADER}, + {FALSE, 0, STD_CONSOLE, TRUE, CP_NO_STREAM, .is_todo = TRUE, .is_broken = CP_UNKNOWN_VALID}, + {FALSE, CREATE_NEW_PROCESS_GROUP, STD_CONSOLE, TRUE, CP_GROUP_LEADER | CP_NO_STREAM, .is_todo = TRUE, .is_broken = CP_UNKNOWN_VALID}, +/* 10 */ {FALSE, 0, STD_CONSOLE, FALSE, CP_ENABLED_CTRLC | CP_NO_STREAM, .is_todo = TRUE, .is_broken = CP_ENABLED_CTRLC | CP_UNKNOWN_VALID}, + {FALSE, CREATE_NEW_PROCESS_GROUP, STD_CONSOLE, FALSE, CP_GROUP_LEADER | CP_NO_STREAM, .is_todo = TRUE, .is_broken = CP_UNKNOWN_VALID}, + {FALSE, 0, STINFO_CONSOLE, TRUE, CP_NO_STREAM, .is_todo = TRUE, .is_broken = CP_UNKNOWN_VALID}, + {FALSE, CREATE_NEW_PROCESS_GROUP, STINFO_CONSOLE, TRUE, CP_GROUP_LEADER | CP_NO_STREAM, .is_todo = TRUE, .is_broken = CP_UNKNOWN_VALID}, + {FALSE, 0, STINFO_CONSOLE, FALSE, CP_ENABLED_CTRLC | CP_NO_STREAM, .is_todo = TRUE, .is_broken = CP_ENABLED_CTRLC | CP_UNKNOWN_VALID}, +/* 15 */ {FALSE, CREATE_NEW_PROCESS_GROUP, STINFO_CONSOLE, FALSE, CP_GROUP_LEADER | CP_NO_STREAM, .is_todo = TRUE, .is_broken = CP_UNKNOWN_VALID}, + {TRUE, CREATE_NEW_PROCESS_GROUP | CREATE_NEW_CONSOLE, STD_CONSOLE, TRUE, CP_INH_CONSOLE | CP_WITH_WINDOW | CP_GROUP_LEADER | CP_ALONE}, + {FALSE, CREATE_NEW_PROCESS_GROUP | CREATE_NEW_CONSOLE, STD_CONSOLE, TRUE, CP_GROUP_LEADER | CP_NO_STREAM}, + {TRUE, CREATE_NEW_PROCESS_GROUP | CREATE_NEW_CONSOLE, STD_CONSOLE, FALSE, CP_INH_CONSOLE | CP_WITH_WINDOW | CP_GROUP_LEADER | CP_ALONE | CP_ENABLED_CTRLC}, + {FALSE, CREATE_NEW_PROCESS_GROUP | CREATE_NEW_CONSOLE, STD_CONSOLE, FALSE, CP_GROUP_LEADER | CP_ENABLED_CTRLC | CP_NO_STREAM}, +/* 20 */ {TRUE, CREATE_NEW_PROCESS_GROUP | DETACHED_PROCESS, STD_CONSOLE, TRUE, CP_GROUP_LEADER | CP_NO_STREAM}, + {FALSE, CREATE_NEW_PROCESS_GROUP | DETACHED_PROCESS, STD_CONSOLE, TRUE, CP_GROUP_LEADER | CP_NO_STREAM}, + {TRUE, CREATE_NEW_PROCESS_GROUP | DETACHED_PROCESS, STD_CONSOLE, FALSE, CP_GROUP_LEADER | CP_NO_STREAM}, + {FALSE, CREATE_NEW_PROCESS_GROUP | DETACHED_PROCESS, STD_CONSOLE, FALSE, CP_GROUP_LEADER | CP_NO_STREAM}, };
hstd[0] = GetStdHandle(STD_INPUT_HANDLE); @@ -5186,7 +5207,7 @@ static void test_CreateProcessCUI(void) { res = check_child_console_bits(no_console_tests[i].use_cui ? cuiexec : guiexec, no_console_tests[i].cp_flags, - no_console_tests[i].inherit, + no_console_tests[i].args, &result); ok(res, "Couldn't run child\n"); todo_wine_if(no_console_tests[i].is_todo) @@ -5200,7 +5221,7 @@ static void test_CreateProcessCUI(void) { res = check_child_console_bits(with_console_tests[i].use_cui ? cuiexec : guiexec, with_console_tests[i].cp_flags, - with_console_tests[i].inherit, + with_console_tests[i].args, &result); ok(res, "Couldn't run child\n"); todo_wine_if(with_console_tests[i].is_todo) @@ -5218,12 +5239,12 @@ static void test_CreateProcessCUI(void) ok(res, "Couldn't set ctrl handler\n"); res = check_child_console_bits(group_flags_tests[i].use_cui ? cuiexec : guiexec, group_flags_tests[i].cp_flags, - group_flags_tests[i].inherit, + group_flags_tests[i].args, &result); todo_wine_if(group_flags_tests[i].is_todo) ok(result.bitmask == group_flags_tests[i].expected || - /* Win7 doesn't report group id */ - broken(result.bitmask == (group_flags_tests[i].expected & ~CP_GROUP_LEADER)), + broken(result.bitmask == (group_flags_tests[i].expected & ~CP_GROUP_LEADER)) /* Win7 */ || + broken(group_flags_tests[i].is_broken && result.bitmask == group_flags_tests[i].is_broken), "[%d] Unexpected result %x (%lx)\n", i, result.bitmask, group_flags_tests[i].expected); }