[PATCH v3 3/4] dinput: Allow 0xff as a DIDFT_ANYINSTANCE alias with old dinput version.

Rémi Bernon rbernon at codeweavers.com
Tue Jan 4 03:41:09 CST 2022


Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=52267
Signed-off-by: Rémi Bernon <rbernon at codeweavers.com>
---
 dlls/dinput/device.c          | 6 ++++--
 dlls/dinput/tests/joystick8.c | 1 -
 2 files changed, 4 insertions(+), 3 deletions(-)

diff --git a/dlls/dinput/device.c b/dlls/dinput/device.c
index 834b87f5fe0..a4c85351648 100644
--- a/dlls/dinput/device.c
+++ b/dlls/dinput/device.c
@@ -240,11 +240,13 @@ LPDIOBJECTDATAFORMAT dataformat_to_odf_by_type(LPCDIDATAFORMAT df, int n, DWORD
 }
 
 static BOOL match_device_object( DIDATAFORMAT *device_format, DIDATAFORMAT *user_format,
-                                 const DIDATAFORMAT *format, const DIOBJECTDATAFORMAT *match_obj )
+                                 const DIDATAFORMAT *format, const DIOBJECTDATAFORMAT *match_obj, DWORD version )
 {
     DWORD i, device_instance, instance = DIDFT_GETINSTANCE( match_obj->dwType );
     DIOBJECTDATAFORMAT *device_obj, *user_obj;
 
+    if (version < 0x0700 && instance == 0xff) instance = 0xffff;
+
     for (i = 0; i < device_format->dwNumObjs; i++)
     {
         user_obj = user_format->rgodf + i;
@@ -292,7 +294,7 @@ static HRESULT dinput_device_init_user_format( struct dinput_device *impl, const
     {
         match_obj = format->rgodf + i;
 
-        if (!match_device_object( device_format, user_format, format, match_obj ))
+        if (!match_device_object( device_format, user_format, format, match_obj, impl->dinput->dwVersion ))
         {
             WARN( "object %s not found\n", debugstr_diobjectdataformat( match_obj ) );
             if (!(match_obj->dwType & DIDFT_OPTIONAL)) goto failed;
diff --git a/dlls/dinput/tests/joystick8.c b/dlls/dinput/tests/joystick8.c
index 6b02e02d036..4f9ba401673 100644
--- a/dlls/dinput/tests/joystick8.c
+++ b/dlls/dinput/tests/joystick8.c
@@ -1513,7 +1513,6 @@ static void test_simple_joystick( DWORD version )
     ok( hr == DIERR_INVALIDPARAM, "SetDataFormat returned: %#x\n", hr );
     objdataformat[1].dwType = DIDFT_AXIS | DIDFT_MAKEINSTANCE( 0xff );
     hr = IDirectInputDevice8_SetDataFormat( device, &dataformat );
-    todo_wine_if( version < 0x0700 )
     ok( hr == (version < 0x0700 ? DI_OK : DIERR_INVALIDPARAM),
         "SetDataFormat returned: %#x\n", hr );
     objdataformat[1].dwType = DIDFT_AXIS | DIDFT_MAKEINSTANCE( 1 );
-- 
2.34.1




More information about the wine-devel mailing list