Commit da9210e0 authored by Eric Pouech's avatar Eric Pouech Committed by Alexandre Julliard

kernel32/tests: Added tests about std handle flags inheritance.

Adding support for protect-from-close handle flag to CreateProcess test infrastructure. Signed-off-by: 's avatarEric Pouech <epouech@codeweavers.com>
parent 23f98e96
......@@ -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();
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment