https://bugs.winehq.org/show_bug.cgi?id=51828
Bug ID: 51828 Summary: Simucube 2: All applications using raw HID access to communicate with devices, stopped tracking steering axis movement Product: Wine Version: 6.18 Hardware: x86-64 OS: Linux Status: UNCONFIRMED Severity: normal Priority: P2 Component: hid Assignee: wine-bugs@winehq.org Reporter: logos128@gmail.com CC: rbernon@codeweavers.com Regression SHA1: d40d8d968658dca4a75afc97f9e48acda0654b0f Distribution: ArchLinux
Created attachment 70716 --> https://bugs.winehq.org/attachment.cgi?id=70716 0001-hidclass.sys-Fix-input-reports-with-ReportID-being-d.patch
Found out that the dropping of input packets with lengths different than desc->InputLength, which was introduced with the regression commit is causing this issue. Since the Simucube 2 is a HID PID device, it uses multiple HID reports (with defined ReportIDs), which are different lengths. For such devices desc->InputLength specifies the biggest possible buffer length, that would fit any of the input reports. If the most essential input report for tracking the steering axis movements is smaller than desc->InputLength, it'll be dropped by that check. Only the reports with the exact same size go through in non polled mode. In this case with Simucube 2 the biggest input report is of 61 bytes, and is vendor defined. All the other input reports are smaller sizes, and will get dropped.
Attached a patch which fixes the issue. It also fixes possible memory access error with report->buffer while copying it to irp->AssociatedIrp.SystemBuffer, due to the internal buffer for hid_report being just report->length which could be less than or equal to desc->InputLength. The patch is based to the current master (aa629c4c7225166f4ee46476d98702df2e142711).