From: Eric Pouech epouech@codeweavers.com
Signed-off-by: Eric Pouech epouech@codeweavers.com --- dlls/kernel32/tests/process.c | 90 ++++++++++++++++++++++++++++++++++- 1 file changed, 88 insertions(+), 2 deletions(-)
diff --git a/dlls/kernel32/tests/process.c b/dlls/kernel32/tests/process.c index 760bb497efa..aa190148546 100644 --- a/dlls/kernel32/tests/process.c +++ b/dlls/kernel32/tests/process.c @@ -3133,8 +3133,13 @@ static inline void copy_change_subsystem(const char* in, const char* out, DWORD CloseHandle(hFile); }
-#define H_CONSOLE 0 -#define H_DISK 1 +#define H_NULL 0 +#define H_INVALID 1 +#define H_DEVIL 2 +#define H_CONSOLE 3 +#define H_CHAR 4 +#define H_DISK 5 +#define H_PIPE 6
#define ARG_STD 0x80000000 #define ARG_STARTUPINFO 0x00000000 @@ -3174,6 +3179,7 @@ static inline BOOL build_startupinfo( STARTUPINFOA *startup, unsigned args, HAND SECURITY_ATTRIBUTES* psa;
BOOL needs_close = FALSE; + BOOL ret;
memset(startup, 0, sizeof(*startup)); startup->cb = sizeof(*startup); @@ -3182,6 +3188,16 @@ static inline BOOL build_startupinfo( STARTUPINFOA *startup, unsigned args, HAND
switch (args & ARG_HANDLE_MASK) { + 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; case H_CONSOLE: hstd[0] = CreateFileA("CONIN$", GENERIC_READ, 0, psa, OPEN_EXISTING, 0, 0); ok(hstd[0] != INVALID_HANDLE_VALUE, "Couldn't create input to console\n"); @@ -3189,6 +3205,13 @@ static inline BOOL build_startupinfo( STARTUPINFOA *startup, unsigned args, HAND ok(hstd[1] != INVALID_HANDLE_VALUE, "Couldn't create input to console\n"); needs_close = TRUE; break; + case H_CHAR: + hstd[0] = CreateFileA("NUL", GENERIC_READ, 0, psa, OPEN_EXISTING, 0, 0); + ok(hstd[0] != INVALID_HANDLE_VALUE, "Couldn't create input to NUL\n"); + hstd[1] = CreateFileA("NUL", GENERIC_READ|GENERIC_WRITE, 0, psa, OPEN_EXISTING, 0, 0); + ok(hstd[1] != INVALID_HANDLE_VALUE, "Couldn't create input to NUL\n"); + needs_close = TRUE; + break; case H_DISK: hstd[0] = CreateFileA(std_handle_file, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, psa, OPEN_EXISTING, 0, 0); ok(hstd[0] != INVALID_HANDLE_VALUE, "Couldn't create input to file %s\n", std_handle_file); @@ -3196,6 +3219,11 @@ static inline BOOL build_startupinfo( STARTUPINFOA *startup, unsigned args, HAND ok(hstd[1] != INVALID_HANDLE_VALUE, "Couldn't create input to file %s\n", std_handle_file); needs_close = TRUE; break; + case H_PIPE: + ret = CreatePipe(&hstd[0], &hstd[1], psa, 0); + ok(ret, "Couldn't create anon pipe\n"); + needs_close = TRUE; + break; default: ok(0, "Unsupported handle type %x\n", args & ARG_HANDLE_MASK); return FALSE; @@ -3235,6 +3263,62 @@ static void test_StdHandleInheritance(void) int i, j;
static const struct std_handle_test + nothing_cui[] = + { + /* all others handles type behave as H_DISK */ +/* 0*/ {ARG_STARTUPINFO | ARG_CP_INHERIT | ARG_HANDLE_INHERIT | H_DISK, HATTR_TYPE | HATTR_INHERIT | FILE_TYPE_DISK}, + {ARG_STD | ARG_CP_INHERIT | ARG_HANDLE_INHERIT | H_DISK, HATTR_TYPE | HATTR_INHERIT | FILE_TYPE_DISK, .is_todo = 6}, + + /* all others handles type behave as H_DISK */ + {ARG_STARTUPINFO | ARG_HANDLE_INHERIT | H_DISK, HATTR_NULL, .is_todo = 7, .is_broken = HATTR_TYPE | FILE_TYPE_UNKNOWN}, + {ARG_STD | ARG_HANDLE_INHERIT | H_DISK, HATTR_TYPE | HATTR_INHERIT | FILE_TYPE_DISK, .is_todo = 6}, + + /* all others handles type behave as H_DISK */ + {ARG_STARTUPINFO | ARG_CP_INHERIT | H_DISK, HATTR_DANGLING, .is_broken = HATTR_TYPE | FILE_TYPE_UNKNOWN}, +/* 5*/ {ARG_STD | ARG_CP_INHERIT | H_DISK, HATTR_DANGLING}, + + /* all others handles type behave as H_DISK */ + {ARG_STARTUPINFO | H_DISK, HATTR_NULL, .is_todo = 7, .is_broken = HATTR_TYPE | FILE_TYPE_UNKNOWN}, + {ARG_STD | H_DISK, HATTR_TYPE | FILE_TYPE_DISK, .is_todo = 7}, + + {ARG_STARTUPINFO | H_DEVIL, HATTR_NULL, .is_todo = 6, .is_broken = HATTR_TYPE | FILE_TYPE_UNKNOWN}, + {ARG_STD | H_DEVIL, HATTR_NULL, .is_todo = 4}, +/*10*/ {ARG_STARTUPINFO | H_INVALID, HATTR_NULL, .is_todo = 6, .is_broken = HATTR_INVALID}, + {ARG_STD | H_INVALID, HATTR_NULL, .is_todo = 6, .is_broken = HATTR_TYPE | FILE_TYPE_UNKNOWN}, + {ARG_STARTUPINFO | H_NULL, HATTR_NULL, .is_todo = 6, .is_broken = HATTR_INVALID}, + {ARG_STD | H_NULL, HATTR_NULL, .is_todo = 4, .is_broken = HATTR_INVALID}, + }, + nothing_gui[] = + { + /* testing all types because of discrepancies */ +/* 0*/ {ARG_STARTUPINFO | ARG_CP_INHERIT | ARG_HANDLE_INHERIT | H_DISK, HATTR_TYPE | HATTR_INHERIT | FILE_TYPE_DISK}, + {ARG_STD | ARG_CP_INHERIT | ARG_HANDLE_INHERIT | H_DISK, HATTR_TYPE | HATTR_INHERIT | FILE_TYPE_DISK, .is_todo = 6}, + {ARG_STARTUPINFO | ARG_CP_INHERIT | ARG_HANDLE_INHERIT | H_PIPE, HATTR_TYPE | HATTR_INHERIT | FILE_TYPE_PIPE}, + {ARG_STD | ARG_CP_INHERIT | ARG_HANDLE_INHERIT | H_PIPE, HATTR_TYPE | HATTR_INHERIT | FILE_TYPE_PIPE, .is_todo = 6}, + {ARG_STARTUPINFO | ARG_CP_INHERIT | ARG_HANDLE_INHERIT | H_CHAR, HATTR_TYPE | HATTR_INHERIT | FILE_TYPE_CHAR}, +/* 5*/ {ARG_STD | ARG_CP_INHERIT | ARG_HANDLE_INHERIT | H_CHAR, HATTR_TYPE | HATTR_INHERIT | FILE_TYPE_CHAR, .is_todo = 6}, + {ARG_STARTUPINFO | ARG_CP_INHERIT | ARG_HANDLE_INHERIT | H_CONSOLE, HATTR_NULL, .is_todo = 7, .is_broken = HATTR_TYPE | FILE_TYPE_UNKNOWN}, + {ARG_STD | ARG_CP_INHERIT | ARG_HANDLE_INHERIT | H_CONSOLE, HATTR_NULL, .is_todo = 7, .is_broken = HATTR_TYPE | FILE_TYPE_UNKNOWN}, + + /* all others handles type behave as H_DISK */ + {ARG_STARTUPINFO | ARG_HANDLE_INHERIT | H_DISK, HATTR_NULL, .is_todo = 7, .is_broken = HATTR_TYPE | FILE_TYPE_UNKNOWN}, + {ARG_STD | ARG_HANDLE_INHERIT | H_DISK, HATTR_NULL, .is_todo = 7}, + + /* all others handles type behave as H_DISK */ +/*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_todo = 7, .is_broken = HATTR_TYPE | FILE_TYPE_UNKNOWN}, + {ARG_STD | H_DISK, HATTR_NULL, .is_todo = 7}, + + {ARG_STARTUPINFO | H_DEVIL, HATTR_NULL, .is_todo = 6, .is_broken = HATTR_TYPE | FILE_TYPE_UNKNOWN}, +/*15*/ {ARG_STD | H_DEVIL, HATTR_NULL, .is_todo = 4}, + {ARG_STARTUPINFO | H_INVALID, HATTR_NULL, .is_todo = 6, .is_broken = HATTR_INVALID}, + {ARG_STD | H_INVALID, HATTR_NULL, .is_todo = 6}, + {ARG_STARTUPINFO | H_NULL, HATTR_NULL, .is_todo = 6}, + {ARG_STD | H_NULL, HATTR_NULL, .is_todo = 4}, + }, detached_cui[] = { {ARG_STD | ARG_CP_INHERIT | ARG_HANDLE_INHERIT | H_CONSOLE, HATTR_NULL, .is_todo = 4}, @@ -3262,6 +3346,8 @@ static void test_StdHandleInheritance(void) tests[] = { #define X(d, cg, s) {(d), (cg), s, ARRAY_SIZE(s), #s} + X(0, TRUE, nothing_cui), + X(0, FALSE, nothing_gui), X(DETACHED_PROCESS, TRUE, detached_cui), X(DETACHED_PROCESS, FALSE, detached_gui), #undef X