From 50690e08bd712c0b31c40197584b1c89a804dd53 Mon Sep 17 00:00:00 2001
From: Arkadiusz Hiler <ahiler@codeweavers.com>
Date: Fri, 22 Jul 2022 14:54:41 +0300
Subject: [PATCH] dinput: Enumerate user format object forwards.

It's important for the default broken formats like c_dfDIJoystick2 which
have multiple sets of sliders defined with the same offsets.
---
 dlls/dinput/device.c | 18 ++++++++----------
 1 file changed, 8 insertions(+), 10 deletions(-)

diff --git a/dlls/dinput/device.c b/dlls/dinput/device.c
index e15a22bb413..f0220252279 100644
--- a/dlls/dinput/device.c
+++ b/dlls/dinput/device.c
@@ -880,25 +880,23 @@ static HRESULT WINAPI dinput_device_EnumObjects( IDirectInputDevice8W *iface,
 
 static HRESULT enum_object_filter_init( struct dinput_device *impl, DIPROPHEADER *filter )
 {
-    DIDATAFORMAT *device_format = &impl->device_format, *user_format = &impl->user_format;
-    DIOBJECTDATAFORMAT *device_obj, *user_obj;
+    DIOBJECTDATAFORMAT *user_objs = impl->user_format.rgodf;
+    DWORD i, count = impl->device_format.dwNumObjs;
 
     if (filter->dwHow > DIPH_BYUSAGE) return DIERR_INVALIDPARAM;
     if (filter->dwHow == DIPH_BYUSAGE && !(impl->instance.dwDevType & DIDEVTYPE_HID)) return DIERR_UNSUPPORTED;
     if (filter->dwHow != DIPH_BYOFFSET) return DI_OK;
 
-    if (!user_format->rgodf) return DIERR_NOTFOUND;
+    if (!user_objs) return DIERR_NOTFOUND;
 
-    user_obj = user_format->rgodf + device_format->dwNumObjs;
-    device_obj = device_format->rgodf + device_format->dwNumObjs;
-    while (user_obj-- > user_format->rgodf && device_obj-- > device_format->rgodf)
+    for (i = 0; i < count; i++)
     {
-        if (!user_obj->dwType) continue;
-        if (user_obj->dwOfs == filter->dwObj) break;
+        if (!user_objs[i].dwType) continue;
+        if (user_objs[i].dwOfs == filter->dwObj) break;
     }
-    if (user_obj < user_format->rgodf) return DIERR_NOTFOUND;
+    if (i == count) return DIERR_NOTFOUND;
 
-    filter->dwObj = device_obj->dwOfs;
+    filter->dwObj = impl->device_format.rgodf[i].dwOfs;
     return DI_OK;
 }
 
-- 
GitLab