Alexandre Julliard : kernel32: Wait in overlapped Read/ WriteFile even when no overlapped structure is passed.
Module: wine Branch: master Commit: acb43cfef2c114c4da5c57675379a92bc9cba8f0 URL: http://source.winehq.org/git/wine.git/?a=commit;h=acb43cfef2c114c4da5c576753... Author: Alexandre Julliard <julliard(a)winehq.org> Date: Mon Jul 16 15:27:53 2007 +0200 kernel32: Wait in overlapped Read/WriteFile even when no overlapped structure is passed. --- dlls/kernel32/file.c | 12 ++++++++++++ dlls/kernel32/tests/pipe.c | 10 ++-------- 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/dlls/kernel32/file.c b/dlls/kernel32/file.c index a3d6942..1472893 100644 --- a/dlls/kernel32/file.c +++ b/dlls/kernel32/file.c @@ -424,6 +424,12 @@ BOOL WINAPI ReadFile( HANDLE hFile, LPVOID buffer, DWORD bytesToRead, status = NtReadFile(hFile, hEvent, NULL, NULL, io_status, buffer, bytesToRead, poffset, NULL); + if (status == STATUS_PENDING && !overlapped) + { + WaitForSingleObject( hFile, INFINITE ); + status = io_status->u.Status; + } + if (status != STATUS_PENDING && bytesRead) *bytesRead = io_status->Information; @@ -510,6 +516,12 @@ BOOL WINAPI WriteFile( HANDLE hFile, LPCVOID buffer, DWORD bytesToWrite, buffer, bytesToWrite); } + if (status == STATUS_PENDING && !overlapped) + { + WaitForSingleObject( hFile, INFINITE ); + status = piosb->u.Status; + } + if (status != STATUS_PENDING && bytesWritten) *bytesWritten = piosb->Information; diff --git a/dlls/kernel32/tests/pipe.c b/dlls/kernel32/tests/pipe.c index ccb72ba..2862592 100644 --- a/dlls/kernel32/tests/pipe.c +++ b/dlls/kernel32/tests/pipe.c @@ -1293,10 +1293,7 @@ static DWORD CALLBACK overlapped_server(LPVOID arg) /* This should block */ ret = ReadFile(pipe, buf, sizeof(buf), &num, NULL); - if(ret == 0) - todo_wine ok(ret == 1, "ret %d\n", ret); - else - ok(ret == 1, "ret %d\n", ret); + ok(ret == 1, "ret %d\n", ret); DisconnectNamedPipe(pipe); CloseHandle(ol.hEvent); @@ -1322,10 +1319,7 @@ static void test_overlapped(void) Sleep(1); ret = WriteFile(pipe, "x", 1, &num, NULL); - if(ret == 0) - todo_wine ok(ret == 1, "ret %d\n", ret); - else - ok(ret == 1, "ret %d\n", ret); + ok(ret == 1, "ret %d\n", ret); WaitForSingleObject(thread, INFINITE); CloseHandle(pipe);
participants (1)
-
Alexandre Julliard