[PATCH 1/5] dinput/tests: Move bus PDO ioctl handling to a separate helper.

Rémi Bernon wine at gitlab.winehq.org
Thu Jun 2 02:39:10 CDT 2022


From: Rémi Bernon <rbernon at codeweavers.com>

Signed-off-by: Rémi Bernon <rbernon at codeweavers.com>
---
 dlls/dinput/tests/driver_bus.c | 53 +++++++++++++++++-----------------
 1 file changed, 26 insertions(+), 27 deletions(-)

diff --git a/dlls/dinput/tests/driver_bus.c b/dlls/dinput/tests/driver_bus.c
index 6a1994e509c..dc9b549e1d8 100644
--- a/dlls/dinput/tests/driver_bus.c
+++ b/dlls/dinput/tests/driver_bus.c
@@ -1244,40 +1244,29 @@ static NTSTATUS WINAPI driver_internal_ioctl( DEVICE_OBJECT *device, IRP *irp )
     return fdo_internal_ioctl( device, irp );
 }
 
-static NTSTATUS WINAPI pdo_ioctl( DEVICE_OBJECT *device, IRP *irp )
+static NTSTATUS pdo_handle_ioctl( struct phys_device *impl, IRP *irp, ULONG code, void *in_buffer, ULONG in_size )
 {
-    IO_STACK_LOCATION *stack = IoGetCurrentIrpStackLocation( irp );
-    struct phys_device *impl = pdo_from_DEVICE_OBJECT( device );
-    ULONG in_size = stack->Parameters.DeviceIoControl.InputBufferLength;
-    ULONG code = stack->Parameters.DeviceIoControl.IoControlCode;
-    NTSTATUS status;
     KIRQL irql;
 
-    if (winetest_debug > 1) trace( "%s: device %p, code %#lx %s\n", __func__, device, code, debugstr_ioctl(code) );
-
     switch (code)
     {
     case IOCTL_WINETEST_HID_SET_EXPECT:
-        expect_queue_reset( &impl->expect_queue, irp->AssociatedIrp.SystemBuffer, in_size );
-        status = STATUS_SUCCESS;
-        break;
+        expect_queue_reset( &impl->expect_queue, in_buffer, in_size );
+        return STATUS_SUCCESS;
     case IOCTL_WINETEST_HID_WAIT_EXPECT:
     {
-        struct wait_expect_params wait_params = *(struct wait_expect_params *)irp->AssociatedIrp.SystemBuffer;
-        if (!wait_params.wait_pending) status = expect_queue_wait( &impl->expect_queue, irp );
-        else status = expect_queue_wait_pending( &impl->expect_queue, irp );
-        break;
+        struct wait_expect_params wait_params = *(struct wait_expect_params *)in_buffer;
+        if (!wait_params.wait_pending) return expect_queue_wait( &impl->expect_queue, irp );
+        else return expect_queue_wait_pending( &impl->expect_queue, irp );
     }
     case IOCTL_WINETEST_HID_SEND_INPUT:
-        input_queue_reset( &impl->input_queue, irp->AssociatedIrp.SystemBuffer, in_size );
-        status = STATUS_SUCCESS;
-        break;
+        input_queue_reset( &impl->input_queue, in_buffer, in_size );
+        return STATUS_SUCCESS;
     case IOCTL_WINETEST_HID_SET_CONTEXT:
         KeAcquireSpinLock( &impl->expect_queue.lock, &irql );
-        memcpy( impl->expect_queue.context, irp->AssociatedIrp.SystemBuffer, in_size );
+        memcpy( impl->expect_queue.context, in_buffer, in_size );
         KeReleaseSpinLock( &impl->expect_queue.lock, irql );
-        status = STATUS_SUCCESS;
-        break;
+        return STATUS_SUCCESS;
     case IOCTL_WINETEST_REMOVE_DEVICE:
         KeAcquireSpinLock( &impl->base.lock, &irql );
         impl->base.state = PNP_DEVICE_REMOVED;
@@ -1285,17 +1274,27 @@ static NTSTATUS WINAPI pdo_ioctl( DEVICE_OBJECT *device, IRP *irp )
         KeReleaseSpinLock( &impl->base.lock, irql );
         impl->pending_remove = irp;
         IoMarkIrpPending( irp );
-        status = STATUS_PENDING;
-        break;
+        return STATUS_PENDING;
     case IOCTL_WINETEST_CREATE_DEVICE:
         ok( 0, "unexpected call\n" );
-        status = irp->IoStatus.Status;
-        break;
+        return irp->IoStatus.Status;
     default:
         ok( 0, "unexpected call\n" );
-        status = irp->IoStatus.Status;
-        break;
+        return irp->IoStatus.Status;
     }
+}
+
+static NTSTATUS WINAPI pdo_ioctl( DEVICE_OBJECT *device, IRP *irp )
+{
+    IO_STACK_LOCATION *stack = IoGetCurrentIrpStackLocation( irp );
+    struct phys_device *impl = pdo_from_DEVICE_OBJECT( device );
+    ULONG in_size = stack->Parameters.DeviceIoControl.InputBufferLength;
+    ULONG code = stack->Parameters.DeviceIoControl.IoControlCode;
+    NTSTATUS status;
+
+    if (winetest_debug > 1) trace( "%s: device %p, code %#lx %s\n", __func__, device, code, debugstr_ioctl(code) );
+
+    status = pdo_handle_ioctl( impl, irp, code, irp->AssociatedIrp.SystemBuffer, in_size );
 
     if (status != STATUS_PENDING)
     {
-- 
GitLab


https://gitlab.winehq.org/wine/wine/-/merge_requests/171



More information about the wine-devel mailing list