From: Eric Pouech epouech@codeweavers.com
Adding support for protect-from-close handle flag to CreateProcess test infrastructure.
Signed-off-by: Eric Pouech epouech@codeweavers.com --- dlls/kernel32/tests/process.c | 32 ++++++++++++++++++++++++++++---- 1 file changed, 28 insertions(+), 4 deletions(-)
diff --git a/dlls/kernel32/tests/process.c b/dlls/kernel32/tests/process.c index 0e5bf82530b..5eaf6586a72 100644 --- a/dlls/kernel32/tests/process.c +++ b/dlls/kernel32/tests/process.c @@ -323,8 +323,9 @@ static void WINAPIV __WINE_PRINTF_ATTR(2,3) childPrintf(HANDLE h, const char* fm #define HATTR_NULL 0x08 /* NULL handle value */ #define HATTR_INVALID 0x04 /* INVALID_HANDLE_VALUE */ #define HATTR_TYPE 0x0c /* valid handle, with type set */ -#define HATTR_INHERIT 0x10 /* inheritance flag set */ -#define HATTR_UNTOUCHED 0x20 /* Identify fields untouched by GetStartupInfoW */ +#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 HANDLE_UNTOUCHEDW (HANDLE)(DWORD_PTR)(0x5050505050505050ull)
@@ -346,8 +347,13 @@ static unsigned encode_handle_attributes(HANDLE h) if (dw == FILE_TYPE_CHAR || dw == FILE_TYPE_DISK || dw == FILE_TYPE_PIPE) { DWORD info; - if (GetHandleInformation(h, &info) && (info & HANDLE_FLAG_INHERIT)) - result |= HATTR_INHERIT; + if (GetHandleInformation(h, &info)) + { + if (info & HANDLE_FLAG_INHERIT) + result |= HATTR_INHERIT; + if (info & HANDLE_FLAG_PROTECT_FROM_CLOSE) + result |= HATTR_PROTECT; + } } else dw = FILE_TYPE_UNKNOWN; @@ -3146,6 +3152,7 @@ static void copy_change_subsystem(const char* in, const char* out, DWORD subsyst #define ARG_STARTUPINFO 0x00000000 #define ARG_CP_INHERIT 0x40000000 #define ARG_HANDLE_INHERIT 0x20000000 +#define ARG_HANDLE_PROTECT 0x10000000 #define ARG_HANDLE_MASK (~0xff000000)
static BOOL check_run_child(const char *exec, DWORD flags, BOOL cp_inherit, @@ -3217,6 +3224,13 @@ static BOOL build_startupinfo( STARTUPINFOA *startup, unsigned args, HANDLE hstd ok(0, "Unsupported handle type %x\n", args & ARG_HANDLE_MASK); return FALSE; } + if ((args & ARG_HANDLE_PROTECT) && needs_close) + { + ret = SetHandleInformation(hstd[0], HANDLE_FLAG_PROTECT_FROM_CLOSE, HANDLE_FLAG_PROTECT_FROM_CLOSE); + ok(ret, "Couldn't set inherit flag to hstd[0]\n"); + ret = SetHandleInformation(hstd[1], HANDLE_FLAG_PROTECT_FROM_CLOSE, HANDLE_FLAG_PROTECT_FROM_CLOSE); + ok(ret, "Couldn't set inherit flag to hstd[1]\n"); + }
if (args & ARG_STD) { @@ -3261,6 +3275,14 @@ 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_TYPE | HATTR_INHERIT | FILE_TYPE_DISK}, + + /* all others handles type behave as H_DISK */ + {ARG_STARTUPINFO | H_DISK, HATTR_NULL, .is_broken = HATTR_TYPE | FILE_TYPE_UNKNOWN}, +/* 5*/ {ARG_STD | H_DISK, HATTR_TYPE | FILE_TYPE_DISK, .is_todo = 1}, + + /* 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, .is_todo = 1}, }, nothing_gui[] = { @@ -3372,7 +3394,9 @@ static void test_StdHandleInheritance(void) DeleteFileA(resfile); if (needs_close) { + SetHandleInformation(hstd[0], HANDLE_FLAG_PROTECT_FROM_CLOSE, 0); CloseHandle(hstd[0]); + SetHandleInformation(hstd[1], HANDLE_FLAG_PROTECT_FROM_CLOSE, 0); CloseHandle(hstd[1]); } winetest_pop_context();