From 37d2b5843f6f3d5bb18b7bf9445c7019cf25a56d Mon Sep 17 00:00:00 2001 From: Piotr Caban Date: Thu, 3 Oct 2019 20:54:32 +0200 Subject: [PATCH] kernel32: Add write watch test on OVERLAPPED structure. Signed-off-by: Piotr Caban Signed-off-by: Alexandre Julliard --- dlls/kernel32/tests/virtual.c | 63 ++++++++++++++++++++++++++++++++++- 1 file changed, 62 insertions(+), 1 deletion(-) diff --git a/dlls/kernel32/tests/virtual.c b/dlls/kernel32/tests/virtual.c index bde71b9c648..9a35bfe2906 100644 --- a/dlls/kernel32/tests/virtual.c +++ b/dlls/kernel32/tests/virtual.c @@ -1602,7 +1602,7 @@ static void test_write_watch(void) DWORD ret, size, old_prot, num_bytes; MEMORY_BASIC_INFORMATION info; HANDLE readpipe, writepipe, file; - OVERLAPPED overlapped; + OVERLAPPED overlapped, *overlapped2; void *results[64]; ULONG_PTR count; ULONG i, pagesize; @@ -1906,6 +1906,67 @@ static void test_write_watch(void) ok( !ret, "GetWriteWatch failed %u\n", GetLastError() ); ok( count == 0, "wrong count %lu\n", count ); + /* OVERLAPPED structure write watch */ + memset( &overlapped, 0, sizeof(overlapped) ); + overlapped.hEvent = CreateEventA( NULL, TRUE, FALSE, NULL ); + + readpipe = CreateNamedPipeA( pipename, FILE_FLAG_OVERLAPPED | PIPE_ACCESS_INBOUND, + PIPE_TYPE_MESSAGE | PIPE_WAIT, 1, 1024, 1024, + NMPWAIT_USE_DEFAULT_WAIT, NULL ); + ok( readpipe != INVALID_HANDLE_VALUE, "CreateNamedPipeA failed %u\n", GetLastError() ); + + success = ConnectNamedPipe( readpipe, &overlapped ); + ok( !success, "ConnectNamedPipe unexpectedly succeeded\n" ); + ok( GetLastError() == ERROR_IO_PENDING, "expected ERROR_IO_PENDING, got %u\n", GetLastError() ); + + writepipe = CreateFileA( pipename, GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL ); + ok( writepipe != INVALID_HANDLE_VALUE, "CreateFileA failed %u\n", GetLastError() ); + + ret = WaitForSingleObject( overlapped.hEvent, 1000 ); + ok( ret == WAIT_OBJECT_0, "expected WAIT_OBJECT_0, got %u\n", ret ); + + memset( base, 0, size ); + overlapped2 = (OVERLAPPED*)(base + size - sizeof(*overlapped2)); + overlapped2->hEvent = CreateEventA( NULL, TRUE, FALSE, NULL ); + + count = 64; + ret = pGetWriteWatch( WRITE_WATCH_FLAG_RESET, base, size, results, &count, &pagesize ); + ok( !ret, "GetWriteWatch failed %u\n", GetLastError() ); + ok( count == 16, "wrong count %lu\n", count ); + + success = ReadFile( readpipe, base, sizeof(testdata), NULL, overlapped2 ); + ok( !success, "ReadFile unexpectedly succeeded\n" ); + ok( GetLastError() == ERROR_IO_PENDING, "expected ERROR_IO_PENDING, got %u\n", GetLastError() ); + overlapped2->Internal = 0xdeadbeef; + + count = 64; + ret = pGetWriteWatch( WRITE_WATCH_FLAG_RESET, base, size, results, &count, &pagesize ); + ok( !ret, "GetWriteWatch failed %u\n", GetLastError() ); + ok( count == 2, "wrong count %lu\n", count ); + + num_bytes = 0; + success = WriteFile( writepipe, testdata, sizeof(testdata), &num_bytes, NULL ); + ok( success, "WriteFile failed %u\n", GetLastError() ); + ok( num_bytes == sizeof(testdata), "wrong number of bytes written %u\n", num_bytes ); + + num_bytes = 0; + success = GetOverlappedResult( readpipe, overlapped2, &num_bytes, TRUE ); + ok( success, "GetOverlappedResult failed %u\n", GetLastError() ); + ok( num_bytes == sizeof(testdata), "wrong number of bytes read %u\n", num_bytes ); + ok( !memcmp( base, testdata, sizeof(testdata)), "didn't receive expected data\n" ); + + count = 64; + memset( results, 0, sizeof(results) ); + ret = pGetWriteWatch( WRITE_WATCH_FLAG_RESET, base, size, results, &count, &pagesize ); + ok( !ret, "GetWriteWatch failed %u\n", GetLastError() ); + ok( count == 2, "wrong count %lu\n", count ); + ok( results[0] == base, "wrong result %p\n", results[0] ); + + CloseHandle( readpipe ); + CloseHandle( writepipe ); + CloseHandle( overlapped.hEvent ); + CloseHandle( overlapped2->hEvent ); + /* some invalid parameter tests */ SetLastError( 0xdeadbeef );