Jacek Caban : ntdll: Set IO_STATUS_BLOCK on non-blocking NtFlushBuffersFile success.

Alexandre Julliard julliard at winehq.org
Mon Oct 22 15:38:44 CDT 2018


Module: wine
Branch: master
Commit: 6bcd695c786575d7ba136b3fa7016085977167b0
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=6bcd695c786575d7ba136b3fa7016085977167b0

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Sat Oct 20 19:19:17 2018 +0200

ntdll: Set IO_STATUS_BLOCK on non-blocking NtFlushBuffersFile success.

Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/ntdll/file.c       | 21 ++++++++++++++-------
 dlls/ntdll/tests/file.c |  2 --
 dlls/ntdll/tests/pipe.c |  2 +-
 3 files changed, 15 insertions(+), 10 deletions(-)

diff --git a/dlls/ntdll/file.c b/dlls/ntdll/file.c
index 93af301..77d2d32 100644
--- a/dlls/ntdll/file.c
+++ b/dlls/ntdll/file.c
@@ -3298,13 +3298,15 @@ NTSTATUS WINAPI NtSetEaFile( HANDLE hFile, PIO_STATUS_BLOCK iosb, PVOID buffer,
  *  Success: 0. IoStatusBlock is updated.
  *  Failure: An NTSTATUS error code describing the error.
  */
-NTSTATUS WINAPI NtFlushBuffersFile( HANDLE hFile, IO_STATUS_BLOCK* IoStatusBlock )
+NTSTATUS WINAPI NtFlushBuffersFile( HANDLE hFile, IO_STATUS_BLOCK *io )
 {
     NTSTATUS ret;
-    HANDLE hEvent = NULL;
+    HANDLE wait_handle;
     enum server_fd_type type;
     int fd, needs_close;
 
+    if (!io || !virtual_check_buffer_for_write( io, sizeof(io) )) return STATUS_ACCESS_VIOLATION;
+
     ret = server_get_unix_fd( hFile, FILE_WRITE_DATA, &fd, &needs_close, &type, NULL );
     if (ret == STATUS_ACCESS_DENIED)
         ret = server_get_unix_fd( hFile, FILE_APPEND_DATA, &fd, &needs_close, &type, NULL );
@@ -3317,16 +3319,21 @@ NTSTATUS WINAPI NtFlushBuffersFile( HANDLE hFile, IO_STATUS_BLOCK* IoStatusBlock
     {
         SERVER_START_REQ( flush )
         {
-            req->async = server_async( hFile, NULL, NULL, NULL, NULL, IoStatusBlock );
+            req->async = server_async( hFile, NULL, NULL, NULL, NULL, io );
             ret = wine_server_call( req );
-            hEvent = wine_server_ptr_handle( reply->event );
+            wait_handle = wine_server_ptr_handle( reply->event );
+            if (wait_handle && ret != STATUS_PENDING)
+            {
+                io->u.Status    = ret;
+                io->Information = 0;
+            }
         }
         SERVER_END_REQ;
 
-        if (hEvent)
+        if (wait_handle)
         {
-            NtWaitForSingleObject( hEvent, FALSE, NULL );
-            ret = STATUS_SUCCESS;
+            NtWaitForSingleObject( wait_handle, FALSE, NULL );
+            ret = io->u.Status;
         }
     }
 
diff --git a/dlls/ntdll/tests/file.c b/dlls/ntdll/tests/file.c
index 0f4281d..e523990 100644
--- a/dlls/ntdll/tests/file.c
+++ b/dlls/ntdll/tests/file.c
@@ -4501,11 +4501,9 @@ static void test_flush_buffers_file(void)
     ok(hfileread != INVALID_HANDLE_VALUE, "could not open temp file, error %d.\n", GetLastError());
 
     status = pNtFlushBuffersFile(hfile, NULL);
-    todo_wine
     ok(status == STATUS_ACCESS_VIOLATION, "expected STATUS_ACCESS_VIOLATION, got %#x.\n", status);
 
     status = pNtFlushBuffersFile(hfile, (IO_STATUS_BLOCK *)0xdeadbeaf);
-    todo_wine
     ok(status == STATUS_ACCESS_VIOLATION, "expected STATUS_ACCESS_VIOLATION, got %#x.\n", status);
 
     status = pNtFlushBuffersFile(hfile, &io_status_block);
diff --git a/dlls/ntdll/tests/pipe.c b/dlls/ntdll/tests/pipe.c
index 798df53..45c8466 100644
--- a/dlls/ntdll/tests/pipe.c
+++ b/dlls/ntdll/tests/pipe.c
@@ -1378,8 +1378,8 @@ static void test_pipe_state(HANDLE pipe, BOOL is_server, DWORD state)
     {
         ok(status == STATUS_SUCCESS, "status = %x in %s state %u\n",
            status, is_server ? "server" : "client", state);
-        todo_wine
         ok(io.Status == status, "io.Status = %x\n", io.Status);
+        ok(!io.Information, "io.Information = %lx\n", io.Information);
     }
 
     if (state != FILE_PIPE_CONNECTED_STATE)




More information about the wine-cvs mailing list