[PATCH 5/5] xinput1_3: Allocate output report buffer on the heap.

Rémi Bernon rbernon at codeweavers.com
Mon Jun 7 12:37:58 CDT 2021


Signed-off-by: Rémi Bernon <rbernon at codeweavers.com>
---
 dlls/xinput1_3/hid.c | 29 +++++++++++++----------------
 1 file changed, 13 insertions(+), 16 deletions(-)

diff --git a/dlls/xinput1_3/hid.c b/dlls/xinput1_3/hid.c
index 6159a8e6d47..0f4dec44ee3 100644
--- a/dlls/xinput1_3/hid.c
+++ b/dlls/xinput1_3/hid.c
@@ -64,6 +64,7 @@ struct hid_platform_private {
     BOOL enabled;
 
     char *input_report_buf[2];
+    char *output_report_buf;
 
     struct axis_info lx, ly, ltrigger, rx, ry, rtrigger;
 };
@@ -185,6 +186,7 @@ static BOOL init_controller(xinput_controller *controller, PHIDP_PREPARSED_DATA
     private->device = device;
     if (!(private->input_report_buf[0] = calloc(1, private->caps.InputReportByteLength))) goto failed;
     if (!(private->input_report_buf[1] = calloc(1, private->caps.InputReportByteLength))) goto failed;
+    if (!(private->output_report_buf = calloc(1, private->caps.OutputReportByteLength))) goto failed;
     size = (lstrlenW(device_path) + 1) * sizeof(WCHAR);
     if (!(private->device_path = malloc(size))) goto failed;
     memcpy(private->device_path, device_path, size);
@@ -200,6 +202,7 @@ failed:
     free(private->device_path);
     free(private->input_report_buf[0]);
     free(private->input_report_buf[1]);
+    free(private->output_report_buf);
     free(private);
     return FALSE;
 }
@@ -311,6 +314,7 @@ static void remove_gamepad(xinput_controller *device)
         CloseHandle(private->device);
         free(private->input_report_buf[0]);
         free(private->input_report_buf[1]);
+        free(private->output_report_buf);
         free(private->device_path);
         HidD_FreePreparsedData(private->ppd);
         free(private);
@@ -460,14 +464,8 @@ void HID_update_state(xinput_controller *device, XINPUT_STATE *state)
 DWORD HID_set_state(xinput_controller* device, XINPUT_VIBRATION* state)
 {
     struct hid_platform_private *private = device->platform_private;
-
-    struct {
-        BYTE report;
-        BYTE pad1[2];
-        BYTE left;
-        BYTE right;
-        BYTE pad2[3];
-    } report;
+    char *output_report_buf = private->output_report_buf;
+    ULONG output_report_len = private->caps.OutputReportByteLength;
 
     if (device->caps.Flags & XINPUT_CAPS_FFB_SUPPORTED)
     {
@@ -476,14 +474,13 @@ DWORD HID_set_state(xinput_controller* device, XINPUT_VIBRATION* state)
 
         if (private->enabled)
         {
-            report.report = 0;
-            report.pad1[0] = 0x8;
-            report.pad1[1] = 0x0;
-            report.left = (BYTE)(state->wLeftMotorSpeed / 256);
-            report.right = (BYTE)(state->wRightMotorSpeed / 256);
-            memset(&report.pad2, 0, sizeof(report.pad2));
-
-            if (!HidD_SetOutputReport(private->device, &report, sizeof(report)))
+            memset(output_report_buf, 0, output_report_len);
+            output_report_buf[0] = /* report id */ 0;
+            output_report_buf[1] = 0x8;
+            output_report_buf[3] = (BYTE)(state->wLeftMotorSpeed / 256);
+            output_report_buf[4] = (BYTE)(state->wRightMotorSpeed / 256);
+
+            if (!HidD_SetOutputReport(private->device, output_report_buf, output_report_len))
             {
                 WARN("unable to set output report, HidD_SetOutputReport failed with error %u\n", GetLastError());
                 return GetLastError();
-- 
2.31.0




More information about the wine-devel mailing list