From: Eric Pouech epouech@codeweavers.com
We were limited by the 8 bits of the exit code. Enable at least 32.
Signed-off-by: Eric Pouech epouech@codeweavers.com --- dlls/kernel32/tests/console.c | 118 ++++++++++++++++++++++++++-------- 1 file changed, 92 insertions(+), 26 deletions(-)
diff --git a/dlls/kernel32/tests/console.c b/dlls/kernel32/tests/console.c index 54d1a80709b..49d7d56eb68 100644 --- a/dlls/kernel32/tests/console.c +++ b/dlls/kernel32/tests/console.c @@ -4892,9 +4892,61 @@ static void copy_change_subsystem(const char* in, const char* out, DWORD subsyst CloseHandle(hFile); }
+static void get_temp_file_name(char* buf) +{ + char path[MAX_PATH]; + + buf[0] = '\0'; + GetTempPathA(sizeof(path), path); + GetTempFileNameA(path, "wt", 0, buf); +} + +#define load_blackbox(a, b, c) _load_blackbox(__LINE__, (a), (b), (c)) +static BOOL _load_blackbox(unsigned int line, const char* file, void* blackbox, int size) +{ + HANDLE hFile; + DWORD read; + BOOL ret; + + hFile = CreateFileA(file, GENERIC_READ, FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, 0); + if (hFile == INVALID_HANDLE_VALUE) + { + ok_(__FILE__, line)(0, "unable to open '%s': %#lx\n", file, GetLastError()); + return FALSE; + } + SetLastError(0xdeadbeef); + ret = ReadFile(hFile, blackbox, size, &read, NULL); + ok(ret, "ReadFile failed: %ld\n", GetLastError()); + ok(read == size, "wrong size for '%s': read=%ld\n", file, read); + CloseHandle(hFile); + return TRUE; +} + +static BOOL save_blackbox(const char* file, void* blackbox, int size) +{ + HANDLE hFile; + DWORD written; + BOOL ret; + + hFile = CreateFileA(file, GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, 0, 0); + ok(hFile != INVALID_HANDLE_VALUE, "Couldn't create %s: %lu\n", file, GetLastError()); + if (hFile == INVALID_HANDLE_VALUE) + return FALSE; + ret = WriteFile(hFile, blackbox, size, &written, NULL); + ok(ret && written == size, "Error writing\n"); + CloseHandle(hFile); + return TRUE; +} + enum inheritance_model {NULL_STD, CONSOLE_STD, STARTUPINFO_STD};
-static DWORD check_child_console_bits(const char* exec, DWORD flags, enum inheritance_model inherit) +struct black_box +{ + unsigned bitmask; +}; + +static BOOL check_child_console_bits(const char* exec, DWORD flags, enum inheritance_model inherit, + struct black_box* result) { SECURITY_ATTRIBUTES sa = {0, NULL, TRUE}; STARTUPINFOA si = { sizeof(si) }; @@ -4905,8 +4957,11 @@ static DWORD check_child_console_bits(const char* exec, DWORD flags, enum inheri BOOL res; DWORD ret; BOOL inherit_handles = FALSE; + char blackbox_file[MAX_PATH]; + + get_temp_file_name(blackbox_file);
- sprintf(buf, ""%s" console check_console", exec); + sprintf(buf, ""%s" console check_console %s", exec, blackbox_file); switch (inherit) { case NULL_STD: @@ -4940,7 +4995,7 @@ static DWORD check_child_console_bits(const char* exec, DWORD flags, enum inheri ok(ret == WAIT_OBJECT_0, "Could not wait for the child process: %ld le=%lu\n", ret, GetLastError()); res = GetExitCodeProcess(info.hProcess, &exit_code); - ok(res && exit_code <= 255, "Couldn't get exit_code\n"); + ok(res && exit_code == 0, "Couldn't get exit_code\n"); CloseHandle(info.hProcess); switch (inherit) { @@ -4955,7 +5010,10 @@ static DWORD check_child_console_bits(const char* exec, DWORD flags, enum inheri CloseHandle(si.hStdOutput); break; } - return exit_code; + if (res) + res = load_blackbox(blackbox_file, result, sizeof(*result)); + DeleteFileA(blackbox_file); + return res; }
#define CP_WITH_CONSOLE 0x01 /* attached to a console */ @@ -4979,6 +5037,7 @@ static void test_CreateProcessCUI(void) BOOL res; int i; BOOL saved_console_flags; + struct black_box result;
static struct { @@ -5106,10 +5165,12 @@ 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].inherit, + &result); + ok(res, "Couldn't run child\n"); todo_wine_if(no_console_tests[i].is_todo) - ok(res == no_console_tests[i].expected, "[%d] Unexpected result %x (%lx)\n", - i, res, no_console_tests[i].expected); + ok(result.bitmask == no_console_tests[i].expected, "[%d] Unexpected result %x (%lx)\n", + i, result.bitmask, no_console_tests[i].expected); }
AllocConsole(); @@ -5118,12 +5179,14 @@ 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].inherit, + &result); + ok(res, "Couldn't run child\n"); todo_wine_if(with_console_tests[i].is_todo) - ok(res == with_console_tests[i].expected || - broken(with_console_tests[i].is_broken && res == (with_console_tests[i].is_broken & 0xff)), + ok(result.bitmask == with_console_tests[i].expected || + broken(with_console_tests[i].is_broken && result.bitmask == (with_console_tests[i].is_broken & 0xff)), "[%d] Unexpected result %x (%lx)\n", - i, res, with_console_tests[i].expected); + i, result.bitmask, with_console_tests[i].expected); }
saved_console_flags = RtlGetCurrentPeb()->ProcessParameters->ConsoleFlags; @@ -5134,13 +5197,14 @@ 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].inherit, + &result); todo_wine_if(group_flags_tests[i].is_todo) - ok(res == group_flags_tests[i].expected || + ok(result.bitmask == group_flags_tests[i].expected || /* Win7 doesn't report group id */ - broken(res == (group_flags_tests[i].expected & ~CP_GROUP_LEADER)), + broken(result.bitmask == (group_flags_tests[i].expected & ~CP_GROUP_LEADER)), "[%d] Unexpected result %x (%lx)\n", - i, res, group_flags_tests[i].expected); + i, result.bitmask, group_flags_tests[i].expected); }
RtlGetCurrentPeb()->ProcessParameters->ConsoleFlags = saved_console_flags; @@ -5332,26 +5396,28 @@ START_TEST(console) ExitProcess(mch_child_event); }
- if (argc == 3 && !strcmp(argv[2], "check_console")) + if (argc == 4 && !strcmp(argv[2], "check_console")) { - 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; + DWORD pcslist; + struct black_box result = {.bitmask = 0}; + + if (GetConsoleCP() != 0) result.bitmask |= CP_WITH_CONSOLE; + if (RtlGetCurrentPeb()->ProcessParameters->ConsoleHandle) result.bitmask |= CP_WITH_HANDLE; + if (IsWindow(GetConsoleWindow())) result.bitmask |= CP_WITH_WINDOW; if (pGetConsoleProcessList && GetConsoleProcessList(&pcslist, 1) == 1) - exit_code |= CP_ALONE; + result.bitmask |= CP_ALONE; if (RtlGetCurrentPeb()->ProcessParameters->Size >= offsetof(RTL_USER_PROCESS_PARAMETERS, ProcessGroupId) + sizeof(RtlGetCurrentPeb()->ProcessParameters->ProcessGroupId) && RtlGetCurrentPeb()->ProcessParameters->ProcessGroupId == GetCurrentProcessId()) - exit_code |= CP_GROUP_LEADER; + result.bitmask |= CP_GROUP_LEADER; if (GetFileType(GetStdHandle(STD_INPUT_HANDLE)) == FILE_TYPE_CHAR) - exit_code |= CP_INPUT_VALID; + result.bitmask |= CP_INPUT_VALID; if (GetFileType(GetStdHandle(STD_OUTPUT_HANDLE)) == FILE_TYPE_CHAR) - exit_code |= CP_OUTPUT_VALID; + result.bitmask |= CP_OUTPUT_VALID; if (!(RtlGetCurrentPeb()->ProcessParameters->ConsoleFlags & 1)) - exit_code |= CP_ENABLED_CTRLC; - ExitProcess(exit_code); + result.bitmask |= CP_ENABLED_CTRLC; + ExitProcess(save_blackbox(argv[3], &result, sizeof(result)) ? 0 : 1); }
if (argc >= 3 && !strcmp(argv[2], "title_test"))