This serie is the last one for CreateProcess fixes regarding handles inheritance. It covers the cases of errenous (null, invalid...) handles.
-- v2: kernel32/tests: Remove todo scaffholding for CreateProcess() tests. msvcrt: Don't reset invalid std handle in init. msvcrt/tests: Extend test for invalid std handle on msvcrt init. kernelbase: Don't use INVALID_HANDLE_VALUE as std handle in CreateProcess. kernel32/tests: Add tests for CreateProcess with invalid handles.
From: Eric Pouech epouech@codeweavers.com
Signed-off-by: Eric Pouech epouech@codeweavers.com --- dlls/kernel32/tests/process.c | 103 ++++++++++++++++++++++++++++------ 1 file changed, 85 insertions(+), 18 deletions(-)
diff --git a/dlls/kernel32/tests/process.c b/dlls/kernel32/tests/process.c index 1ecf8a35f21..2a9a1b4c02f 100644 --- a/dlls/kernel32/tests/process.c +++ b/dlls/kernel32/tests/process.c @@ -326,6 +326,7 @@ static void WINAPIV __WINE_PRINTF_ATTR(2,3) childPrintf(HANDLE h, const char* fm #define HATTR_UNTOUCHED 0x10 /* Identify fields untouched by GetStartupInfoW */ #define HATTR_INHERIT 0x20 /* inheritance flag set */ #define HATTR_PROTECT 0x40 /* protect from close flag set */ +#define HATTR_DANGLING 0x80 /* a pseudo value to show that the handle value has been copied but not inherited */
#define HANDLE_UNTOUCHEDW (HANDLE)(DWORD_PTR)(0x5050505050505050ull)
@@ -3188,6 +3189,9 @@ static void copy_change_subsystem(const char* in, const char* out, DWORD subsyst #define H_DISK 1 #define H_CHAR 2 #define H_PIPE 3 +#define H_NULL 4 +#define H_INVALID 5 +#define H_DEVIL 6 /* unassigned handle */
#define ARG_STD 0x80000000 #define ARG_STARTUPINFO 0x00000000 @@ -3261,6 +3265,16 @@ static BOOL build_startupinfo( STARTUPINFOA *startup, unsigned args, HANDLE hstd ok(ret, "Couldn't create anon pipe\n"); needs_close = TRUE; break; + case H_NULL: + hstd[0] = hstd[1] = NULL; + break; + case H_INVALID: + hstd[0] = hstd[1] = INVALID_HANDLE_VALUE; + break; + case H_DEVIL: + hstd[0] = (HANDLE)(ULONG_PTR)0x066600; + hstd[1] = (HANDLE)(ULONG_PTR)0x066610; + break; default: ok(0, "Unsupported handle type %x\n", args & ARG_HANDLE_MASK); return FALSE; @@ -3293,7 +3307,7 @@ 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 */ + unsigned is_todo; /* bitmask: 1 on TEB values, 2 on StartupInfoA values, 4 on StartupInfoW values, 8 dangling in StartupInfoW */ DWORD is_broken; /* Win7 broken file types */ };
@@ -3324,6 +3338,18 @@ static void test_StdHandleInheritance(void) /* all others handles type behave as H_DISK */ {ARG_STARTUPINFO | ARG_HANDLE_PROTECT | H_DISK, HATTR_NULL, .is_broken = HATTR_TYPE | FILE_TYPE_UNKNOWN}, {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}, + + /* all others handles type behave as H_DISK */ +/*10*/ {ARG_STARTUPINFO | H_DEVIL, HATTR_NULL, .is_broken = HATTR_TYPE | FILE_TYPE_UNKNOWN}, + {ARG_STD | H_DEVIL, HATTR_NULL}, + {ARG_STARTUPINFO | H_INVALID, HATTR_NULL, .is_broken = HATTR_INVALID}, + {ARG_STD | H_INVALID, HATTR_NULL, .is_broken = HATTR_TYPE | FILE_TYPE_UNKNOWN}, + {ARG_STARTUPINFO | H_NULL, HATTR_NULL, .is_broken = HATTR_INVALID}, +/*15*/ {ARG_STD | H_NULL, HATTR_NULL, .is_broken = HATTR_INVALID}, }, nothing_gui[] = { @@ -3340,6 +3366,21 @@ static void test_StdHandleInheritance(void) /* all others handles type behave as H_DISK */ {ARG_STARTUPINFO | ARG_HANDLE_INHERIT | H_DISK, HATTR_NULL, .is_broken = HATTR_TYPE | FILE_TYPE_UNKNOWN}, {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}, + + /* all others handles type behave as H_DISK */ + {ARG_STARTUPINFO | H_DISK, HATTR_NULL, .is_broken = HATTR_TYPE | FILE_TYPE_UNKNOWN}, + {ARG_STD | H_DISK, HATTR_NULL}, + + {ARG_STARTUPINFO | H_DEVIL, HATTR_NULL, .is_broken = HATTR_TYPE | FILE_TYPE_UNKNOWN}, +/*15*/ {ARG_STD | H_DEVIL, HATTR_NULL}, + {ARG_STARTUPINFO | H_INVALID, HATTR_NULL, .is_broken = HATTR_INVALID}, + {ARG_STD | H_INVALID, HATTR_NULL}, + {ARG_STARTUPINFO | H_NULL, HATTR_NULL}, + {ARG_STD | H_NULL, HATTR_NULL}, }, detached_cui[] = { @@ -3398,7 +3439,6 @@ static void test_StdHandleInheritance(void) STARTUPINFOA startup; HANDLE hstd[2] = {}; BOOL needs_close; - unsigned startup_expected;
winetest_push_context("%s[%u] ", tests[j].descr, i); needs_close = build_startupinfo( &startup, std_tests[i].args, hstd ); @@ -3409,26 +3449,53 @@ static void test_StdHandleInheritance(void) ok(ret, "Couldn't run child\n"); reload_child_info(resfile);
- startup_expected = (std_tests[i].args & ARG_STD) ? HATTR_INVALID : std_tests[i].expected; - - todo_wine_if(std_tests[i].is_todo & 2) + if (std_tests[i].expected & HATTR_DANGLING) { - okChildHexInt("StartupInfoA", "hStdInputEncode", startup_expected, std_tests[i].is_broken); - okChildHexInt("StartupInfoA", "hStdOutputEncode", startup_expected, std_tests[i].is_broken); - } - - startup_expected = (std_tests[i].args & ARG_STD) ? HATTR_UNTOUCHED : std_tests[i].expected; + /* The value of the handle (in parent) has been copied in STARTUPINFO fields (in child), + * but the object hasn't been inherited from parent to child. + * There's no reliable way to test that the object hasn't been inherited, as the + * entry in the child's handle table is free and could have been reused before + * this test occurs. + * So simply test that the value is passed untouched. + */ + okChildHexInt("StartupInfoA", "hStdInput", (DWORD_PTR)((std_tests[i].args & ARG_STD) ? INVALID_HANDLE_VALUE : hstd[0]), std_tests[i].is_broken); + okChildHexInt("StartupInfoA", "hStdOutput", (DWORD_PTR)((std_tests[i].args & ARG_STD) ? INVALID_HANDLE_VALUE : hstd[1]), std_tests[i].is_broken); + todo_wine_if(std_tests[i].is_todo & 8) + if (!(std_tests[i].args & ARG_STD)) + { + okChildHexInt("StartupInfoW", "hStdInput", (DWORD_PTR)hstd[0], std_tests[i].is_broken); + okChildHexInt("StartupInfoW", "hStdOutput", (DWORD_PTR)hstd[1], std_tests[i].is_broken); + }
- todo_wine_if(std_tests[i].is_todo & 4) - { - okChildHexInt("StartupInfoW", "hStdInputEncode", startup_expected, std_tests[i].is_broken); - okChildHexInt("StartupInfoW", "hStdOutputEncode", startup_expected, std_tests[i].is_broken); + todo_wine + { + okChildHexInt("TEB", "hStdInput", (DWORD_PTR)hstd[0], std_tests[i].is_broken); + okChildHexInt("TEB", "hStdOutput", (DWORD_PTR)hstd[1], std_tests[i].is_broken); + } } - - todo_wine_if(std_tests[i].is_todo & 1) + else { - okChildHexInt("TEB", "hStdInputEncode", std_tests[i].expected, std_tests[i].is_broken); - okChildHexInt("TEB", "hStdOutputEncode", std_tests[i].expected, std_tests[i].is_broken); + unsigned startup_expected = (std_tests[i].args & ARG_STD) ? HATTR_INVALID : std_tests[i].expected; + + todo_wine_if(std_tests[i].is_todo & 2) + { + okChildHexInt("StartupInfoA", "hStdInputEncode", startup_expected, std_tests[i].is_broken); + okChildHexInt("StartupInfoA", "hStdOutputEncode", startup_expected, std_tests[i].is_broken); + } + + startup_expected = (std_tests[i].args & ARG_STD) ? HATTR_UNTOUCHED : std_tests[i].expected; + + todo_wine_if(std_tests[i].is_todo & 4) + { + okChildHexInt("StartupInfoW", "hStdInputEncode", startup_expected, std_tests[i].is_broken); + okChildHexInt("StartupInfoW", "hStdOutputEncode", startup_expected, std_tests[i].is_broken); + } + + todo_wine_if(std_tests[i].is_todo & 1) + { + okChildHexInt("TEB", "hStdInputEncode", std_tests[i].expected, std_tests[i].is_broken); + okChildHexInt("TEB", "hStdOutputEncode", std_tests[i].expected, std_tests[i].is_broken); + } }
release_memory();
From: Eric Pouech epouech@codeweavers.com
And don't infer detached console state from std handle values, but rely on a NULL console handle.
Signed-off-by: Eric Pouech epouech@codeweavers.com --- dlls/kernel32/tests/process.c | 13 +++++++------ dlls/kernelbase/process.c | 12 +++++------- dlls/ntdll/unix/process.c | 4 ++-- 3 files changed, 14 insertions(+), 15 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/process.c b/dlls/kernelbase/process.c index 1aeb8f55257..775512e7f0d 100644 --- a/dlls/kernelbase/process.c +++ b/dlls/kernelbase/process.c @@ -209,19 +209,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 b58d69fb28a..bf24161fedb 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 == NULL) { 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 == NULL) { setsid(); set_stdio_fd( -1, -1 ); /* close stdin and stdout */
From: Eric Pouech epouech@codeweavers.com
Signed-off-by: Eric Pouech epouech@codeweavers.com --- dlls/msvcrt/tests/file.c | 3 +++ 1 file changed, 3 insertions(+)
diff --git a/dlls/msvcrt/tests/file.c b/dlls/msvcrt/tests/file.c index 75d30648230..9357b215cd8 100644 --- a/dlls/msvcrt/tests/file.c +++ b/dlls/msvcrt/tests/file.c @@ -1896,6 +1896,9 @@ static void test_invalid_stdin_child( void ) handle = (HANDLE)_get_osfhandle(STDIN_FILENO); ok(handle == (HANDLE)-2, "handle = %p\n", handle); ok(errno == 0xdeadbeef, "errno = %d\n", errno); + handle = GetStdHandle(STD_INPUT_HANDLE); + todo_wine + ok((LONG_PTR)handle > 0, "Expecting passed handle to be untouched\n");
info = &__pioinfo[STDIN_FILENO/MSVCRT_FD_BLOCK_SIZE][STDIN_FILENO%MSVCRT_FD_BLOCK_SIZE]; ok(info->handle == (HANDLE)-2, "info->handle = %p\n", info->handle);
From: Eric Pouech epouech@codeweavers.com
Signed-off-by: Eric Pouech epouech@codeweavers.com --- dlls/kernel32/tests/process.c | 8 ++++---- dlls/msvcrt/file.c | 12 +++++++----- dlls/msvcrt/tests/file.c | 1 - 3 files changed, 11 insertions(+), 10 deletions(-)
diff --git a/dlls/kernel32/tests/process.c b/dlls/kernel32/tests/process.c index e329f28ac8b..21f1b3b96f6 100644 --- a/dlls/kernel32/tests/process.c +++ b/dlls/kernel32/tests/process.c @@ -3341,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 = 24, .is_broken = HATTR_TYPE | FILE_TYPE_UNKNOWN}, - {ARG_STD | ARG_CP_INHERIT | H_DISK, HATTR_DANGLING, .is_todo = 16}, + {ARG_STARTUPINFO | ARG_CP_INHERIT | H_DISK, HATTR_DANGLING, .is_broken = HATTR_TYPE | FILE_TYPE_UNKNOWN}, + {ARG_STD | ARG_CP_INHERIT | H_DISK, HATTR_DANGLING},
/* all others handles type behave as H_DISK */ /*10*/ {ARG_STARTUPINFO | H_DEVIL, HATTR_NULL, .is_broken = HATTR_TYPE | FILE_TYPE_UNKNOWN}, @@ -3369,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 = 24}, - {ARG_STD | ARG_CP_INHERIT | H_DISK, HATTR_DANGLING, .is_todo = 16}, +/*10*/ {ARG_STARTUPINFO | ARG_CP_INHERIT | H_DISK, HATTR_DANGLING}, + {ARG_STD | ARG_CP_INHERIT | H_DISK, HATTR_DANGLING},
/* all others handles type behave as H_DISK */ {ARG_STARTUPINFO | H_DISK, HATTR_NULL, .is_broken = HATTR_TYPE | FILE_TYPE_UNKNOWN}, diff --git a/dlls/msvcrt/file.c b/dlls/msvcrt/file.c index 3c1d9572585..b4e80a4b5d0 100644 --- a/dlls/msvcrt/file.c +++ b/dlls/msvcrt/file.c @@ -560,12 +560,14 @@ static void msvcrt_set_fd(ioinfo *fdinfo, HANDLE hand, int flag) ioinfo_set_unicode(fdinfo, FALSE); ioinfo_set_textmode(fdinfo, TEXTMODE_ANSI);
- if (hand == MSVCRT_NO_CONSOLE) hand = 0; - switch (fdinfo-MSVCRT___pioinfo[0]) + if (hand != MSVCRT_NO_CONSOLE) { - case 0: SetStdHandle(STD_INPUT_HANDLE, hand); break; - case 1: SetStdHandle(STD_OUTPUT_HANDLE, hand); break; - case 2: SetStdHandle(STD_ERROR_HANDLE, hand); break; + switch (fdinfo-MSVCRT___pioinfo[0]) + { + case 0: SetStdHandle(STD_INPUT_HANDLE, hand); break; + case 1: SetStdHandle(STD_OUTPUT_HANDLE, hand); break; + case 2: SetStdHandle(STD_ERROR_HANDLE, hand); break; + } } }
diff --git a/dlls/msvcrt/tests/file.c b/dlls/msvcrt/tests/file.c index 9357b215cd8..1ac6cfe3182 100644 --- a/dlls/msvcrt/tests/file.c +++ b/dlls/msvcrt/tests/file.c @@ -1897,7 +1897,6 @@ static void test_invalid_stdin_child( void ) ok(handle == (HANDLE)-2, "handle = %p\n", handle); ok(errno == 0xdeadbeef, "errno = %d\n", errno); handle = GetStdHandle(STD_INPUT_HANDLE); - todo_wine ok((LONG_PTR)handle > 0, "Expecting passed handle to be untouched\n");
info = &__pioinfo[STDIN_FILENO/MSVCRT_FD_BLOCK_SIZE][STDIN_FILENO%MSVCRT_FD_BLOCK_SIZE];
From: Eric Pouech epouech@codeweavers.com
Signed-off-by: Eric Pouech epouech@codeweavers.com --- dlls/kernel32/tests/process.c | 15 --------------- 1 file changed, 15 deletions(-)
diff --git a/dlls/kernel32/tests/process.c b/dlls/kernel32/tests/process.c index 21f1b3b96f6..2904a31d014 100644 --- a/dlls/kernel32/tests/process.c +++ b/dlls/kernel32/tests/process.c @@ -3307,8 +3307,6 @@ 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, 16 dangling in TEB */ DWORD is_broken; /* Win7 broken file types */ };
@@ -3461,42 +3459,29 @@ static void test_StdHandleInheritance(void) */ okChildHexInt("StartupInfoA", "hStdInput", (DWORD_PTR)((std_tests[i].args & ARG_STD) ? INVALID_HANDLE_VALUE : hstd[0]), std_tests[i].is_broken); okChildHexInt("StartupInfoA", "hStdOutput", (DWORD_PTR)((std_tests[i].args & ARG_STD) ? INVALID_HANDLE_VALUE : hstd[1]), std_tests[i].is_broken); - todo_wine_if(std_tests[i].is_todo & 8) if (!(std_tests[i].args & ARG_STD)) { okChildHexInt("StartupInfoW", "hStdInput", (DWORD_PTR)hstd[0], std_tests[i].is_broken); okChildHexInt("StartupInfoW", "hStdOutput", (DWORD_PTR)hstd[1], std_tests[i].is_broken); }
- 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); - } } else { unsigned startup_expected = (std_tests[i].args & ARG_STD) ? HATTR_INVALID : std_tests[i].expected;
- todo_wine_if(std_tests[i].is_todo & 2) - { okChildHexInt("StartupInfoA", "hStdInputEncode", startup_expected, std_tests[i].is_broken); okChildHexInt("StartupInfoA", "hStdOutputEncode", startup_expected, std_tests[i].is_broken); - }
startup_expected = (std_tests[i].args & ARG_STD) ? HATTR_UNTOUCHED : std_tests[i].expected;
- todo_wine_if(std_tests[i].is_todo & 4) - { okChildHexInt("StartupInfoW", "hStdInputEncode", startup_expected, std_tests[i].is_broken); okChildHexInt("StartupInfoW", "hStdOutputEncode", startup_expected, std_tests[i].is_broken); - }
- todo_wine_if(std_tests[i].is_todo & 1) - { okChildHexInt("TEB", "hStdInputEncode", std_tests[i].expected, std_tests[i].is_broken); okChildHexInt("TEB", "hStdOutputEncode", std_tests[i].expected, std_tests[i].is_broken); - } }
release_memory();
On Mon Feb 12 13:29:02 2024 +0000, eric pouech wrote:
changed this line in [version 2 of the diff](/wine/wine/-/merge_requests/5049/diffs?diff_id=99059&start_sha=3c4f45b02d0747739580a120e52fe3f4251f4f4a#a666ff29c09175a075770ae07b2d8ca32ee2f5e5_447_447)
yes looks simpler. Done in V2.
This merge request was approved by Jacek Caban.
This merge request was approved by Piotr Caban.