From: Arkadiusz Hiler ahiler@codeweavers.com
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 | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-)
diff --git a/dlls/dinput/device.c b/dlls/dinput/device.c index e15a22bb413..7323cb93c7a 100644 --- a/dlls/dinput/device.c +++ b/dlls/dinput/device.c @@ -882,6 +882,8 @@ static HRESULT enum_object_filter_init( struct dinput_device *impl, DIPROPHEADER { DIDATAFORMAT *device_format = &impl->device_format, *user_format = &impl->user_format; DIOBJECTDATAFORMAT *device_obj, *user_obj; + DWORD i; + BOOL found;
if (filter->dwHow > DIPH_BYUSAGE) return DIERR_INVALIDPARAM; if (filter->dwHow == DIPH_BYUSAGE && !(impl->instance.dwDevType & DIDEVTYPE_HID)) return DIERR_UNSUPPORTED; @@ -889,14 +891,14 @@ static HRESULT enum_object_filter_init( struct dinput_device *impl, DIPROPHEADER
if (!user_format->rgodf) 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 (found = FALSE, i = 0; !found && i < device_format->dwNumObjs; i++) { + user_obj = user_format->rgodf + i; + device_obj = device_format->rgodf + i; if (!user_obj->dwType) continue; - if (user_obj->dwOfs == filter->dwObj) break; + if (user_obj->dwOfs == filter->dwObj) found = TRUE; } - if (user_obj < user_format->rgodf) return DIERR_NOTFOUND; + if (!found) return DIERR_NOTFOUND;
filter->dwObj = device_obj->dwOfs; return DI_OK;