Module: wine Branch: master Commit: c9dbef3d96b39e4e09aa20b1813d491e4f0238f2 URL: http://source.winehq.org/git/wine.git/?a=commit;h=c9dbef3d96b39e4e09aa20b181...
Author: Piotr Caban piotr@codeweavers.com Date: Wed Jun 5 11:33:29 2013 +0200
kernet32: Added DuplicateHandle tests with DUPLICATE_CLOSE_SOURCE flag.
---
dlls/kernel32/tests/process.c | 98 +++++++++++++++++++++++++++++++++++++++++ 1 files changed, 98 insertions(+), 0 deletions(-)
diff --git a/dlls/kernel32/tests/process.c b/dlls/kernel32/tests/process.c index 9d3e983..1fef8ac 100644 --- a/dlls/kernel32/tests/process.c +++ b/dlls/kernel32/tests/process.c @@ -1963,6 +1963,103 @@ static void test_TerminateProcess(void) CloseHandle(pi.hThread); }
+static void test_DuplicateHandle(void) +{ + char path[MAX_PATH], file_name[MAX_PATH]; + HANDLE f, fmin, out; + DWORD info; + BOOL r; + + r = DuplicateHandle(GetCurrentProcess(), GetCurrentProcess(), + GetCurrentProcess(), &out, 0, FALSE, + DUPLICATE_SAME_ACCESS | DUPLICATE_CLOSE_SOURCE); + ok(r, "DuplicateHandle error %u\n", GetLastError()); + r = GetHandleInformation(out, &info); + ok(r, "GetHandleInformation error %u\n", GetLastError()); + ok(info == 0, "info = %x\n", info); + ok(out != GetCurrentProcess(), "out = GetCurrentProcess()\n"); + CloseHandle(out); + + r = DuplicateHandle(GetCurrentProcess(), GetCurrentProcess(), + GetCurrentProcess(), &out, 0, TRUE, + DUPLICATE_SAME_ACCESS | DUPLICATE_CLOSE_SOURCE); + ok(r, "DuplicateHandle error %u\n", GetLastError()); + r = GetHandleInformation(out, &info); + ok(r, "GetHandleInformation error %u\n", GetLastError()); + ok(info == HANDLE_FLAG_INHERIT, "info = %x\n", info); + ok(out != GetCurrentProcess(), "out = GetCurrentProcess()\n"); + CloseHandle(out); + + GetTempPath(MAX_PATH, path); + GetTempFileName(path, "wt", 0, file_name); + f = CreateFile(file_name, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, 0); + if (f == INVALID_HANDLE_VALUE) + { + ok(0, "could not create %s\n", file_name); + return; + } + + r = DuplicateHandle(GetCurrentProcess(), f, GetCurrentProcess(), &out, + 0, FALSE, DUPLICATE_SAME_ACCESS | DUPLICATE_CLOSE_SOURCE); + ok(r, "DuplicateHandle error %u\n", GetLastError()); + ok(f == out, "f != out\n"); + r = GetHandleInformation(out, &info); + ok(r, "GetHandleInformation error %u\n", GetLastError()); + ok(info == 0, "info = %x\n", info); + + r = DuplicateHandle(GetCurrentProcess(), f, GetCurrentProcess(), &out, + 0, TRUE, DUPLICATE_SAME_ACCESS | DUPLICATE_CLOSE_SOURCE); + ok(r, "DuplicateHandle error %u\n", GetLastError()); + ok(f == out, "f != out\n"); + r = GetHandleInformation(out, &info); + ok(r, "GetHandleInformation error %u\n", GetLastError()); + ok(info == HANDLE_FLAG_INHERIT, "info = %x\n", info); + + r = SetHandleInformation(f, HANDLE_FLAG_PROTECT_FROM_CLOSE, HANDLE_FLAG_PROTECT_FROM_CLOSE); + ok(r, "SetHandleInformation error %u\n", GetLastError()); + r = DuplicateHandle(GetCurrentProcess(), f, GetCurrentProcess(), &out, + 0, TRUE, DUPLICATE_SAME_ACCESS | DUPLICATE_CLOSE_SOURCE); + ok(r, "DuplicateHandle error %u\n", GetLastError()); + ok(f != out, "f == out\n"); + r = GetHandleInformation(out, &info); + ok(r, "GetHandleInformation error %u\n", GetLastError()); + ok(info == HANDLE_FLAG_INHERIT, "info = %x\n", info); + r = SetHandleInformation(f, HANDLE_FLAG_PROTECT_FROM_CLOSE, 0); + ok(r, "SetHandleInformation error %u\n", GetLastError()); + + /* Test if DuplicateHandle allocates first free handle */ + if (f > out) + { + fmin = out; + } + else + { + fmin = f; + f = out; + } + CloseHandle(fmin); + r = DuplicateHandle(GetCurrentProcess(), f, GetCurrentProcess(), &out, + 0, TRUE, DUPLICATE_SAME_ACCESS | DUPLICATE_CLOSE_SOURCE); + ok(r, "DuplicateHandle error %u\n", GetLastError()); + ok(f == out, "f != out\n"); + CloseHandle(out); + DeleteFile(file_name); + + f = CreateFile("CONIN$", GENERIC_READ|GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, 0); + if (!is_console(f)) + { + skip("DuplicateHandle on console handle"); + CloseHandle(f); + return; + } + + r = DuplicateHandle(GetCurrentProcess(), f, GetCurrentProcess(), &out, + 0, FALSE, DUPLICATE_SAME_ACCESS | DUPLICATE_CLOSE_SOURCE); + ok(r, "DuplicateHandle error %u\n", GetLastError()); + todo_wine ok(f != out, "f == out\n"); + CloseHandle(out); +} + START_TEST(process) { int b = init(); @@ -1991,6 +2088,7 @@ START_TEST(process) test_Handles(); test_SystemInfo(); test_RegistryQuota(); + test_DuplicateHandle(); /* things that can be tested: * lookup: check the way program to be executed is searched * handles: check the handle inheritance stuff (+sec options)