From: Paul Gofman pgofman@codeweavers.com
--- dlls/kernel32/tests/file.c | 26 +++++++++++++------------- dlls/kernelbase/file.c | 26 +++++++++++++------------- 2 files changed, 26 insertions(+), 26 deletions(-)
diff --git a/dlls/kernel32/tests/file.c b/dlls/kernel32/tests/file.c index e4ec612d487..040c5aa36bb 100644 --- a/dlls/kernel32/tests/file.c +++ b/dlls/kernel32/tests/file.c @@ -3908,7 +3908,7 @@ static void test_overlapped(void) r = pGetOverlappedResultEx(event, &ov, &result, 1, FALSE); ok(ov.Internal == STATUS_PENDING, "got %#Ix.\n", ov.Internal); ok(r, "got %lu, error %lu.\n", r, GetLastError()); - todo_wine ok(GetLastError() == ERROR_IO_PENDING, "got %lu.\n", GetLastError()); + ok(GetLastError() == ERROR_IO_PENDING, "got %lu.\n", GetLastError()); ok( result == 0xabcd, "wrong result %lu\n", result ); r = WaitForSingleObject(event, 0); ok(r == WAIT_TIMEOUT, "got %#lx.\n", r); @@ -3932,7 +3932,7 @@ static void test_overlapped(void) ov.hEvent = event; QueueUserAPC( user_apc, GetCurrentThread(), 0 ); r = pGetOverlappedResultEx(event, &ov, &result, INFINITE, TRUE); - todo_wine ok(!r && GetLastError() == WAIT_IO_COMPLETION, "got %lu, error %lu.\n", r, GetLastError()); + ok(!r && GetLastError() == WAIT_IO_COMPLETION, "got %lu, error %lu.\n", r, GetLastError());
SetLastError(0xdeadbeef); result = 0xdeadbeef; @@ -3940,7 +3940,7 @@ static void test_overlapped(void) ov.InternalHigh = 0xabcd; ov.hEvent = event; r = pGetOverlappedResultEx(event, &ov, &result, 0, 0); - todo_wine ok(GetLastError() == ERROR_SUCCESS, "got %lu.\n", GetLastError()); + ok(GetLastError() == ERROR_SUCCESS, "got %lu.\n", GetLastError()); ok(r, "got %lu, error %lu.\n", r, GetLastError()); ok( result == 0xabcd, "wrong result %lu\n", result );
@@ -3949,8 +3949,8 @@ static void test_overlapped(void) ov.InternalHigh = 0xabcd; ov.hEvent = event; r = pGetOverlappedResultEx(event, &ov, &result, 1, 0); - todo_wine ok(!r && GetLastError() == WAIT_TIMEOUT, "got %lu, error %lu.\n", r, GetLastError()); - todo_wine ok( result == 0xdeadbeef, "wrong result %lu\n", result ); + ok(!r && GetLastError() == WAIT_TIMEOUT, "got %lu, error %lu.\n", r, GetLastError()); + ok( result == 0xdeadbeef, "wrong result %lu\n", result );
result = 0xdeadbeef; ov.Internal = STATUS_SUCCESS; @@ -3958,8 +3958,8 @@ static void test_overlapped(void) ov.hEvent = NULL; QueueUserAPC( user_apc, GetCurrentThread(), 0 ); r = pGetOverlappedResultEx(event, &ov, &result, INFINITE, TRUE); - todo_wine ok(!r && GetLastError() == WAIT_IO_COMPLETION, "got %lu, error %lu.\n", r, GetLastError()); - todo_wine ok( result == 0xdeadbeef, "wrong result %lu\n", result ); + ok(!r && GetLastError() == WAIT_IO_COMPLETION, "got %lu, error %lu.\n", r, GetLastError()); + ok( result == 0xdeadbeef, "wrong result %lu\n", result );
SetLastError(0xdeadbeef); result = 0xdeadbeef; @@ -3967,7 +3967,7 @@ static void test_overlapped(void) ov.InternalHigh = 0xabcd; ov.hEvent = NULL; r = pGetOverlappedResultEx(event, &ov, &result, 0, 0); - todo_wine ok(GetLastError() == ERROR_SUCCESS, "got %lu.\n", GetLastError()); + ok(GetLastError() == ERROR_SUCCESS, "got %lu.\n", GetLastError()); ok(r, "got %lu, error %lu.\n", r, GetLastError()); ok( result == 0xabcd, "wrong result %lu\n", result );
@@ -3976,16 +3976,16 @@ static void test_overlapped(void) ov.InternalHigh = 0xabcd; ov.hEvent = NULL; r = pGetOverlappedResultEx(event, &ov, &result, 1, 0); - todo_wine ok(!r && GetLastError() == WAIT_TIMEOUT, "got %lu, error %lu.\n", r, GetLastError()); - todo_wine ok( result == 0xdeadbeef, "wrong result %lu\n", result ); + ok(!r && GetLastError() == WAIT_TIMEOUT, "got %lu, error %lu.\n", r, GetLastError()); + ok( result == 0xdeadbeef, "wrong result %lu\n", result );
result = 0xdeadbeef; ov.Internal = STATUS_UNEXPECTED_IO_ERROR; ov.InternalHigh = 0xabcd; ov.hEvent = NULL; r = pGetOverlappedResultEx(event, &ov, &result, 1, 0); - todo_wine ok(!r && GetLastError() == WAIT_TIMEOUT, "got %lu, error %lu.\n", r, GetLastError()); - todo_wine ok( result == 0xdeadbeef, "wrong result %lu\n", result ); + ok(!r && GetLastError() == WAIT_TIMEOUT, "got %lu, error %lu.\n", r, GetLastError()); + ok( result == 0xdeadbeef, "wrong result %lu\n", result );
result = 0xdeadbeef; ov.Internal = STATUS_UNEXPECTED_IO_ERROR; @@ -3996,7 +3996,7 @@ static void test_overlapped(void) ok(!r && GetLastError() == ERROR_IO_DEVICE, "got %lu, error %lu.\n", r, GetLastError()); ok( result == 0xabcd, "wrong result %lu\n", result ); r = WaitForSingleObject(event, 0); - todo_wine ok(r == WAIT_TIMEOUT, "got %#lx.\n", r); + ok(r == WAIT_TIMEOUT, "got %#lx.\n", r);
CloseHandle(event); } diff --git a/dlls/kernelbase/file.c b/dlls/kernelbase/file.c index 2435c174037..819a49063bf 100644 --- a/dlls/kernelbase/file.c +++ b/dlls/kernelbase/file.c @@ -3258,16 +3258,8 @@ BOOL WINAPI DECLSPEC_HOTPATCH GetOverlappedResultEx( HANDLE file, OVERLAPPED *ov
TRACE( "(%p %p %p %lu %d)\n", file, overlapped, result, timeout, alertable );
- /* Paired with the write-release in set_async_iosb() in ntdll; see the - * latter for details. */ - status = ReadAcquire( (LONG *)&overlapped->Internal ); - if (status == STATUS_PENDING) + if (timeout) { - if (!timeout) - { - SetLastError( ERROR_IO_INCOMPLETE ); - return FALSE; - } ret = WaitForSingleObjectEx( overlapped->hEvent ? overlapped->hEvent : file, timeout, alertable ); if (ret == WAIT_FAILED) return FALSE; @@ -3276,15 +3268,23 @@ BOOL WINAPI DECLSPEC_HOTPATCH GetOverlappedResultEx( HANDLE file, OVERLAPPED *ov SetLastError( ret ); return FALSE; } - /* We don't need to give this load acquire semantics; the wait above * already guarantees that the IOSB and output buffer are filled. */ status = overlapped->Internal; - if (status == STATUS_PENDING) status = STATUS_SUCCESS; } - + else + { + /* Paired with the write-release in set_async_iosb() in ntdll; see the + * latter for details. */ + if ((status = ReadAcquire( (LONG *)&overlapped->Internal )) == STATUS_PENDING) + { + SetLastError( ERROR_IO_INCOMPLETE ); + return FALSE; + } + } *result = overlapped->InternalHigh; - return set_ntstatus( status ); + SetLastError( RtlNtStatusToDosError( status )); + return !status || status == STATUS_PENDING; }