From: Eric Pouech epouech@codeweavers.com
Signed-off-by: Eric Pouech epouech@codeweavers.com --- dlls/kernel32/tests/process.c | 45 +++++++++++++++++++++++++++++++++++ include/ddk/wdm.h | 5 ++++ 2 files changed, 50 insertions(+)
diff --git a/dlls/kernel32/tests/process.c b/dlls/kernel32/tests/process.c index c9c3cbebbb6..9ac5688e903 100644 --- a/dlls/kernel32/tests/process.c +++ b/dlls/kernel32/tests/process.c @@ -34,6 +34,7 @@ #include "winnls.h" #include "winternl.h" #include "tlhelp32.h" +#include "ddk/wdm.h"
#include "wine/test.h" #include "wine/heap.h" @@ -2547,6 +2548,50 @@ static void test_DuplicateHandle(void) ok(r, "DuplicateHandle error %lu\n", GetLastError()); ok(f == out || broken(/* Win7 */ (((ULONG_PTR)f & 3) == 3) && (f != out)), "f != out\n"); CloseHandle(out); + + /* Test DUPLICATE_SAME_ATTRIBUTES */ + f = CreateFileA("NUL", GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, 0); + ok(f != INVALID_HANDLE_VALUE, "Failed to open NUL %lu\n", GetLastError()); + r = GetHandleInformation(f, &info); + ok(r && info == 0, "Unexpected info %lx\n", info); + + r = DuplicateHandle(GetCurrentProcess(), f, GetCurrentProcess(), &out, + 0, TRUE, DUPLICATE_SAME_ACCESS | DUPLICATE_SAME_ATTRIBUTES); + ok(r, "DuplicateHandle error %lu\n", GetLastError()); + r = GetHandleInformation(out, &info); + todo_wine + ok(r && info == 0, "Unexpected info %lx\n", info); + CloseHandle(out); + + r = SetHandleInformation(f, HANDLE_FLAG_INHERIT | HANDLE_FLAG_PROTECT_FROM_CLOSE, + HANDLE_FLAG_INHERIT | HANDLE_FLAG_PROTECT_FROM_CLOSE); + ok(r, "SetHandleInformation error %lu\n", GetLastError()); + info = 0xdeabeef; + r = GetHandleInformation(f, &info); + ok(r && info == (HANDLE_FLAG_INHERIT | HANDLE_FLAG_PROTECT_FROM_CLOSE), "Unexpected info %lx\n", info); + ok(r, "SetHandleInformation error %lu\n", GetLastError()); + r = DuplicateHandle(GetCurrentProcess(), f, GetCurrentProcess(), &out, + 0, FALSE, DUPLICATE_SAME_ACCESS | DUPLICATE_SAME_ATTRIBUTES); + ok(r, "DuplicateHandle error %lu\n", GetLastError()); + info = 0xdeabeef; + r = GetHandleInformation(out, &info); + todo_wine + ok(r && info == (HANDLE_FLAG_INHERIT | HANDLE_FLAG_PROTECT_FROM_CLOSE), "Unexpected info %lx\n", info); + r = SetHandleInformation(out, HANDLE_FLAG_PROTECT_FROM_CLOSE, 0); + ok(r, "SetHandleInformation error %lu\n", GetLastError()); + CloseHandle(out); + r = SetHandleInformation(f, HANDLE_FLAG_INHERIT | HANDLE_FLAG_PROTECT_FROM_CLOSE, 0); + ok(r, "SetHandleInformation error %lu\n", GetLastError()); + CloseHandle(f); + + r = DuplicateHandle(GetCurrentProcess(), GetCurrentProcess(), GetCurrentProcess(), &out, + 0, TRUE, DUPLICATE_SAME_ACCESS | DUPLICATE_SAME_ATTRIBUTES); + ok(r, "DuplicateHandle error %lu\n", GetLastError()); + info = 0xdeabeef; + r = GetHandleInformation(out, &info); + todo_wine + ok(r && info == 0, "Unexpected info %lx\n", info); + CloseHandle(out); }
#define test_completion(a, b, c, d, e) _test_completion(__LINE__, a, b, c, d, e) diff --git a/include/ddk/wdm.h b/include/ddk/wdm.h index 7dcec028a50..414f60b5419 100644 --- a/include/ddk/wdm.h +++ b/include/ddk/wdm.h @@ -1671,6 +1671,11 @@ static inline void IoCopyCurrentIrpStackLocationToNext(IRP *irp) #define SYMBOLIC_LINK_QUERY 0x0001 #define SYMBOLIC_LINK_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | 0x1)
+/* Flags for ZwDuplicateObject */ +#define DUPLICATE_CLOSE_SOURCE 0x00000001 +#define DUPLICATE_SAME_ACCESS 0x00000002 +#define DUPLICATE_SAME_ATTRIBUTES 0x00000004 + #ifndef WINE_UNIX_LIB
NTSTATUS WINAPI DbgQueryDebugFilterState(ULONG, ULONG);