From: Sebastian Lackner Subject: [1/2] kernel32/tests: Add tests for calling wait functions with pseudo handles. Message-Id: <56565660.6020103@fds-team.de> Date: Thu, 26 Nov 2015 01:46:24 +0100 Signed-off-by: Sebastian Lackner --- dlls/kernel32/tests/sync.c | 59 ++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 53 insertions(+), 6 deletions(-) diff --git a/dlls/kernel32/tests/sync.c b/dlls/kernel32/tests/sync.c index 4ac6a99..7d714d0 100644 --- a/dlls/kernel32/tests/sync.c +++ b/dlls/kernel32/tests/sync.c @@ -59,6 +59,7 @@ static BOOLEAN (WINAPI *pTryAcquireSRWLockShared)(PSRWLOCK); static NTSTATUS (WINAPI *pNtAllocateVirtualMemory)(HANDLE, PVOID *, ULONG, SIZE_T *, ULONG, ULONG); static NTSTATUS (WINAPI *pNtFreeVirtualMemory)(HANDLE, PVOID *, SIZE_T *, ULONG); +static NTSTATUS (WINAPI *pNtWaitForSingleObject)(HANDLE, BOOLEAN, const LARGE_INTEGER *); static NTSTATUS (WINAPI *pNtWaitForMultipleObjects)(ULONG,const HANDLE*,BOOLEAN,BOOLEAN,const LARGE_INTEGER*); static void test_signalandwait(void) @@ -1075,6 +1076,8 @@ static HANDLE modify_handle(HANDLE handle, DWORD modify) static void test_WaitForSingleObject(void) { HANDLE signaled, nonsignaled, invalid; + LARGE_INTEGER timeout; + NTSTATUS status; DWORD ret; signaled = CreateEventW(NULL, TRUE, TRUE, NULL); @@ -1144,12 +1147,29 @@ static void test_WaitForSingleObject(void) ok(ret == WAIT_OBJECT_0, "expected WAIT_OBJECT_0, got %d\n", ret); ok(GetLastError() == 0xdeadbeef, "expected 0xdeadbeef, got %d\n", GetLastError()); + /* pseudo handles are allowed in WaitForSingleObject and NtWaitForSingleObject */ + ret = WaitForSingleObject(GetCurrentProcess(), 100); + ok(ret == WAIT_TIMEOUT, "expected WAIT_TIMEOUT, got %u\n", ret); + + ret = WaitForSingleObject(GetCurrentThread(), 100); + ok(ret == WAIT_TIMEOUT, "expected WAIT_TIMEOUT, got %u\n", ret); + + timeout.QuadPart = -1000000; + status = pNtWaitForSingleObject(GetCurrentProcess(), FALSE, &timeout); + ok(status == STATUS_TIMEOUT, "expected STATUS_TIMEOUT, got %08x\n", status); + + timeout.QuadPart = -1000000; + status = pNtWaitForSingleObject(GetCurrentThread(), FALSE, &timeout); + ok(status == STATUS_TIMEOUT, "expected STATUS_TIMEOUT, got %08x\n", status); + CloseHandle(signaled); CloseHandle(nonsignaled); } static void test_WaitForMultipleObjects(void) { + LARGE_INTEGER timeout; + NTSTATUS status; DWORD r; int i; HANDLE maxevents[MAXIMUM_WAIT_OBJECTS]; @@ -1180,20 +1200,46 @@ static void test_WaitForMultipleObjects(void) SetEvent(maxevents[i]); /* a manual-reset event remains signaled, an auto-reset event is cleared */ - r = pNtWaitForMultipleObjects(MAXIMUM_WAIT_OBJECTS, maxevents, TRUE, FALSE, NULL); - ok( r == WAIT_OBJECT_0, "should signal lowest handle first, got %d\n", r); - r = pNtWaitForMultipleObjects(MAXIMUM_WAIT_OBJECTS, maxevents, TRUE, FALSE, NULL); - ok( r == WAIT_OBJECT_0, "should signal handle #0 first, got %d\n", r); + status = pNtWaitForMultipleObjects(MAXIMUM_WAIT_OBJECTS, maxevents, TRUE, FALSE, NULL); + ok(status == STATUS_WAIT_0, "should signal lowest handle first, got %08x\n", status); + status = pNtWaitForMultipleObjects(MAXIMUM_WAIT_OBJECTS, maxevents, TRUE, FALSE, NULL); + ok(status == STATUS_WAIT_0, "should signal handle #0 first, got %08x\n", status); ok(ResetEvent(maxevents[0]), "ResetEvent\n"); for (i=1; i