From: Eric Pouech epouech@codeweavers.com
Signed-off-by: Eric Pouech epouech@codeweavers.com --- dlls/kernel32/tests/console.c | 201 +++++++++++++++++++++------------- 1 file changed, 124 insertions(+), 77 deletions(-)
diff --git a/dlls/kernel32/tests/console.c b/dlls/kernel32/tests/console.c index 49d7d56eb68..3b607db917c 100644 --- a/dlls/kernel32/tests/console.c +++ b/dlls/kernel32/tests/console.c @@ -5016,17 +5016,39 @@ static BOOL check_child_console_bits(const char* exec, DWORD flags, enum inherit return res; }
-#define CP_WITH_CONSOLE 0x01 /* attached to a console */ -#define CP_WITH_HANDLE 0x02 /* child has a console handle */ -#define CP_WITH_WINDOW 0x04 /* child has a console window */ -#define CP_ALONE 0x08 /* whether child is the single process attached to console */ -#define CP_GROUP_LEADER 0x10 /* whether the child is the process group leader */ -#define CP_INPUT_VALID 0x20 /* whether StdHandle(INPUT) is a valid console handle */ -#define CP_OUTPUT_VALID 0x40 /* whether StdHandle(OUTPUT) is a valid console handle */ -#define CP_ENABLED_CTRLC 0x80 /* whether the ctrl-c handling isn't blocked */ - -#define CP_OWN_CONSOLE (CP_WITH_CONSOLE | CP_WITH_HANDLE | CP_INPUT_VALID | CP_OUTPUT_VALID | CP_ALONE) -#define CP_INH_CONSOLE (CP_WITH_CONSOLE | CP_WITH_HANDLE | CP_INPUT_VALID | CP_OUTPUT_VALID) +/* generic byte mapping: gg__ooii: + * g=global bits, __ unused, oo output stream, ii input stream + * per stream: at + * b=attr bits, t=FILE_TYPE_{UNKNOWN, CHAR, PIPE, FILE} + */ + +#define CP_WITH_CONSOLE 0x80000000 /* attached to a console */ +#define CP_WITH_HANDLE 0x40000000 /* child has a console handle */ +#define CP_WITH_WINDOW 0x20000000 /* child has a console window */ +#define CP_ALONE 0x10000000 /* whether child is the single process attached to console */ +#define CP_GROUP_LEADER 0x08000000 /* whether the child is the process group leader */ +#define CP_ENABLED_CTRLC 0x04000000 /* whether the ctrl-c handling isn't blocked */ +#define CP_BROKEN 0x02000000 /* pseudo flag to pass 0 broken values in test results */ + +#define CP_STREAM_WIDTH 8 +#define CP_STREAM_MASK ((1 << (2 * CP_STREAM_WIDTH)) - 1) +#define CP_STREAM_ATTR(x) (((a) >> 2) & 3) +#define CP_STREAM_ATTR_NULL 0x08 /* NULL handle value */ +#define CP_STREAM_ATTR_INVALID 0x04 /* INVALID_HANDLE_VALUE */ +#define CP_STREAM_ATTR_GARBAGE 0x00 /* value different from 2 above, but not a valid handle */ +#define CP_STREAM_ATTR_TYPE 0x0c /* valid handle, with type set */ +#define CP_STREAM_INHERIT 0x10 /* inheritance flag set */ +#define CP_STREAM_(v, s) ((v) << ((s) * CP_STREAM_WIDTH)) +#define CP_INPUT_STREAM 0 +#define CP_OUTPUT_STREAM 1 + +#define CP_STRMIO_NONE (CP_STREAM_(CP_STREAM_ATTR_NULL, CP_INPUT_STREAM) | CP_STREAM_(CP_STREAM_ATTR_NULL, CP_OUTPUT_STREAM)) +#define CP_STRMIO_CHAR (CP_STREAM_(CP_STREAM_INHERIT | CP_STREAM_ATTR_TYPE | FILE_TYPE_CHAR, CP_INPUT_STREAM) | \ + CP_STREAM_(CP_STREAM_INHERIT | CP_STREAM_ATTR_TYPE | FILE_TYPE_CHAR, CP_OUTPUT_STREAM)) + +#define CP_HAS_CONSOLE_WIN (CP_WITH_CONSOLE | CP_WITH_HANDLE | CP_WITH_WINDOW) +#define CP_OWN_CONSOLE (CP_WITH_CONSOLE | CP_WITH_HANDLE | CP_STRMIO_CHAR | CP_ALONE) +#define CP_INH_CONSOLE (CP_WITH_CONSOLE | CP_WITH_HANDLE | CP_STRMIO_CHAR)
static void test_CreateProcessCUI(void) { @@ -5050,62 +5072,62 @@ static void test_CreateProcessCUI(void) } no_console_tests[] = { -/* 0*/ {FALSE, 0, NULL_STD, 0}, - {FALSE, DETACHED_PROCESS, NULL_STD, 0}, - {FALSE, CREATE_NEW_CONSOLE, NULL_STD, 0}, - {FALSE, CREATE_NO_WINDOW, NULL_STD, 0}, - {FALSE, DETACHED_PROCESS | CREATE_NO_WINDOW, NULL_STD, 0}, -/* 5*/ {FALSE, CREATE_NEW_CONSOLE | CREATE_NO_WINDOW, NULL_STD, 0}, +/* 0*/ {FALSE, 0, NULL_STD, CP_STRMIO_NONE}, + {FALSE, DETACHED_PROCESS, NULL_STD, CP_STRMIO_NONE}, + {FALSE, CREATE_NEW_CONSOLE, NULL_STD, CP_STRMIO_NONE}, + {FALSE, CREATE_NO_WINDOW, NULL_STD, CP_STRMIO_NONE}, + {FALSE, DETACHED_PROCESS | CREATE_NO_WINDOW, NULL_STD, CP_STRMIO_NONE}, +/* 5*/ {FALSE, CREATE_NEW_CONSOLE | CREATE_NO_WINDOW, NULL_STD, CP_STRMIO_NONE},
{TRUE, 0, NULL_STD, CP_OWN_CONSOLE | CP_WITH_WINDOW}, - {TRUE, DETACHED_PROCESS, NULL_STD, 0}, + {TRUE, DETACHED_PROCESS, NULL_STD, CP_STRMIO_NONE}, {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, 0}, +/*10*/ {TRUE, DETACHED_PROCESS | CREATE_NO_WINDOW, NULL_STD, CP_STRMIO_NONE}, {TRUE, CREATE_NEW_CONSOLE | CREATE_NO_WINDOW, NULL_STD, CP_OWN_CONSOLE | CP_WITH_WINDOW}, }, with_console_tests[] = { -/* 0*/ {FALSE, 0, NULL_STD, 0}, - {FALSE, DETACHED_PROCESS, NULL_STD, 0}, - {FALSE, CREATE_NEW_CONSOLE, NULL_STD, 0}, - {FALSE, CREATE_NO_WINDOW, NULL_STD, 0}, - {FALSE, DETACHED_PROCESS | CREATE_NO_WINDOW, NULL_STD, 0}, -/* 5*/ {FALSE, CREATE_NEW_CONSOLE | CREATE_NO_WINDOW, NULL_STD, 0}, - - {FALSE, 0, CONSOLE_STD, 0, TRUE}, - {FALSE, DETACHED_PROCESS, CONSOLE_STD, 0}, - {FALSE, CREATE_NEW_CONSOLE, CONSOLE_STD, 0}, - {FALSE, CREATE_NO_WINDOW, CONSOLE_STD, 0, TRUE}, -/*10*/ {FALSE, DETACHED_PROCESS | CREATE_NO_WINDOW, CONSOLE_STD, 0}, - {FALSE, CREATE_NEW_CONSOLE | CREATE_NO_WINDOW, CONSOLE_STD, 0}, - - {FALSE, 0, STARTUPINFO_STD, 0, TRUE}, - {FALSE, DETACHED_PROCESS, STARTUPINFO_STD, 0, TRUE}, - {FALSE, CREATE_NEW_CONSOLE, STARTUPINFO_STD, 0, TRUE}, -/*15*/ {FALSE, CREATE_NO_WINDOW, STARTUPINFO_STD, 0, TRUE}, - {FALSE, DETACHED_PROCESS | CREATE_NO_WINDOW, STARTUPINFO_STD, 0, TRUE}, - {FALSE, CREATE_NEW_CONSOLE | CREATE_NO_WINDOW, STARTUPINFO_STD, 0, TRUE}, - - {TRUE, 0, NULL_STD, CP_WITH_CONSOLE | CP_WITH_HANDLE | CP_WITH_WINDOW}, - {TRUE, DETACHED_PROCESS, NULL_STD, 0}, +/* 0*/ {FALSE, 0, NULL_STD, CP_STRMIO_NONE}, + {FALSE, DETACHED_PROCESS, NULL_STD, CP_STRMIO_NONE}, + {FALSE, CREATE_NEW_CONSOLE, NULL_STD, CP_STRMIO_NONE}, + {FALSE, CREATE_NO_WINDOW, NULL_STD, CP_STRMIO_NONE}, + {FALSE, DETACHED_PROCESS | CREATE_NO_WINDOW, NULL_STD, CP_STRMIO_NONE}, +/* 5*/ {FALSE, CREATE_NEW_CONSOLE | CREATE_NO_WINDOW, NULL_STD, CP_STRMIO_NONE}, + + {FALSE, 0, CONSOLE_STD, CP_STRMIO_NONE, TRUE, .is_broken = CP_BROKEN}, + {FALSE, DETACHED_PROCESS, CONSOLE_STD, CP_STRMIO_NONE}, + {FALSE, CREATE_NEW_CONSOLE, CONSOLE_STD, CP_STRMIO_NONE}, + {FALSE, CREATE_NO_WINDOW, CONSOLE_STD, CP_STRMIO_NONE, TRUE}, +/*10*/ {FALSE, DETACHED_PROCESS | CREATE_NO_WINDOW, CONSOLE_STD, CP_STRMIO_NONE}, + {FALSE, CREATE_NEW_CONSOLE | CREATE_NO_WINDOW, CONSOLE_STD, CP_STRMIO_NONE}, + + {FALSE, 0, STARTUPINFO_STD, CP_STRMIO_NONE, TRUE, .is_broken = CP_BROKEN}, + {FALSE, DETACHED_PROCESS, STARTUPINFO_STD, CP_STRMIO_NONE, TRUE, .is_broken = CP_BROKEN}, + {FALSE, CREATE_NEW_CONSOLE, STARTUPINFO_STD, CP_STRMIO_NONE, TRUE, .is_broken = CP_BROKEN}, +/*15*/ {FALSE, CREATE_NO_WINDOW, STARTUPINFO_STD, CP_STRMIO_NONE, TRUE, .is_broken = CP_BROKEN}, + {FALSE, DETACHED_PROCESS | CREATE_NO_WINDOW, STARTUPINFO_STD, CP_STRMIO_NONE, TRUE, .is_broken = CP_BROKEN}, + {FALSE, CREATE_NEW_CONSOLE | CREATE_NO_WINDOW, STARTUPINFO_STD, CP_STRMIO_NONE, TRUE, .is_broken = CP_BROKEN}, + + {TRUE, 0, NULL_STD, CP_HAS_CONSOLE_WIN | CP_STRMIO_NONE}, + {TRUE, DETACHED_PROCESS, NULL_STD, CP_STRMIO_NONE}, /*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, 0}, + {TRUE, DETACHED_PROCESS | CREATE_NO_WINDOW, NULL_STD, CP_STRMIO_NONE}, {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, 0}, +/*25*/ {TRUE, DETACHED_PROCESS, CONSOLE_STD, CP_STRMIO_NONE}, {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, 0}, + {TRUE, DETACHED_PROCESS | CREATE_NO_WINDOW, CONSOLE_STD, CP_STRMIO_NONE}, {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_INPUT_VALID | CP_OUTPUT_VALID, .is_broken = 0x100}, + {TRUE, DETACHED_PROCESS, STARTUPINFO_STD, CP_STRMIO_CHAR, .is_broken = CP_BROKEN}, {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}, {TRUE, CREATE_NO_WINDOW, STARTUPINFO_STD, CP_OWN_CONSOLE, .is_broken = CP_WITH_CONSOLE | CP_WITH_HANDLE | CP_ALONE}, - {TRUE, DETACHED_PROCESS | CREATE_NO_WINDOW, STARTUPINFO_STD, CP_INPUT_VALID | CP_OUTPUT_VALID, .is_broken = 0x100}, + {TRUE, DETACHED_PROCESS | CREATE_NO_WINDOW, STARTUPINFO_STD, CP_STRMIO_CHAR, .is_broken = CP_BROKEN}, /*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}, }; static struct group_flags_tests @@ -5118,33 +5140,34 @@ static void test_CreateProcessCUI(void) /* output */ DWORD expected; BOOL is_todo; + DWORD is_broken; } 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, 0, .is_todo = TRUE}, - {FALSE, CREATE_NEW_PROCESS_GROUP, CONSOLE_STD, TRUE, CP_GROUP_LEADER, .is_todo = TRUE}, -/* 10 */ {FALSE, 0, CONSOLE_STD, FALSE, CP_ENABLED_CTRLC, .is_todo = TRUE}, - {FALSE, CREATE_NEW_PROCESS_GROUP, CONSOLE_STD, FALSE, CP_GROUP_LEADER, .is_todo = TRUE}, - {FALSE, 0, STARTUPINFO_STD, TRUE, 0, .is_todo = TRUE}, - {FALSE, CREATE_NEW_PROCESS_GROUP, STARTUPINFO_STD, TRUE, CP_GROUP_LEADER, .is_todo = TRUE}, - {FALSE, 0, STARTUPINFO_STD, FALSE, CP_ENABLED_CTRLC, .is_todo = TRUE}, -/* 15 */ {FALSE, CREATE_NEW_PROCESS_GROUP, STARTUPINFO_STD, FALSE, CP_GROUP_LEADER, .is_todo = TRUE}, - {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}, - {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}, -/* 20 */ {TRUE, CREATE_NEW_PROCESS_GROUP | DETACHED_PROCESS, CONSOLE_STD, TRUE, CP_GROUP_LEADER}, - {FALSE, CREATE_NEW_PROCESS_GROUP | DETACHED_PROCESS, CONSOLE_STD, TRUE, CP_GROUP_LEADER}, - {TRUE, CREATE_NEW_PROCESS_GROUP | DETACHED_PROCESS, CONSOLE_STD, FALSE, CP_GROUP_LEADER}, - {FALSE, CREATE_NEW_PROCESS_GROUP | DETACHED_PROCESS, CONSOLE_STD, FALSE, CP_GROUP_LEADER}, +/* 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_STRMIO_NONE, .is_todo = TRUE, .is_broken = CP_BROKEN}, + {FALSE, CREATE_NEW_PROCESS_GROUP, CONSOLE_STD, TRUE, CP_GROUP_LEADER | CP_STRMIO_NONE, .is_todo = TRUE, .is_broken = CP_BROKEN}, +/* 10 */ {FALSE, 0, CONSOLE_STD, FALSE, CP_ENABLED_CTRLC | CP_STRMIO_NONE, .is_todo = TRUE, .is_broken = CP_ENABLED_CTRLC}, + {FALSE, CREATE_NEW_PROCESS_GROUP, CONSOLE_STD, FALSE, CP_GROUP_LEADER | CP_STRMIO_NONE, .is_todo = TRUE, .is_broken = CP_BROKEN}, + {FALSE, 0, STARTUPINFO_STD, TRUE, CP_STRMIO_NONE, .is_todo = TRUE, .is_broken = CP_BROKEN}, + {FALSE, CREATE_NEW_PROCESS_GROUP, STARTUPINFO_STD, TRUE, CP_GROUP_LEADER | CP_STRMIO_NONE, .is_todo = TRUE, .is_broken = CP_BROKEN}, + {FALSE, 0, STARTUPINFO_STD, FALSE, CP_ENABLED_CTRLC | CP_STRMIO_NONE, .is_todo = TRUE, .is_broken = CP_ENABLED_CTRLC}, +/* 15 */ {FALSE, CREATE_NEW_PROCESS_GROUP, STARTUPINFO_STD, FALSE, CP_GROUP_LEADER | CP_STRMIO_NONE, .is_todo = TRUE, .is_broken = CP_BROKEN}, + {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_STRMIO_NONE}, + {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_STRMIO_NONE}, +/* 20 */ {TRUE, CREATE_NEW_PROCESS_GROUP | DETACHED_PROCESS, CONSOLE_STD, TRUE, CP_GROUP_LEADER | CP_STRMIO_NONE}, + {FALSE, CREATE_NEW_PROCESS_GROUP | DETACHED_PROCESS, CONSOLE_STD, TRUE, CP_GROUP_LEADER | CP_STRMIO_NONE}, + {TRUE, CREATE_NEW_PROCESS_GROUP | DETACHED_PROCESS, CONSOLE_STD, FALSE, CP_GROUP_LEADER | CP_STRMIO_NONE}, + {FALSE, CREATE_NEW_PROCESS_GROUP | DETACHED_PROCESS, CONSOLE_STD, FALSE, CP_GROUP_LEADER | CP_STRMIO_NONE}, };
hstd[0] = GetStdHandle(STD_INPUT_HANDLE); @@ -5184,7 +5207,7 @@ static void test_CreateProcessCUI(void) ok(res, "Couldn't run child\n"); todo_wine_if(with_console_tests[i].is_todo) ok(result.bitmask == with_console_tests[i].expected || - broken(with_console_tests[i].is_broken && result.bitmask == (with_console_tests[i].is_broken & 0xff)), + broken(with_console_tests[i].is_broken && result.bitmask == (with_console_tests[i].is_broken & ~CP_BROKEN)), "[%d] Unexpected result %x (%lx)\n", i, result.bitmask, with_console_tests[i].expected); } @@ -5202,7 +5225,8 @@ static void test_CreateProcessCUI(void) 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)) || + broken(group_flags_tests[i].is_broken && result.bitmask == (group_flags_tests[i].is_broken & ~CP_BROKEN)), "[%d] Unexpected result %x (%lx)\n", i, result.bitmask, group_flags_tests[i].expected); } @@ -5353,6 +5377,31 @@ static void test_CtrlHandlerSubsystem(void) DeleteFileA(cuiexec); }
+static unsigned encode_handle(DWORD std) +{ + HANDLE h = GetStdHandle(std); + DWORD dw; + unsigned result; + + if (h == NULL) + result = CP_STREAM_ATTR_NULL; + else if (h == INVALID_HANDLE_VALUE) + result = CP_STREAM_ATTR_INVALID; + else if (!GetHandleInformation(h, &dw)) + result = CP_STREAM_ATTR_GARBAGE; + else + { + result = CP_STREAM_ATTR_TYPE; + if (dw & HANDLE_FLAG_INHERIT) + result |= CP_STREAM_INHERIT; + dw = GetFileType(h); + /* only report DISK, PIPE and CHAR */ + if (dw > 3) dw = FILE_TYPE_UNKNOWN; + result |= dw; + } + return result; +} + START_TEST(console) { HANDLE hConIn, hConOut, revert_output = NULL, unbound_output; @@ -5411,12 +5460,10 @@ START_TEST(console) sizeof(RtlGetCurrentPeb()->ProcessParameters->ProcessGroupId) && RtlGetCurrentPeb()->ProcessParameters->ProcessGroupId == GetCurrentProcessId()) result.bitmask |= CP_GROUP_LEADER; - if (GetFileType(GetStdHandle(STD_INPUT_HANDLE)) == FILE_TYPE_CHAR) - result.bitmask |= CP_INPUT_VALID; - if (GetFileType(GetStdHandle(STD_OUTPUT_HANDLE)) == FILE_TYPE_CHAR) - result.bitmask |= CP_OUTPUT_VALID; if (!(RtlGetCurrentPeb()->ProcessParameters->ConsoleFlags & 1)) result.bitmask |= CP_ENABLED_CTRLC; + result.bitmask |= CP_STREAM_(encode_handle(STD_INPUT_HANDLE), CP_INPUT_STREAM); + result.bitmask |= CP_STREAM_(encode_handle(STD_OUTPUT_HANDLE), CP_OUTPUT_STREAM); ExitProcess(save_blackbox(argv[3], &result, sizeof(result)) ? 0 : 1); }