[PATCH v3 1/4] dinput/tests: Test simple joystick with older dinput versions.

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


Signed-off-by: Rémi Bernon <rbernon at codeweavers.com>
---

v3: Fix a test result typo.
Supersedes: 222839-222841

 dlls/dinput/tests/joystick8.c | 453 ++++++++++++++++++++++++----------
 1 file changed, 323 insertions(+), 130 deletions(-)

diff --git a/dlls/dinput/tests/joystick8.c b/dlls/dinput/tests/joystick8.c
index e986bf2d1cb..0ff76da6463 100644
--- a/dlls/dinput/tests/joystick8.c
+++ b/dlls/dinput/tests/joystick8.c
@@ -39,8 +39,11 @@
 struct check_objects_todos
 {
     BOOL type;
+    BOOL ofs;
     BOOL guid;
+    BOOL flags;
     BOOL usage;
+    BOOL usage_page;
     BOOL name;
 };
 
@@ -77,16 +80,18 @@ static BOOL CALLBACK check_objects( const DIDEVICEOBJECTINSTANCEW *obj, void *ar
     check_member( *obj, *exp, "%u", dwSize );
     todo_wine_if( todo->guid )
     check_member_guid( *obj, *exp, guidType );
-    todo_wine_if( params->version < 0x700 && (obj->dwType & DIDFT_BUTTON) )
+    todo_wine_if( todo->ofs )
     check_member( *obj, *exp, "%#x", dwOfs );
     todo_wine_if( todo->type )
     check_member( *obj, *exp, "%#x", dwType );
+    todo_wine_if( todo->flags )
     check_member( *obj, *exp, "%#x", dwFlags );
     if (!localized) todo_wine_if( todo->name )check_member_wstr( *obj, *exp, tszName );
     check_member( *obj, *exp, "%u", dwFFMaxForce );
     check_member( *obj, *exp, "%u", dwFFForceResolution );
     check_member( *obj, *exp, "%u", wCollectionNumber );
     check_member( *obj, *exp, "%u", wDesignatorIndex );
+    todo_wine_if( todo->usage_page )
     check_member( *obj, *exp, "%#04x", wUsagePage );
     todo_wine_if( todo->usage )
     check_member( *obj, *exp, "%#04x", wUsage );
@@ -307,7 +312,7 @@ static void check_dinput_devices( DWORD version, DIDEVICEINSTANCEW *devinst )
     }
 }
 
-static void test_simple_joystick(void)
+static void test_simple_joystick( DWORD version )
 {
 #include "psh_hid_macros.h"
     static const unsigned char report_desc[] =
@@ -363,11 +368,12 @@ static void test_simple_joystick(void)
     {
         .InputReportByteLength = 9,
     };
-    static const DIDEVCAPS expect_caps =
+    const DIDEVCAPS expect_caps =
     {
         .dwSize = sizeof(DIDEVCAPS),
         .dwFlags = DIDC_ATTACHED | DIDC_EMULATED,
-        .dwDevType = DIDEVTYPE_HID | (DI8DEVTYPEJOYSTICK_LIMITED << 8) | DI8DEVTYPE_JOYSTICK,
+        .dwDevType = version >= 0x800 ? DIDEVTYPE_HID | (DI8DEVTYPEJOYSTICK_LIMITED << 8) | DI8DEVTYPE_JOYSTICK
+                                      : DIDEVTYPE_HID | (DIDEVTYPEJOYSTICK_RUDDER << 8) | DIDEVTYPE_JOYSTICK,
         .dwAxes = 6,
         .dwPOVs = 1,
         .dwButtons = 2,
@@ -452,7 +458,8 @@ static void test_simple_joystick(void)
         .dwSize = sizeof(DIDEVICEINSTANCEW),
         .guidInstance = expect_guid_product,
         .guidProduct = expect_guid_product,
-        .dwDevType = DIDEVTYPE_HID | (DI8DEVTYPEJOYSTICK_LIMITED << 8) | DI8DEVTYPE_JOYSTICK,
+        .dwDevType = version >= 0x800 ? DIDEVTYPE_HID | (DI8DEVTYPEJOYSTICK_LIMITED << 8) | DI8DEVTYPE_JOYSTICK
+                                      : DIDEVTYPE_HID | (DIDEVTYPEJOYSTICK_RUDDER << 8) | DIDEVTYPE_JOYSTICK,
         .tszInstanceName = L"Wine test root driver",
         .tszProductName = L"Wine test root driver",
         .guidFFDriver = GUID_NULL,
@@ -580,14 +587,110 @@ static void test_simple_joystick(void)
             .wUsage = HID_USAGE_GENERIC_JOYSTICK,
         },
     };
-    const DIEFFECTINFOW expect_effects[] = {};
-
+    const DIDEVICEOBJECTINSTANCEW expect_objects_5[] =
+    {
+        {
+            .dwSize = sizeof(DIDEVICEOBJECTINSTANCEW),
+            .guidType = GUID_XAxis,
+            .dwOfs = DIJOFS_X,
+            .dwType = DIDFT_ABSAXIS|DIDFT_MAKEINSTANCE(0),
+            .dwFlags = DIDOI_ASPECTPOSITION,
+            .tszName = L"X Axis",
+            .wCollectionNumber = 1,
+            .wUsagePage = HID_USAGE_PAGE_GENERIC,
+            .wUsage = HID_USAGE_GENERIC_X,
+            .wReportId = 1,
+        },
+        {
+            .dwSize = sizeof(DIDEVICEOBJECTINSTANCEW),
+            .guidType = GUID_YAxis,
+            .dwOfs = DIJOFS_Y,
+            .dwType = DIDFT_ABSAXIS|DIDFT_MAKEINSTANCE(1),
+            .dwFlags = DIDOI_ASPECTPOSITION,
+            .tszName = L"Y Axis",
+            .wCollectionNumber = 1,
+            .wUsagePage = HID_USAGE_PAGE_GENERIC,
+            .wUsage = HID_USAGE_GENERIC_Y,
+            .wReportId = 1,
+        },
+        {
+            .dwSize = sizeof(DIDEVICEOBJECTINSTANCEW),
+            .guidType = GUID_ZAxis,
+            .dwOfs = DIJOFS_Z,
+            .dwType = DIDFT_ABSAXIS|DIDFT_MAKEINSTANCE(2),
+            .dwFlags = DIDOI_ASPECTPOSITION,
+            .tszName = L"Wheel",
+            .wCollectionNumber = 1,
+            .wUsagePage = HID_USAGE_PAGE_GENERIC,
+            .wUsage = HID_USAGE_GENERIC_WHEEL,
+            .wReportId = 1,
+        },
+        {
+            .dwSize = sizeof(DIDEVICEOBJECTINSTANCEW),
+            .guidType = GUID_RzAxis,
+            .dwOfs = DIJOFS_RZ,
+            .dwType = DIDFT_ABSAXIS|DIDFT_MAKEINSTANCE(5),
+            .dwFlags = DIDOI_ASPECTPOSITION,
+            .tszName = L"Rudder",
+            .wCollectionNumber = 1,
+            .wUsagePage = HID_USAGE_PAGE_SIMULATION,
+            .wUsage = HID_USAGE_SIMULATION_RUDDER,
+            .wReportId = 1,
+        },
+        {
+            .dwSize = sizeof(DIDEVICEOBJECTINSTANCEW),
+            .guidType = GUID_POV,
+            .dwOfs = DIJOFS_POV(0),
+            .dwType = DIDFT_POV|DIDFT_MAKEINSTANCE(0),
+            .tszName = L"Hat Switch",
+            .wCollectionNumber = 1,
+            .wUsagePage = HID_USAGE_PAGE_GENERIC,
+            .wUsage = HID_USAGE_GENERIC_HATSWITCH,
+            .wReportId = 1,
+        },
+        {
+            .dwSize = sizeof(DIDEVICEOBJECTINSTANCEW),
+            .guidType = GUID_Button,
+            .dwOfs = DIJOFS_BUTTON(0),
+            .dwType = DIDFT_PSHBUTTON|DIDFT_MAKEINSTANCE(0),
+            .tszName = L"Button 0",
+            .wCollectionNumber = 1,
+            .wUsagePage = HID_USAGE_PAGE_BUTTON,
+            .wUsage = 0x1,
+            .wReportId = 1,
+        },
+        {
+            .dwSize = sizeof(DIDEVICEOBJECTINSTANCEW),
+            .guidType = GUID_Button,
+            .dwOfs = DIJOFS_BUTTON(1),
+            .dwType = DIDFT_PSHBUTTON|DIDFT_MAKEINSTANCE(1),
+            .tszName = L"Button 1",
+            .wCollectionNumber = 1,
+            .wUsagePage = HID_USAGE_PAGE_BUTTON,
+            .wUsage = 0x2,
+            .wReportId = 1,
+        },
+    };
+    struct check_objects_todos todo_objects_5[ARRAY_SIZE(expect_objects_5)] =
+    {
+        {.guid = TRUE, .type = TRUE, .flags = TRUE, .usage = TRUE, .usage_page = TRUE, .name = TRUE},
+        {.guid = TRUE, .type = TRUE, .flags = TRUE, .usage = TRUE, .usage_page = TRUE, .name = TRUE},
+        {.guid = TRUE, .type = TRUE, .usage = TRUE, .usage_page = TRUE, .name = TRUE},
+        {.guid = TRUE, .ofs = TRUE, .type = TRUE, .usage = TRUE, .usage_page = TRUE, .name = TRUE},
+        {.guid = TRUE, .ofs = TRUE, .type = TRUE, .flags = TRUE, .usage = TRUE, .name = TRUE},
+        {.guid = TRUE, .ofs = TRUE, .type = TRUE, .flags = TRUE, .usage = TRUE, .usage_page = TRUE, .name = TRUE},
+        {.guid = TRUE, .ofs = TRUE, .type = TRUE, .usage = TRUE, .usage_page = TRUE, .name = TRUE},
+    };
     struct check_objects_params check_objects_params =
     {
-        .version = DIRECTINPUT_VERSION,
-        .expect_count = ARRAY_SIZE(expect_objects),
-        .expect_objs = expect_objects,
+        .version = version,
+        .expect_count = version < 0x700 ? ARRAY_SIZE(expect_objects_5) : ARRAY_SIZE(expect_objects),
+        .expect_objs = version < 0x700 ? expect_objects_5 : expect_objects,
+        .todo_objs = version < 0x700 ? todo_objects_5 : NULL,
+        .todo_extra = version < 0x700 ? TRUE : FALSE,
     };
+
+    const DIEFFECTINFOW expect_effects[] = {};
     struct check_effects_params check_effects_params =
     {
         .expect_count = ARRAY_SIZE(expect_effects),
@@ -641,46 +744,57 @@ static void test_simple_joystick(void)
     WCHAR cwd[MAX_PATH], tempdir[MAX_PATH];
     DIDEVICEOBJECTDATA objdata[32] = {{0}};
     DIDEVICEOBJECTINSTANCEW objinst = {0};
+    DIDEVICEOBJECTINSTANCEW expect_obj;
     DIDEVICEINSTANCEW devinst = {0};
     DIEFFECTINFOW effectinfo = {0};
     DIDATAFORMAT dataformat = {0};
     IDirectInputDevice8W *device;
     IDirectInputEffect *effect;
     DIEFFESCAPE escape = {0};
+    ULONG i, size, res, ref;
     DIDEVCAPS caps = {0};
     HANDLE event, file;
     char buffer[1024];
     DIJOYSTATE2 state;
-    ULONG i, res, ref;
     HRESULT hr;
     WCHAR *tmp;
     GUID guid;
     HWND hwnd;
 
+    winetest_push_context( "%#x", version );
+
     GetCurrentDirectoryW( ARRAY_SIZE(cwd), cwd );
     GetTempPathW( ARRAY_SIZE(tempdir), tempdir );
     SetCurrentDirectoryW( tempdir );
 
     cleanup_registry_keys();
     if (!dinput_driver_start( report_desc, sizeof(report_desc), &hid_caps, NULL, 0 )) goto done;
-    if (FAILED(hr = dinput_test_create_device( DIRECTINPUT_VERSION, &devinst, &device ))) goto done;
+    if (FAILED(hr = dinput_test_create_device( version, &devinst, &device ))) goto done;
 
-    check_dinput_devices( DIRECTINPUT_VERSION, &devinst );
+    check_dinput_devices( version, &devinst );
 
-    hr = IDirectInputDevice8_Initialize( device, instance, 0x0700, &GUID_NULL );
-    todo_wine
-    ok( hr == DIERR_BETADIRECTINPUTVERSION, "Initialize returned %#x\n", hr );
-    hr = IDirectInputDevice8_Initialize( device, instance, DIRECTINPUT_VERSION, NULL );
+    hr = IDirectInputDevice8_Initialize( device, instance, 0x800 - (version - 0x700), &GUID_NULL );
+    if (version == 0x800)
+    {
+        todo_wine
+        ok( hr == DIERR_BETADIRECTINPUTVERSION, "Initialize returned %#x\n", hr );
+    }
+    else
+    {
+        todo_wine
+        ok( hr == DIERR_OLDDIRECTINPUTVERSION, "Initialize returned %#x\n", hr );
+    }
+    hr = IDirectInputDevice8_Initialize( device, instance, version, NULL );
     todo_wine
     ok( hr == E_POINTER, "Initialize returned %#x\n", hr );
-    hr = IDirectInputDevice8_Initialize( device, NULL, DIRECTINPUT_VERSION, &GUID_NULL );
+    hr = IDirectInputDevice8_Initialize( device, NULL, version, &GUID_NULL );
     todo_wine
     ok( hr == DIERR_INVALIDPARAM, "Initialize returned %#x\n", hr );
-    hr = IDirectInputDevice8_Initialize( device, instance, DIRECTINPUT_VERSION, &GUID_NULL );
+    hr = IDirectInputDevice8_Initialize( device, instance, version, &GUID_NULL );
     todo_wine
     ok( hr == REGDB_E_CLASSNOTREG, "Initialize returned %#x\n", hr );
 
-    hr = IDirectInputDevice8_Initialize( device, instance, DIRECTINPUT_VERSION, &devinst.guidInstance );
+    hr = IDirectInputDevice8_Initialize( device, instance, version, &devinst.guidInstance );
     ok( hr == DI_OK, "Initialize returned %#x\n", hr );
     guid = devinst.guidInstance;
     memset( &devinst, 0, sizeof(devinst) );
@@ -689,7 +803,7 @@ static void test_simple_joystick(void)
     ok( hr == DI_OK, "GetDeviceInfo returned %#x\n", hr );
     ok( IsEqualGUID( &guid, &devinst.guidInstance ), "got %s expected %s\n", debugstr_guid( &guid ),
         debugstr_guid( &devinst.guidInstance ) );
-    hr = IDirectInputDevice8_Initialize( device, instance, DIRECTINPUT_VERSION, &devinst.guidProduct );
+    hr = IDirectInputDevice8_Initialize( device, instance, version, &devinst.guidProduct );
     ok( hr == DI_OK, "Initialize returned %#x\n", hr );
 
     hr = IDirectInputDevice8_GetDeviceInfo( device, NULL );
@@ -704,6 +818,7 @@ static void test_simple_joystick(void)
     todo_wine
     check_member_guid( devinst, expect_devinst, guidInstance );
     check_member_guid( devinst, expect_devinst, guidProduct );
+    todo_wine_if( version < 0x0800 )
     check_member( devinst, expect_devinst, "%#x", dwDevType );
     todo_wine
     check_member_wstr( devinst, expect_devinst, tszInstanceName );
@@ -718,6 +833,7 @@ static void test_simple_joystick(void)
     todo_wine
     check_member_guid( devinst, expect_devinst, guidInstance );
     check_member_guid( devinst, expect_devinst, guidProduct );
+    todo_wine_if( version < 0x0800 )
     check_member( devinst, expect_devinst, "%#x", dwDevType );
     todo_wine
     check_member_wstr( devinst, expect_devinst, tszInstanceName );
@@ -736,6 +852,7 @@ static void test_simple_joystick(void)
     ok( hr == DI_OK, "GetCapabilities returned %#x\n", hr );
     check_member( caps, expect_caps, "%d", dwSize );
     check_member( caps, expect_caps, "%#x", dwFlags );
+    todo_wine_if( version < 0x0800 )
     check_member( caps, expect_caps, "%#x", dwDevType );
     check_member( caps, expect_caps, "%d", dwAxes );
     check_member( caps, expect_caps, "%d", dwButtons );
@@ -753,7 +870,9 @@ static void test_simple_joystick(void)
     hr = IDirectInputDevice8_GetProperty( device, DIPROP_VIDPID, NULL );
     ok( hr == DIERR_INVALIDPARAM, "GetProperty returned %#x\n", hr );
     hr = IDirectInputDevice8_GetProperty( device, DIPROP_VIDPID, &prop_string.diph );
-    ok( hr == DIERR_INVALIDPARAM, "GetProperty returned %#x\n", hr );
+    todo_wine_if( version < 0x0800 )
+    ok( hr == (version < 0x0800 ? DIERR_UNSUPPORTED : DIERR_INVALIDPARAM),
+        "GetProperty DIPROP_VIDPID returned %#x\n", hr );
     prop_dword.diph.dwHeaderSize = sizeof(DIPROPHEADER) - 1;
     hr = IDirectInputDevice8_GetProperty( device, DIPROP_VIDPID, &prop_dword.diph );
     ok( hr == DIERR_INVALIDPARAM, "GetProperty returned %#x\n", hr );
@@ -761,8 +880,14 @@ static void test_simple_joystick(void)
 
     prop_dword.dwData = 0xdeadbeef;
     hr = IDirectInputDevice8_GetProperty( device, DIPROP_VIDPID, &prop_dword.diph );
-    ok( hr == DI_OK, "GetProperty DIPROP_VIDPID returned %#x\n", hr );
-    ok( prop_dword.dwData == EXPECT_VIDPID, "got %#x expected %#x\n", prop_dword.dwData, EXPECT_VIDPID );
+    todo_wine_if( version < 0x0800 )
+    ok( hr == (version < 0x0800 ? DIERR_UNSUPPORTED : DI_OK),
+        "GetProperty DIPROP_VIDPID returned %#x\n", hr );
+    if (hr == DI_OK)
+    {
+        ok( prop_dword.dwData == EXPECT_VIDPID, "got %#x expected %#x\n",
+            prop_dword.dwData, EXPECT_VIDPID );
+    }
 
     hr = IDirectInputDevice8_GetProperty( device, DIPROP_GUIDANDPATH, &prop_guid_path.diph );
     ok( hr == DI_OK, "GetProperty DIPROP_GUIDANDPATH returned %#x\n", hr );
@@ -791,14 +916,23 @@ static void test_simple_joystick(void)
     ok( !wcscmp( prop_string.wsz, expect_devinst.tszProductName ), "got product %s\n",
         debugstr_w(prop_string.wsz) );
     hr = IDirectInputDevice8_GetProperty( device, DIPROP_TYPENAME, &prop_string.diph );
-    todo_wine
-    ok( hr == DI_OK, "GetProperty DIPROP_TYPENAME returned %#x\n", hr );
-    todo_wine
-    ok( !wcscmp( prop_string.wsz, expect_vidpid_str ), "got type %s\n", debugstr_w(prop_string.wsz) );
+    todo_wine_if( version >= 0x0800 )
+    ok( hr == (version < 0x0800 ? DIERR_UNSUPPORTED : DI_OK),
+        "GetProperty DIPROP_TYPENAME returned %#x\n", hr );
+    if (hr == DI_OK)
+    {
+        todo_wine
+        ok( !wcscmp( prop_string.wsz, expect_vidpid_str ), "got type %s\n", debugstr_w(prop_string.wsz) );
+    }
     hr = IDirectInputDevice8_GetProperty( device, DIPROP_USERNAME, &prop_string.diph );
-    ok( hr == S_FALSE, "GetProperty DIPROP_USERNAME returned %#x\n", hr );
-    todo_wine
-    ok( !wcscmp( prop_string.wsz, L"" ), "got user %s\n", debugstr_w(prop_string.wsz) );
+    todo_wine_if( version < 0x0800 )
+    ok( hr == (version < 0x0800 ? DIERR_UNSUPPORTED : DI_NOEFFECT),
+        "GetProperty DIPROP_USERNAME returned %#x\n", hr );
+    if (hr == DI_NOEFFECT)
+    {
+        todo_wine
+        ok( !wcscmp( prop_string.wsz, L"" ), "got user %s\n", debugstr_w(prop_string.wsz) );
+    }
 
     prop_dword.dwData = 0xdeadbeef;
     hr = IDirectInputDevice8_GetProperty( device, DIPROP_JOYSTICKID, &prop_dword.diph );
@@ -838,7 +972,9 @@ static void test_simple_joystick(void)
     hr = IDirectInputDevice8_GetProperty( device, DIPROP_RANGE, &prop_range.diph );
     ok( hr == DIERR_UNSUPPORTED, "GetProperty DIPROP_RANGE returned %#x\n", hr );
     hr = IDirectInputDevice8_GetProperty( device, DIPROP_KEYNAME, &prop_string.diph );
-    ok( hr == DIERR_INVALIDPARAM, "GetProperty DIPROP_KEYNAME returned %#x\n", hr );
+    todo_wine_if( version < 0x0800 )
+    ok( hr == (version < 0x0800 ? DIERR_UNSUPPORTED : DIERR_INVALIDPARAM),
+        "GetProperty DIPROP_KEYNAME returned %#x\n", hr );
     hr = IDirectInputDevice8_GetProperty( device, DIPROP_LOGICALRANGE, &prop_range.diph );
     ok( hr == DIERR_UNSUPPORTED, "GetProperty DIPROP_LOGICALRANGE returned %#x\n", hr );
     hr = IDirectInputDevice8_GetProperty( device, DIPROP_PHYSICALRANGE, &prop_range.diph );
@@ -867,9 +1003,14 @@ static void test_simple_joystick(void)
     prop_string.diph.dwHow = DIPH_BYUSAGE;
     prop_string.diph.dwObj = MAKELONG( HID_USAGE_GENERIC_X, HID_USAGE_PAGE_GENERIC );
     hr = IDirectInputDevice8_GetProperty( device, DIPROP_KEYNAME, &prop_string.diph );
-    ok( hr == DI_OK, "GetProperty DIPROP_KEYNAME returned %#x\n", hr );
-    ok( !wcscmp( prop_string.wsz, expect_objects[4].tszName ), "got DIPROP_KEYNAME %s\n",
-        debugstr_w(prop_string.wsz) );
+    todo_wine_if( version < 0x0800 )
+    ok( hr == (version < 0x0800 ? DIERR_UNSUPPORTED : DI_OK),
+        "GetProperty DIPROP_KEYNAME returned %#x\n", hr );
+    if (hr == DI_OK)
+    {
+        ok( !wcscmp( prop_string.wsz, expect_objects[4].tszName ), "got DIPROP_KEYNAME %s\n",
+            debugstr_w(prop_string.wsz) );
+    }
     prop_string.diph.dwObj = MAKELONG( 0x1, HID_USAGE_PAGE_BUTTON );
     hr = IDirectInputDevice8_GetProperty( device, DIPROP_KEYNAME, &prop_string.diph );
     todo_wine
@@ -884,7 +1025,9 @@ static void test_simple_joystick(void)
     prop_range.lMin = 0xdeadbeef;
     prop_range.lMax = 0xdeadbeef;
     hr = IDirectInputDevice8_GetProperty( device, DIPROP_RANGE, &prop_range.diph );
-    ok( hr == DIERR_NOTFOUND, "GetProperty DIPROP_RANGE returned %#x\n", hr );
+    todo_wine_if( version < 0x0800 )
+    ok( hr == (version < 0x0800 ? DI_OK : DIERR_NOTFOUND),
+        "GetProperty DIPROP_RANGE returned %#x\n", hr );
     prop_range.diph.dwObj = MAKELONG( 0, HID_USAGE_PAGE_GENERIC );
     hr = IDirectInputDevice8_GetProperty( device, DIPROP_RANGE, &prop_range.diph );
     ok( hr == DIERR_NOTFOUND, "GetProperty DIPROP_RANGE returned %#x\n", hr );
@@ -899,19 +1042,30 @@ static void test_simple_joystick(void)
     ok( prop_range.lMin == 0, "got %d expected %d\n", prop_range.lMin, 0 );
     ok( prop_range.lMax == 65535, "got %d expected %d\n", prop_range.lMax, 65535 );
     hr = IDirectInputDevice8_GetProperty( device, DIPROP_LOGICALRANGE, &prop_range.diph );
-    ok( hr == DI_OK, "GetProperty DIPROP_LOGICALRANGE returned %#x\n", hr );
-    ok( prop_range.lMin == -25, "got %d expected %d\n", prop_range.lMin, -25 );
-    ok( prop_range.lMax == 56, "got %d expected %d\n", prop_range.lMax, 56 );
+    todo_wine_if( version < 0x0800 )
+    ok( hr == (version < 0x0800 ? DIERR_UNSUPPORTED : DI_OK),
+        "GetProperty DIPROP_LOGICALRANGE returned %#x\n", hr );
+    if (hr == DI_OK)
+    {
+        ok( prop_range.lMin == -25, "got %d expected %d\n", prop_range.lMin, -25 );
+        ok( prop_range.lMax == 56, "got %d expected %d\n", prop_range.lMax, 56 );
+    }
     hr = IDirectInputDevice8_GetProperty( device, DIPROP_PHYSICALRANGE, &prop_range.diph );
-    ok( hr == DI_OK, "GetProperty DIPROP_PHYSICALRANGE returned %#x\n", hr );
-    ok( prop_range.lMin == -25, "got %d expected %d\n", prop_range.lMin, -25 );
-    ok( prop_range.lMax == 56, "got %d expected %d\n", prop_range.lMax, 56 );
+    todo_wine_if( version < 0x0800 )
+    ok( hr == (version < 0x0800 ? DIERR_UNSUPPORTED : DI_OK),
+        "GetProperty DIPROP_PHYSICALRANGE returned %#x\n", hr );
+    if (hr == DI_OK)
+    {
+        ok( prop_range.lMin == -25, "got %d expected %d\n", prop_range.lMin, -25 );
+        ok( prop_range.lMax == 56, "got %d expected %d\n", prop_range.lMax, 56 );
+    }
 
     prop_pointer.diph.dwHow = DIPH_BYUSAGE;
     prop_pointer.diph.dwObj = MAKELONG( HID_USAGE_GENERIC_X, HID_USAGE_PAGE_GENERIC );
     hr = IDirectInputDevice8_GetProperty( device, DIPROP_APPDATA, &prop_pointer.diph );
-    todo_wine
-    ok( hr == DIERR_NOTINITIALIZED, "GetProperty DIPROP_APPDATA returned %#x\n", hr );
+    todo_wine_if( version >= 0x0800 )
+    ok( hr == (version < 0x0800 ? DIERR_UNSUPPORTED : DIERR_NOTINITIALIZED),
+        "GetProperty DIPROP_APPDATA returned %#x\n", hr );
 
     hr = IDirectInputDevice8_EnumObjects( device, NULL, NULL, DIDFT_ALL );
     ok( hr == DIERR_INVALIDPARAM, "EnumObjects returned %#x\n", hr );
@@ -920,7 +1074,8 @@ static void test_simple_joystick(void)
     res = 0;
     hr = IDirectInputDevice8_EnumObjects( device, check_object_count, &res, DIDFT_AXIS | DIDFT_PSHBUTTON );
     ok( hr == DI_OK, "EnumObjects returned %#x\n", hr );
-    ok( res == 8, "got %u expected %u\n", res, 8 );
+    todo_wine_if( version < 0x0700 )
+    ok( res == (version < 0x0700 ? 6 : 8), "got %u objects\n", res );
     hr = IDirectInputDevice8_EnumObjects( device, check_objects, &check_objects_params, DIDFT_ALL );
     ok( hr == DI_OK, "EnumObjects returned %#x\n", hr );
     ok( check_objects_params.index >= check_objects_params.expect_count, "missing %u objects\n",
@@ -936,26 +1091,30 @@ static void test_simple_joystick(void)
 
     res = MAKELONG( HID_USAGE_GENERIC_Z, HID_USAGE_PAGE_GENERIC );
     hr = IDirectInputDevice8_GetObjectInfo( device, &objinst, res, DIPH_BYUSAGE );
-    ok( hr == DIERR_NOTFOUND, "GetObjectInfo returned: %#x\n", hr );
+    todo_wine_if( version < 0x0800 )
+    ok( hr == (version < 0x0800 ? DI_OK : DIERR_NOTFOUND), "GetObjectInfo returned: %#x\n", hr );
     res = MAKELONG( HID_USAGE_GENERIC_X, HID_USAGE_PAGE_GENERIC );
     hr = IDirectInputDevice8_GetObjectInfo( device, &objinst, res, DIPH_BYUSAGE );
     ok( hr == DI_OK, "GetObjectInfo returned: %#x\n", hr );
 
-    check_member( objinst, expect_objects[4], "%u", dwSize );
-    check_member_guid( objinst, expect_objects[4], guidType );
-    check_member( objinst, expect_objects[4], "%#x", dwOfs );
-    check_member( objinst, expect_objects[4], "%#x", dwType );
-    check_member( objinst, expect_objects[4], "%#x", dwFlags );
-    if (!localized) check_member_wstr( objinst, expect_objects[4], tszName );
-    check_member( objinst, expect_objects[4], "%u", dwFFMaxForce );
-    check_member( objinst, expect_objects[4], "%u", dwFFForceResolution );
-    check_member( objinst, expect_objects[4], "%u", wCollectionNumber );
-    check_member( objinst, expect_objects[4], "%u", wDesignatorIndex );
-    check_member( objinst, expect_objects[4], "%#04x", wUsagePage );
-    check_member( objinst, expect_objects[4], "%#04x", wUsage );
-    check_member( objinst, expect_objects[4], "%#04x", dwDimension );
-    check_member( objinst, expect_objects[4], "%#04x", wExponent );
-    check_member( objinst, expect_objects[4], "%u", wReportId );
+    if (version < 0x0700) expect_obj = expect_objects_5[0];
+    else expect_obj = expect_objects[4];
+    check_member( objinst, expect_obj, "%u", dwSize );
+    check_member_guid( objinst, expect_obj, guidType );
+    todo_wine_if( version < 0x0700 )
+    check_member( objinst, expect_obj, "%#x", dwOfs );
+    check_member( objinst, expect_obj, "%#x", dwType );
+    check_member( objinst, expect_obj, "%#x", dwFlags );
+    if (!localized) check_member_wstr( objinst, expect_obj, tszName );
+    check_member( objinst, expect_obj, "%u", dwFFMaxForce );
+    check_member( objinst, expect_obj, "%u", dwFFForceResolution );
+    check_member( objinst, expect_obj, "%u", wCollectionNumber );
+    check_member( objinst, expect_obj, "%u", wDesignatorIndex );
+    check_member( objinst, expect_obj, "%#04x", wUsagePage );
+    check_member( objinst, expect_obj, "%#04x", wUsage );
+    check_member( objinst, expect_obj, "%#04x", dwDimension );
+    check_member( objinst, expect_obj, "%#04x", wExponent );
+    check_member( objinst, expect_obj, "%u", wReportId );
 
     hr = IDirectInputDevice8_GetObjectInfo( device, &objinst, 0x14, DIPH_BYOFFSET );
     ok( hr == DIERR_NOTFOUND, "GetObjectInfo returned: %#x\n", hr );
@@ -968,21 +1127,24 @@ static void test_simple_joystick(void)
     hr = IDirectInputDevice8_GetObjectInfo( device, &objinst, res, DIPH_BYID );
     ok( hr == DI_OK, "GetObjectInfo returned: %#x\n", hr );
 
-    check_member( objinst, expect_objects[8], "%u", dwSize );
-    check_member_guid( objinst, expect_objects[8], guidType );
-    check_member( objinst, expect_objects[8], "%#x", dwOfs );
-    check_member( objinst, expect_objects[8], "%#x", dwType );
-    check_member( objinst, expect_objects[8], "%#x", dwFlags );
-    if (!localized) check_member_wstr( objinst, expect_objects[8], tszName );
-    check_member( objinst, expect_objects[8], "%u", dwFFMaxForce );
-    check_member( objinst, expect_objects[8], "%u", dwFFForceResolution );
-    check_member( objinst, expect_objects[8], "%u", wCollectionNumber );
-    check_member( objinst, expect_objects[8], "%u", wDesignatorIndex );
-    check_member( objinst, expect_objects[8], "%#04x", wUsagePage );
-    check_member( objinst, expect_objects[8], "%#04x", wUsage );
-    check_member( objinst, expect_objects[8], "%#04x", dwDimension );
-    check_member( objinst, expect_objects[8], "%#04x", wExponent );
-    check_member( objinst, expect_objects[8], "%u", wReportId );
+    if (version < 0x0700) expect_obj = expect_objects_5[6];
+    else expect_obj = expect_objects[8];
+    check_member( objinst, expect_obj, "%u", dwSize );
+    check_member_guid( objinst, expect_obj, guidType );
+    todo_wine_if( version < 0x0700 )
+    check_member( objinst, expect_obj, "%#x", dwOfs );
+    check_member( objinst, expect_obj, "%#x", dwType );
+    check_member( objinst, expect_obj, "%#x", dwFlags );
+    if (!localized) check_member_wstr( objinst, expect_obj, tszName );
+    check_member( objinst, expect_obj, "%u", dwFFMaxForce );
+    check_member( objinst, expect_obj, "%u", dwFFForceResolution );
+    check_member( objinst, expect_obj, "%u", wCollectionNumber );
+    check_member( objinst, expect_obj, "%u", wDesignatorIndex );
+    check_member( objinst, expect_obj, "%#04x", wUsagePage );
+    check_member( objinst, expect_obj, "%#04x", wUsage );
+    check_member( objinst, expect_obj, "%#04x", dwDimension );
+    check_member( objinst, expect_obj, "%#04x", wExponent );
+    check_member( objinst, expect_obj, "%u", wReportId );
 
     hr = IDirectInputDevice8_EnumEffects( device, NULL, NULL, DIEFT_ALL );
     ok( hr == DIERR_INVALIDPARAM, "EnumEffects returned %#x\n", hr );
@@ -1026,21 +1188,25 @@ static void test_simple_joystick(void)
     hr = IDirectInputDevice8_GetObjectInfo( device, &objinst, DIJOFS_Y, DIPH_BYOFFSET );
     ok( hr == DI_OK, "GetObjectInfo returned: %#x\n", hr );
 
-    check_member( objinst, expect_objects[3], "%u", dwSize );
-    check_member_guid( objinst, expect_objects[3], guidType );
-    check_member( objinst, expect_objects[3], "%#x", dwOfs );
-    check_member( objinst, expect_objects[3], "%#x", dwType );
-    check_member( objinst, expect_objects[3], "%#x", dwFlags );
-    if (!localized) check_member_wstr( objinst, expect_objects[3], tszName );
-    check_member( objinst, expect_objects[3], "%u", dwFFMaxForce );
-    check_member( objinst, expect_objects[3], "%u", dwFFForceResolution );
-    check_member( objinst, expect_objects[3], "%u", wCollectionNumber );
-    check_member( objinst, expect_objects[3], "%u", wDesignatorIndex );
-    check_member( objinst, expect_objects[3], "%#04x", wUsagePage );
-    check_member( objinst, expect_objects[3], "%#04x", wUsage );
-    check_member( objinst, expect_objects[3], "%#04x", dwDimension );
-    check_member( objinst, expect_objects[3], "%#04x", wExponent );
-    check_member( objinst, expect_objects[3], "%u", wReportId );
+    if (version < 0x0700) expect_obj = expect_objects_5[1];
+    else expect_obj = expect_objects[3];
+    if (version < 0x0800) expect_obj.dwOfs = DIJOFS_Y;
+    check_member( objinst, expect_obj, "%u", dwSize );
+    check_member_guid( objinst, expect_obj, guidType );
+    todo_wine_if( version < 0x0800 )
+    check_member( objinst, expect_obj, "%#x", dwOfs );
+    check_member( objinst, expect_obj, "%#x", dwType );
+    check_member( objinst, expect_obj, "%#x", dwFlags );
+    if (!localized) check_member_wstr( objinst, expect_obj, tszName );
+    check_member( objinst, expect_obj, "%u", dwFFMaxForce );
+    check_member( objinst, expect_obj, "%u", dwFFForceResolution );
+    check_member( objinst, expect_obj, "%u", wCollectionNumber );
+    check_member( objinst, expect_obj, "%u", wDesignatorIndex );
+    check_member( objinst, expect_obj, "%#04x", wUsagePage );
+    check_member( objinst, expect_obj, "%#04x", wUsage );
+    check_member( objinst, expect_obj, "%#04x", dwDimension );
+    check_member( objinst, expect_obj, "%#04x", wExponent );
+    check_member( objinst, expect_obj, "%u", wReportId );
 
     hr = IDirectInputDevice8_SetEventNotification( device, (HANDLE)0xdeadbeef );
     todo_wine
@@ -1101,7 +1267,8 @@ static void test_simple_joystick(void)
     ok( hr == DI_OK, "Acquire returned: %#x\n", hr );
 
     hr = IDirectInputDevice8_Poll( device );
-    ok( hr == DI_NOEFFECT, "Poll returned: %#x\n", hr );
+    todo_wine_if( version < 0x0700 )
+    ok( hr == (version < 0x0700 ? DI_OK : DI_NOEFFECT), "Poll returned: %#x\n", hr );
 
     hr = IDirectInputDevice8_GetDeviceState( device, sizeof(DIJOYSTATE2) + 1, &state );
     ok( hr == DIERR_INVALIDPARAM, "GetDeviceState returned: %#x\n", hr );
@@ -1145,11 +1312,12 @@ static void test_simple_joystick(void)
     winetest_pop_context();
 
     res = 1;
-    hr = IDirectInputDevice8_GetDeviceData( device, sizeof(DIDEVICEOBJECTDATA) - 1, objdata, &res, DIGDD_PEEK );
-    todo_wine
-    ok( hr == DIERR_INVALIDPARAM, "GetDeviceData returned %#x\n", hr );
+    size = version < 0x0800 ? sizeof(DIDEVICEOBJECTDATA_DX3) : sizeof(DIDEVICEOBJECTDATA);
+    hr = IDirectInputDevice8_GetDeviceData( device, size - 1, objdata, &res, DIGDD_PEEK );
+    todo_wine_if( version >= 0x0800 )
+    ok( hr == (version < 0x0800 ? DI_OK : DIERR_INVALIDPARAM), "GetDeviceData returned %#x\n", hr );
     res = 1;
-    hr = IDirectInputDevice8_GetDeviceData( device, sizeof(DIDEVICEOBJECTDATA), objdata, &res, DIGDD_PEEK );
+    hr = IDirectInputDevice8_GetDeviceData( device, size, objdata, &res, DIGDD_PEEK );
     ok( hr == DIERR_NOTBUFFERED, "GetDeviceData returned %#x\n", hr );
 
     hr = IDirectInputDevice8_Unacquire( device );
@@ -1167,7 +1335,7 @@ static void test_simple_joystick(void)
     ok( hr == DI_OK, "Unacquire returned: %#x\n", hr );
 
     res = 1;
-    hr = IDirectInputDevice8_GetDeviceData( device, sizeof(DIDEVICEOBJECTDATA), objdata, &res, DIGDD_PEEK );
+    hr = IDirectInputDevice8_GetDeviceData( device, size, objdata, &res, DIGDD_PEEK );
     ok( hr == DI_OK, "GetDeviceData returned %#x\n", hr );
     ok( res == 0, "got %u expected %u\n", res, 0 );
 
@@ -1177,12 +1345,13 @@ static void test_simple_joystick(void)
     ResetEvent( event );
 
     res = 1;
-    hr = IDirectInputDevice8_GetDeviceData( device, sizeof(DIDEVICEOBJECTDATA), objdata, &res, DIGDD_PEEK );
+    hr = IDirectInputDevice8_GetDeviceData( device, size, objdata, &res, DIGDD_PEEK );
+    todo_wine_if( version < 0x0800 )
     ok( hr == DI_BUFFEROVERFLOW, "GetDeviceData returned %#x\n", hr );
     ok( res == 0, "got %u expected %u\n", res, 0 );
     res = 1;
-    hr = IDirectInputDevice8_GetDeviceData( device, sizeof(DIDEVICEOBJECTDATA), objdata, &res, 0 );
-    todo_wine
+    hr = IDirectInputDevice8_GetDeviceData( device, size, objdata, &res, 0 );
+    todo_wine_if( version >= 0x0800 )
     ok( hr == DI_OK, "GetDeviceData returned %#x\n", hr );
     ok( res == 0, "got %u expected %u\n", res, 0 );
 
@@ -1202,22 +1371,23 @@ static void test_simple_joystick(void)
     ResetEvent( event );
 
     res = 1;
-    hr = IDirectInputDevice8_GetDeviceData( device, sizeof(DIDEVICEOBJECTDATA), objdata, &res, DIGDD_PEEK );
+    hr = IDirectInputDevice8_GetDeviceData( device, size, objdata, &res, DIGDD_PEEK );
     ok( hr == DI_OK, "GetDeviceData returned %#x\n", hr );
     ok( res == 1, "got %u expected %u\n", res, 1 );
     check_member( objdata[0], expect_objdata[0], "%#x", dwOfs );
     check_member( objdata[0], expect_objdata[0], "%#x", dwData );
-    ok( objdata[0].uAppData == -1, "got %p, expected %p\n", (void *)objdata[0].uAppData, (void *)-1 );
+    if (version >= 0x0800) ok( objdata[0].uAppData == -1, "got %p\n", (void *)objdata[0].uAppData );
     res = 4;
-    hr = IDirectInputDevice8_GetDeviceData( device, sizeof(DIDEVICEOBJECTDATA), objdata, &res, 0 );
+    hr = IDirectInputDevice8_GetDeviceData( device, size, objdata, &res, 0 );
     ok( hr == DI_OK, "GetDeviceData returned %#x\n", hr );
     ok( res == 4, "got %u expected %u\n", res, 4 );
     for (i = 0; i < 4; ++i)
     {
+        DIDEVICEOBJECTDATA *ptr = (DIDEVICEOBJECTDATA *)((char *)objdata + size * i);
         winetest_push_context( "objdata[%d]", i );
-        check_member( objdata[i], expect_objdata[1 + i], "%#x", dwOfs );
-        check_member( objdata[i], expect_objdata[1 + i], "%#x", dwData );
-        ok( objdata[i].uAppData == -1, "got %p, expected %p\n", (void *)objdata[i].uAppData, (void *)-1 );
+        check_member( *ptr, expect_objdata[1 + i], "%#x", dwOfs );
+        check_member( *ptr, expect_objdata[1 + i], "%#x", dwData );
+        if (version >= 0x0800) ok( ptr->uAppData == -1, "got %p\n", (void *)ptr->uAppData );
         winetest_pop_context();
     }
 
@@ -1231,26 +1401,28 @@ static void test_simple_joystick(void)
     ResetEvent( event );
 
     res = 1;
-    hr = IDirectInputDevice8_GetDeviceData( device, sizeof(DIDEVICEOBJECTDATA), objdata, &res, 0 );
+    hr = IDirectInputDevice8_GetDeviceData( device, size, objdata, &res, 0 );
+    todo_wine_if( version < 0x0800 )
     ok( hr == DI_BUFFEROVERFLOW, "GetDeviceData returned %#x\n", hr );
     ok( res == 1, "got %u expected %u\n", res, 1 );
     todo_wine
     check_member( objdata[0], expect_objdata[5], "%#x", dwOfs );
     todo_wine
     check_member( objdata[0], expect_objdata[5], "%#x", dwData );
-    ok( objdata[0].uAppData == -1, "got %p, expected %p\n", (void *)objdata[0].uAppData, (void *)-1 );
+    if (version >= 0x0800) ok( objdata[0].uAppData == -1, "got %p\n", (void *)objdata[0].uAppData );
     res = ARRAY_SIZE(objdata);
-    hr = IDirectInputDevice8_GetDeviceData( device, sizeof(DIDEVICEOBJECTDATA), objdata, &res, 0 );
+    hr = IDirectInputDevice8_GetDeviceData( device, size, objdata, &res, 0 );
     ok( hr == DI_OK, "GetDeviceData returned %#x\n", hr );
     ok( res == 8, "got %u expected %u\n", res, 8 );
     for (i = 0; i < 8; ++i)
     {
+        DIDEVICEOBJECTDATA *ptr = (DIDEVICEOBJECTDATA *)((char *)objdata + size * i);
         winetest_push_context( "objdata[%d]", i );
         todo_wine
-        check_member( objdata[i], expect_objdata[6 + i], "%#x", dwOfs );
+        check_member( *ptr, expect_objdata[6 + i], "%#x", dwOfs );
         todo_wine_if( i == 1 || i == 2 || i == 6 )
-        check_member( objdata[i], expect_objdata[6 + i], "%#x", dwData );
-        ok( objdata[i].uAppData == -1, "got %p, expected %p\n", (void *)objdata[i].uAppData, (void *)-1 );
+        check_member( *ptr, expect_objdata[6 + i], "%#x", dwData );
+        if (version >= 0x0800) ok( ptr->uAppData == -1, "got %p\n", (void *)ptr->uAppData );
         winetest_pop_context();
     }
 
@@ -1348,7 +1520,9 @@ static void test_simple_joystick(void)
     ok( hr == DIERR_INVALIDPARAM, "SetDataFormat returned: %#x\n", hr );
     objdataformat[1].dwType = DIDFT_AXIS | DIDFT_MAKEINSTANCE( 0xff );
     hr = IDirectInputDevice8_SetDataFormat( device, &dataformat );
-    ok( hr == DIERR_INVALIDPARAM, "SetDataFormat returned: %#x\n", hr );
+    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 );
     hr = IDirectInputDevice8_SetDataFormat( device, &dataformat );
     ok( hr == DI_OK, "SetDataFormat returned: %#x\n", hr );
@@ -1450,9 +1624,13 @@ static void test_simple_joystick(void)
     hr = IDirectInputDevice8_SetProperty( device, DIPROP_RANGE, &prop_range.diph );
     ok( hr == DI_OK, "SetProperty DIPROP_RANGE returned %#x\n", hr );
     hr = IDirectInputDevice8_SetProperty( device, DIPROP_LOGICALRANGE, &prop_range.diph );
-    ok( hr == DIERR_ACQUIRED, "SetProperty DIPROP_LOGICALRANGE returned %#x\n", hr );
+    todo_wine_if( version < 0x0800 )
+    ok( hr == (version < 0x0800 ? DIERR_UNSUPPORTED : DIERR_ACQUIRED),
+        "SetProperty DIPROP_LOGICALRANGE returned %#x\n", hr );
     hr = IDirectInputDevice8_SetProperty( device, DIPROP_PHYSICALRANGE, &prop_range.diph );
-    ok( hr == DIERR_ACQUIRED, "SetProperty DIPROP_PHYSICALRANGE returned %#x\n", hr );
+    todo_wine_if( version < 0x0800 )
+    ok( hr == (version < 0x0800 ? DIERR_UNSUPPORTED : DIERR_ACQUIRED),
+        "SetProperty DIPROP_PHYSICALRANGE returned %#x\n", hr );
 
     hr = IDirectInputDevice8_Unacquire( device );
     ok( hr == DI_OK, "Unacquire returned: %#x\n", hr );
@@ -1505,13 +1683,17 @@ static void test_simple_joystick(void)
     hr = IDirectInputDevice8_SetProperty( device, DIPROP_VIDPID, NULL );
     ok( hr == DIERR_INVALIDPARAM, "SetProperty returned %#x\n", hr );
     hr = IDirectInputDevice8_SetProperty( device, DIPROP_VIDPID, &prop_string.diph );
-    ok( hr == DIERR_INVALIDPARAM, "SetProperty returned %#x\n", hr );
+    todo_wine_if( version < 0x0800 )
+    ok( hr == (version < 0x0800 ? DIERR_UNSUPPORTED : DIERR_INVALIDPARAM),
+        "SetProperty DIPROP_VIDPID returned %#x\n", hr );
 
     prop_dword.diph.dwHow = DIPH_DEVICE;
     prop_dword.diph.dwObj = 0;
     prop_dword.dwData = 0xdeadbeef;
     hr = IDirectInputDevice8_SetProperty( device, DIPROP_VIDPID, &prop_dword.diph );
-    ok( hr == DIERR_READONLY, "SetProperty DIPROP_VIDPID returned %#x\n", hr );
+    todo_wine_if( version < 0x0800 )
+    ok( hr == (version < 0x0800 ? DIERR_UNSUPPORTED : DIERR_READONLY),
+        "SetProperty DIPROP_VIDPID returned %#x\n", hr );
     hr = IDirectInputDevice8_SetProperty( device, DIPROP_GUIDANDPATH, &prop_guid_path.diph );
     ok( hr == DIERR_READONLY, "SetProperty DIPROP_GUIDANDPATH returned %#x\n", hr );
 
@@ -1532,9 +1714,13 @@ static void test_simple_joystick(void)
         debugstr_w(prop_string.wsz) );
 
     hr = IDirectInputDevice8_SetProperty( device, DIPROP_TYPENAME, &prop_string.diph );
-    ok( hr == DIERR_READONLY, "SetProperty DIPROP_TYPENAME returned %#x\n", hr );
+    todo_wine_if( version < 0x0800 )
+    ok( hr == (version < 0x0800 ? DIERR_UNSUPPORTED : DIERR_READONLY),
+        "SetProperty DIPROP_TYPENAME returned %#x\n", hr );
     hr = IDirectInputDevice8_SetProperty( device, DIPROP_USERNAME, &prop_string.diph );
-    ok( hr == DIERR_READONLY, "SetProperty DIPROP_USERNAME returned %#x\n", hr );
+    todo_wine_if( version < 0x0800 )
+    ok( hr == (version < 0x0800 ? DIERR_UNSUPPORTED : DIERR_READONLY),
+        "SetProperty DIPROP_USERNAME returned %#x\n", hr );
     hr = IDirectInputDevice8_SetProperty( device, DIPROP_FFLOAD, &prop_dword.diph );
     ok( hr == DIERR_READONLY, "SetProperty DIPROP_FFLOAD returned %#x\n", hr );
     hr = IDirectInputDevice8_SetProperty( device, DIPROP_GRANULARITY, &prop_dword.diph );
@@ -1553,7 +1739,8 @@ static void test_simple_joystick(void)
     prop_pointer.diph.dwObj = MAKELONG( HID_USAGE_GENERIC_X, HID_USAGE_PAGE_GENERIC );
     hr = IDirectInputDevice8_SetProperty( device, DIPROP_APPDATA, &prop_pointer.diph );
     todo_wine
-    ok( hr == DIERR_ACQUIRED, "SetProperty DIPROP_APPDATA returned %#x\n", hr );
+    ok( hr == (version < 0x0800 ? DIERR_UNSUPPORTED : DIERR_ACQUIRED),
+        "SetProperty DIPROP_APPDATA returned %#x\n", hr );
 
     prop_dword.diph.dwHow = DIPH_DEVICE;
     prop_dword.diph.dwObj = 0;
@@ -1669,8 +1856,8 @@ static void test_simple_joystick(void)
     hr = IDirectInputDevice8_GetDeviceState( device, sizeof(DIJOYSTATE2), &state );
     ok( hr == DI_OK, "GetDeviceState returned: %#x\n", hr );
     winetest_push_context( "state[%d]", i );
-    todo_wine
-    ok( state.lX == 15, "got lX %d, expected %d\n", state.lX, 15 );
+    todo_wine_if( version >= 0x0700 )
+    ok( state.lX == (version < 0x0700 ? -9000 : 15), "got lX %d\n", state.lX );
     check_member( state, expect_state_abs[0], "%d", lY );
     check_member( state, expect_state_abs[0], "%d", lZ );
     check_member( state, expect_state_abs[0], "%d", lRx );
@@ -1706,7 +1893,9 @@ static void test_simple_joystick(void)
     prop_pointer.diph.dwObj = MAKELONG( HID_USAGE_GENERIC_X, HID_USAGE_PAGE_GENERIC );
     prop_pointer.uData = 0xfeedcafe;
     hr = IDirectInputDevice8_SetProperty( device, DIPROP_APPDATA, &prop_pointer.diph );
-    ok( hr == DI_OK, "SetProperty DIPROP_APPDATA returned %#x\n", hr );
+    todo_wine_if( version < 0x0800 )
+    ok( hr == (version < 0x0800 ? DIERR_UNSUPPORTED : DI_OK),
+        "SetProperty DIPROP_APPDATA returned %#x\n", hr );
 
     prop_dword.dwData = 0xdeadbeef;
     hr = IDirectInputDevice8_SetProperty( device, DIPROP_AXISMODE, &prop_dword.diph );
@@ -1733,9 +1922,10 @@ static void test_simple_joystick(void)
     prop_pointer.diph.dwHow = DIPH_BYUSAGE;
     prop_pointer.diph.dwObj = MAKELONG( HID_USAGE_GENERIC_X, HID_USAGE_PAGE_GENERIC );
     hr = IDirectInputDevice8_GetProperty( device, DIPROP_APPDATA, &prop_pointer.diph );
-    todo_wine
-    ok( hr == DI_OK, "GetProperty DIPROP_APPDATA returned %#x\n", hr );
-    ok( prop_pointer.uData == 0xfeedcafe, "got %p expected %p\n", (void *)prop_pointer.uData, (void *)0xfeedcafe );
+    todo_wine_if( version >= 0x0800 )
+    ok( hr == (version < 0x0800 ? DIERR_UNSUPPORTED : DI_OK),
+        "GetProperty DIPROP_APPDATA returned %#x\n", hr );
+    if (hr == DI_OK) ok( prop_pointer.uData == 0xfeedcafe, "got %p\n", (void *)prop_pointer.uData );
 
     prop_dword.diph.dwHow = DIPH_DEVICE;
     prop_dword.diph.dwObj = 0;
@@ -1815,15 +2005,15 @@ static void test_simple_joystick(void)
     objdata[0].dwOfs = 0xd;
     objdata[0].dwData = 0x80;
     res = 1;
-    hr = IDirectInputDevice8_SendDeviceData( device, sizeof(DIDEVICEOBJECTDATA), objdata, &res, 0xdeadbeef );
+    hr = IDirectInputDevice8_SendDeviceData( device, size, objdata, &res, 0xdeadbeef );
     todo_wine
     ok( hr == DIERR_INVALIDPARAM, "SendDeviceData returned %#x\n", hr );
     res = 1;
-    hr = IDirectInputDevice8_SendDeviceData( device, sizeof(DIDEVICEOBJECTDATA), objdata, &res, 1 /*DISDD_CONTINUE*/ );
+    hr = IDirectInputDevice8_SendDeviceData( device, size, objdata, &res, 1 /*DISDD_CONTINUE*/ );
     todo_wine
     ok( hr == DIERR_INVALIDPARAM, "SendDeviceData returned %#x\n", hr );
     res = 1;
-    hr = IDirectInputDevice8_SendDeviceData( device, sizeof(DIDEVICEOBJECTDATA), objdata, &res, 0 );
+    hr = IDirectInputDevice8_SendDeviceData( device, size, objdata, &res, 0 );
     todo_wine
     ok( hr == DIERR_INVALIDPARAM, "SendDeviceData returned %#x\n", hr );
 
@@ -1879,6 +2069,7 @@ done:
     pnp_driver_stop();
     cleanup_registry_keys();
     SetCurrentDirectoryW( cwd );
+    winetest_pop_context();
 }
 
 struct device_desc
@@ -2580,7 +2771,9 @@ START_TEST( joystick8 )
         test_device_types( 0x500 );
         test_device_types( 0x700 );
 
-        test_simple_joystick();
+        test_simple_joystick( 0x500 );
+        test_simple_joystick( 0x700 );
+        test_simple_joystick( 0x800 );
     }
     CoUninitialize();
 
-- 
2.34.1




More information about the wine-devel mailing list