Zebediah Figura : kernelbase: Return TRUE from DeviceIoControl() if the NT status denotes success.

Alexandre Julliard julliard at winehq.org
Tue Aug 31 15:40:22 CDT 2021


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

Author: Zebediah Figura <zfigura at codeweavers.com>
Date:   Mon Aug 30 22:26:02 2021 -0500

kernelbase: Return TRUE from DeviceIoControl() if the NT status denotes success.

Likely a similar treatment should be given to other kernelbase APIs, but it's
not immediately clear which.

Signed-off-by: Zebediah Figura <zfigura at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/kernelbase/file.c             | 3 ++-
 dlls/ntoskrnl.exe/tests/ntoskrnl.c | 6 +++---
 2 files changed, 5 insertions(+), 4 deletions(-)

diff --git a/dlls/kernelbase/file.c b/dlls/kernelbase/file.c
index d21ad299d1f..a4d26c2a1be 100644
--- a/dlls/kernelbase/file.c
+++ b/dlls/kernelbase/file.c
@@ -4116,7 +4116,8 @@ BOOL WINAPI DECLSPEC_HOTPATCH DeviceIoControl( HANDLE handle, DWORD code, void *
                                         in_buff, in_count, out_buff, out_count );
 
     if (returned) *returned = piosb->Information;
-    return set_ntstatus( status );
+    if (status == STATUS_PENDING || !NT_SUCCESS( status )) return set_ntstatus( status );
+    return TRUE;
 }
 
 
diff --git a/dlls/ntoskrnl.exe/tests/ntoskrnl.c b/dlls/ntoskrnl.exe/tests/ntoskrnl.c
index dc10497caee..9ee2f55a826 100644
--- a/dlls/ntoskrnl.exe/tests/ntoskrnl.c
+++ b/dlls/ntoskrnl.exe/tests/ntoskrnl.c
@@ -663,17 +663,17 @@ static void do_return_status(ULONG ioctl, struct return_status_params *params)
     size = 0xdeadf00d;
     SetLastError(0xdeadf00d);
     ret = DeviceIoControl(device, ioctl, params, sizeof(*params), buffer, sizeof(buffer), &size, NULL);
-    todo_wine_if (NT_SUCCESS(expect_status) != !params->iosb_status)
+    todo_wine_if (NT_SUCCESS(expect_status) != NT_SUCCESS(params->iosb_status))
         ok(ret == NT_SUCCESS(expect_status), "got %d\n", ret);
     if (NT_SUCCESS(expect_status))
     {
-        todo_wine_if (params->iosb_status)
+        todo_wine_if (!NT_SUCCESS(params->iosb_status))
             ok(GetLastError() == 0xdeadf00d, "got error %u\n", GetLastError());
     }
     else
     {
         todo_wine_if (RtlNtStatusToDosError(expect_status) != RtlNtStatusToDosError(params->iosb_status)
-                || params->iosb_status == STATUS_PENDING)
+                || NT_SUCCESS(params->iosb_status))
             ok(GetLastError() == RtlNtStatusToDosError(expect_status), "got error %u\n", GetLastError());
     }
     if (NT_ERROR(expect_status))




More information about the wine-cvs mailing list