Rémi Bernon : hidclass.sys: Drop input packets with unexpected length in non-polled mode.

Alexandre Julliard julliard at winehq.org
Tue Sep 14 16:00:13 CDT 2021


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

Author: Rémi Bernon <rbernon at codeweavers.com>
Date:   Tue Sep 14 10:38:41 2021 +0200

hidclass.sys: Drop input packets with unexpected length in non-polled mode.

Signed-off-by: Rémi Bernon <rbernon at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/dinput8/tests/hid.c   |  3 ---
 dlls/hidclass.sys/device.c | 10 ++++++----
 2 files changed, 6 insertions(+), 7 deletions(-)

diff --git a/dlls/dinput8/tests/hid.c b/dlls/dinput8/tests/hid.c
index 0d0e528bf40..40d40b6fcdf 100644
--- a/dlls/dinput8/tests/hid.c
+++ b/dlls/dinput8/tests/hid.c
@@ -2187,7 +2187,6 @@ static void test_hidp( HANDLE file, HANDLE async_file, int report_id, BOOL polle
         /* first read should be completed */
         ret = GetOverlappedResult( async_file, &overlapped, &value, TRUE );
         ok( ret, "GetOverlappedResult failed, last error %u\n", GetLastError() );
-        todo_wine
         ok( value == caps.InputReportByteLength, "got length %u, expected %u\n", value, caps.InputReportByteLength );
         /* second read should still be pending */
         Sleep( 50 );
@@ -2206,13 +2205,11 @@ static void test_hidp( HANDLE file, HANDLE async_file, int report_id, BOOL polle
 
         ret = GetOverlappedResult( async_file, &overlapped2, &value, TRUE );
         ok( ret, "GetOverlappedResult failed, last error %u\n", GetLastError() );
-        todo_wine
         ok( value == caps.InputReportByteLength, "got length %u, expected %u\n", value, caps.InputReportByteLength );
 
         off = report_id ? 0 : 1;
         todo_wine
         ok( memcmp( report, buffer, caps.InputReportByteLength ), "expected different report\n" );
-        todo_wine
         ok( !memcmp( report + off, report + caps.InputReportByteLength, caps.InputReportByteLength - off ),
             "expected identical reports\n" );
         todo_wine
diff --git a/dlls/hidclass.sys/device.c b/dlls/hidclass.sys/device.c
index 71fb4a366db..b9b31045297 100644
--- a/dlls/hidclass.sys/device.c
+++ b/dlls/hidclass.sys/device.c
@@ -246,7 +246,8 @@ static DWORD CALLBACK hid_device_thread(void *args)
     HIDP_COLLECTION_DESC *desc = ext->u.pdo.device_desc.CollectionDesc;
     HIDP_REPORT_IDS *reports = ext->u.pdo.device_desc.ReportIDs;
     ULONG report_count = ext->u.pdo.device_desc.ReportIDsLength;
-    ULONG i, report_id = 0, poll_interval = 0;
+    BOOL polled = ext->u.pdo.information.Polled;
+    ULONG i, report_id = 0, timeout = 0;
     HID_XFER_PACKET *packet;
     IO_STATUS_BLOCK io;
     BYTE *buffer;
@@ -256,7 +257,7 @@ static DWORD CALLBACK hid_device_thread(void *args)
     buffer = (BYTE *)(packet + 1);
     packet->reportBuffer = buffer;
 
-    if (ext->u.pdo.information.Polled) poll_interval = ext->u.pdo.poll_interval;
+    if (polled) timeout = ext->u.pdo.poll_interval;
 
     for (i = 0; i < report_count; ++i)
     {
@@ -288,10 +289,11 @@ static DWORD CALLBACK hid_device_thread(void *args)
             packet->reportBuffer = buffer;
             packet->reportBufferLen = io.Information;
 
-            hid_device_queue_input( device, packet );
+            if (polled || io.Information == desc->InputLength)
+                hid_device_queue_input( device, packet );
         }
 
-        res = WaitForSingleObject(ext->u.pdo.halt_event, poll_interval);
+        res = WaitForSingleObject(ext->u.pdo.halt_event, timeout);
     } while (res == WAIT_TIMEOUT);
 
     TRACE("device thread exiting, res %#x\n", res);




More information about the wine-cvs mailing list