From 313b10991b63c6d1204f8dda97b8b2a83719d2d4 Mon Sep 17 00:00:00 2001 From: Eric Pouech Date: Mon, 11 Apr 2022 15:04:50 +0200 Subject: [PATCH] kernel32/tests: Add more CreateProcess console management tests. Signed-off-by: Eric Pouech Signed-off-by: Jacek Caban Signed-off-by: Alexandre Julliard --- dlls/kernel32/tests/console.c | 89 ++++++++++++++++++++++++++++++----- 1 file changed, 76 insertions(+), 13 deletions(-) diff --git a/dlls/kernel32/tests/console.c b/dlls/kernel32/tests/console.c index 98692760acf..da19e3c6a3f 100644 --- a/dlls/kernel32/tests/console.c +++ b/dlls/kernel32/tests/console.c @@ -4689,7 +4689,7 @@ static void copy_change_subsystem(const char* in, const char* out, DWORD subsyst CloseHandle(hFile); } -static BOOL check_whether_child_attached(const char* exec, DWORD flags) +static DWORD check_child_console_bits(const char* exec, DWORD flags) { STARTUPINFOA si = { sizeof(si) }; PROCESS_INFORMATION info; @@ -4705,12 +4705,18 @@ static BOOL check_whether_child_attached(const char* exec, DWORD flags) ret = WaitForSingleObject(info.hProcess, 30000); ok(ret == WAIT_OBJECT_0, "Could not wait for the child process: %ld le=%lu\n", ret, GetLastError()); - ret = GetExitCodeProcess(info.hProcess, &exit_code); - ok(ret && exit_code <= 255, "Couldn't get exit_code\n"); + res = GetExitCodeProcess(info.hProcess, &exit_code); + ok(res && exit_code <= 255, "Couldn't get exit_code\n"); CloseHandle(info.hProcess); - return exit_code != 0; + return exit_code; } +#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 */ + static void test_CreateProcessCUI(void) { char guiexec[MAX_PATH]; @@ -4728,14 +4734,63 @@ static void test_CreateProcessCUI(void) FreeConsole(); - res = check_whether_child_attached(guiexec, DETACHED_PROCESS); - ok(!res, "Don't expecting child to be attached to a console\n"); - res = check_whether_child_attached(guiexec, 0); - ok(!res, "Don't expecting child to be attached to a console\n"); - res = check_whether_child_attached(cuiexec, DETACHED_PROCESS); - ok(!res, "Don't expecting child to be attached to a console\n"); - res = check_whether_child_attached(cuiexec, 0); - ok(res, "Expecting child to be attached to a console\n"); + res = check_child_console_bits(guiexec, 0); + ok(res == 0, "Unexpected result %x\n", res); + res = check_child_console_bits(guiexec, DETACHED_PROCESS); + ok(res == 0, "Unexpected result %x\n", res); + res = check_child_console_bits(guiexec, CREATE_NEW_CONSOLE); + ok(res == 0, "Unexpected result %x\n", res); + res = check_child_console_bits(guiexec, CREATE_NO_WINDOW); + ok(res == 0, "Unexpected result %x\n", res); + res = check_child_console_bits(guiexec, DETACHED_PROCESS | CREATE_NO_WINDOW); + ok(res == 0, "Unexpected result %x\n", res); + res = check_child_console_bits(guiexec, CREATE_NEW_CONSOLE | CREATE_NO_WINDOW); + ok(res == 0, "Unexpected result %x\n", res); + + res = check_child_console_bits(cuiexec, 0); + ok(res == (CP_WITH_CONSOLE | CP_WITH_HANDLE | CP_WITH_WINDOW | CP_ALONE), "Unexpected result %x\n", res); + res = check_child_console_bits(cuiexec, DETACHED_PROCESS); + ok(res == 0, "Unexpected result %x\n", res); + res = check_child_console_bits(cuiexec, CREATE_NEW_CONSOLE); + ok(res == (CP_WITH_CONSOLE | CP_WITH_HANDLE | CP_WITH_WINDOW | CP_ALONE), "Unexpected result %x\n", res); + res = check_child_console_bits(cuiexec, CREATE_NO_WINDOW); + todo_wine + ok(res == (CP_WITH_CONSOLE | CP_WITH_HANDLE | CP_ALONE), "Unexpected result %x\n", res); + res = check_child_console_bits(cuiexec, DETACHED_PROCESS | CREATE_NO_WINDOW); + ok(res == 0, "Unexpected result %x\n", res); + res = check_child_console_bits(cuiexec, CREATE_NEW_CONSOLE | CREATE_NO_WINDOW); + ok(res == (CP_WITH_CONSOLE | CP_WITH_HANDLE | CP_WITH_WINDOW | CP_ALONE), "Unexpected result %x\n", res); + + AllocConsole(); + + res = check_child_console_bits(guiexec, 0); + todo_wine + ok(res == 0, "Unexpected result %x\n", res); + res = check_child_console_bits(guiexec, DETACHED_PROCESS); + ok(res == 0, "Unexpected result %x\n", res); + res = check_child_console_bits(guiexec, CREATE_NEW_CONSOLE); + ok(res == 0, "Unexpected result %x\n", res); + res = check_child_console_bits(guiexec, CREATE_NO_WINDOW); + todo_wine + ok(res == 0, "Unexpected result %x\n", res); + res = check_child_console_bits(guiexec, DETACHED_PROCESS | CREATE_NO_WINDOW); + ok(res == 0, "Unexpected result %x\n", res); + res = check_child_console_bits(guiexec, CREATE_NEW_CONSOLE | CREATE_NO_WINDOW); + ok(res == 0, "Unexpected result %x\n", res); + + res = check_child_console_bits(cuiexec, 0); + ok(res == (CP_WITH_CONSOLE | CP_WITH_HANDLE | CP_WITH_WINDOW), "Unexpected result %x\n", res); + res = check_child_console_bits(cuiexec, DETACHED_PROCESS); + ok(res == 0, "Unexpected result %x\n", res); + res = check_child_console_bits(cuiexec, CREATE_NEW_CONSOLE); + ok(res == (CP_WITH_CONSOLE | CP_WITH_HANDLE | CP_WITH_WINDOW | CP_ALONE), "Unexpected result %x\n", res); + res = check_child_console_bits(cuiexec, CREATE_NO_WINDOW); + todo_wine + ok(res == (CP_WITH_CONSOLE | CP_WITH_HANDLE | CP_ALONE), "Unexpected result %x\n", res); + res = check_child_console_bits(cuiexec, DETACHED_PROCESS | CREATE_NO_WINDOW); + ok(res == 0, "Unexpected result %x\n", res); + res = check_child_console_bits(cuiexec, CREATE_NEW_CONSOLE | CREATE_NO_WINDOW); + ok(res == (CP_WITH_CONSOLE | CP_WITH_HANDLE | CP_WITH_WINDOW | CP_ALONE), "Unexpected result %x\n", res); DeleteFileA(guiexec); DeleteFileA(cuiexec); @@ -4771,7 +4826,15 @@ START_TEST(console) if (argc == 3 && !strcmp(argv[2], "check_console")) { - ExitProcess(GetConsoleCP() != 0); + DWORD exit_code = 0, pcslist; + if (GetConsoleCP() != 0) exit_code |= CP_WITH_CONSOLE; + if (RtlGetCurrentPeb()->ProcessParameters->ConsoleHandle) exit_code |= CP_WITH_HANDLE; + if (IsWindow(GetConsoleWindow())) exit_code |= CP_WITH_WINDOW; + if (pGetConsoleProcessList && GetConsoleProcessList(&pcslist, 1) == 1) + exit_code |= CP_ALONE; + if (RtlGetCurrentPeb()->ProcessParameters->ProcessGroupId == GetCurrentProcessId()) + exit_code |= CP_GROUP_LEADER; + ExitProcess(exit_code); } test_current = argc >= 3 && !strcmp(argv[2], "--current");