Alexandre Julliard : ntdll: Fix iosb handling in NtCancelIoFile().
Alexandre Julliard
julliard at winehq.org
Wed Jul 7 15:01:30 CDT 2021
Module: wine
Branch: master
Commit: 27ecc6ba5f66a60767d70adbc0c815b57ce62af2
URL: https://source.winehq.org/git/wine.git/?a=commit;h=27ecc6ba5f66a60767d70adbc0c815b57ce62af2
Author: Alexandre Julliard <julliard at winehq.org>
Date: Wed Jul 7 11:51:25 2021 +0200
ntdll: Fix iosb handling in NtCancelIoFile().
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/ntdll/tests/change.c | 18 +++++++++++++++---
dlls/ntdll/unix/file.c | 22 ++++++++++++++++++----
2 files changed, 33 insertions(+), 7 deletions(-)
diff --git a/dlls/ntdll/tests/change.c b/dlls/ntdll/tests/change.c
index 1e643fc3eee..e7201b52a3c 100644
--- a/dlls/ntdll/tests/change.c
+++ b/dlls/ntdll/tests/change.c
@@ -168,7 +168,7 @@ static void test_ntncdf_async(void)
HANDLE hdir, hEvent;
char buffer[0x1000];
DWORD fflags, filter = 0;
- IO_STATUS_BLOCK iosb, iosb2;
+ IO_STATUS_BLOCK iosb, iosb2, iosb3;
WCHAR path[MAX_PATH], subdir[MAX_PATH];
static const WCHAR szBoo[] = { '\\','b','o','o',0 };
static const WCHAR szHoo[] = { '\\','h','o','o',0 };
@@ -293,16 +293,28 @@ static void test_ntncdf_async(void)
ok(U(iosb).Status == 0x01234567, "status set too soon\n");
ok(iosb.Information == 0x12345678, "info set too soon\n");
- r = pNtCancelIoFile(hdir, &iosb);
+ U(iosb3).Status = 0x111111;
+ iosb3.Information = 0x222222;
+
+ r = pNtCancelIoFile(hdir, &iosb3);
ok( r == STATUS_SUCCESS, "cancel failed\n");
CloseHandle(hdir);
- ok(U(iosb).Status == STATUS_SUCCESS, "status wrong\n");
+ ok(U(iosb).Status == STATUS_CANCELLED, "status wrong %x\n",U(iosb).Status);
ok(U(iosb2).Status == STATUS_CANCELLED, "status wrong %x\n",U(iosb2).Status);
+ ok(U(iosb3).Status == STATUS_SUCCESS, "status wrong %x\n",U(iosb3).Status);
ok(iosb.Information == 0, "info wrong\n");
ok(iosb2.Information == 0, "info wrong\n");
+ ok(iosb3.Information == 0, "info wrong\n");
+
+ U(iosb3).Status = 0x111111;
+ iosb3.Information = 0x222222;
+ r = pNtCancelIoFile(hdir, &iosb3);
+ ok( r == STATUS_INVALID_HANDLE, "cancel failed %x\n", r);
+ ok(U(iosb3).Status == 0x111111, "status wrong %x\n",U(iosb3).Status);
+ ok(iosb3.Information == 0x222222, "info wrong\n");
r = RemoveDirectoryW( path );
ok( r == TRUE, "failed to remove directory\n");
diff --git a/dlls/ntdll/unix/file.c b/dlls/ntdll/unix/file.c
index 21bcb215385..626a0957644 100644
--- a/dlls/ntdll/unix/file.c
+++ b/dlls/ntdll/unix/file.c
@@ -5931,16 +5931,23 @@ NTSTATUS WINAPI NtFlushBuffersFile( HANDLE handle, IO_STATUS_BLOCK *io )
*/
NTSTATUS WINAPI NtCancelIoFile( HANDLE handle, IO_STATUS_BLOCK *io_status )
{
+ NTSTATUS status;
+
TRACE( "%p %p\n", handle, io_status );
SERVER_START_REQ( cancel_async )
{
req->handle = wine_server_obj_handle( handle );
req->only_thread = TRUE;
- io_status->u.Status = wine_server_call( req );
+ if (!(status = wine_server_call( req )))
+ {
+ io_status->u.Status = status;
+ io_status->Information = 0;
+ }
}
SERVER_END_REQ;
- return io_status->u.Status;
+
+ return status;
}
@@ -5949,16 +5956,23 @@ NTSTATUS WINAPI NtCancelIoFile( HANDLE handle, IO_STATUS_BLOCK *io_status )
*/
NTSTATUS WINAPI NtCancelIoFileEx( HANDLE handle, IO_STATUS_BLOCK *io, IO_STATUS_BLOCK *io_status )
{
+ NTSTATUS status;
+
TRACE( "%p %p %p\n", handle, io, io_status );
SERVER_START_REQ( cancel_async )
{
req->handle = wine_server_obj_handle( handle );
req->iosb = wine_server_client_ptr( io );
- io_status->u.Status = wine_server_call( req );
+ if (!(status = wine_server_call( req )))
+ {
+ io_status->u.Status = status;
+ io_status->Information = 0;
+ }
}
SERVER_END_REQ;
- return io_status->u.Status;
+
+ return status;
}
More information about the wine-cvs
mailing list