Wine-Devel
Threads by month
- ----- 2026 -----
- April
- March
- February
- January
- ----- 2025 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2010 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2009 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2008 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2007 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2006 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2005 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2004 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2003 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2002 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2001 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- 17 participants
- 84524 discussions
[PATCH 1/9] d3d10/effect: Add missing return when effect creation failed.
by Nikolay Sivov Oct. 18, 2021
by Nikolay Sivov Oct. 18, 2021
Oct. 18, 2021
Signed-off-by: Nikolay Sivov <nsivov(a)codeweavers.com>
---
dlls/d3d10/effect.c | 1 +
1 file changed, 1 insertion(+)
diff --git a/dlls/d3d10/effect.c b/dlls/d3d10/effect.c
index 3b4050460a0..7590bba6317 100644
--- a/dlls/d3d10/effect.c
+++ b/dlls/d3d10/effect.c
@@ -8551,6 +8551,7 @@ HRESULT WINAPI D3D10CreateEffectFromMemory(void *data, SIZE_T data_size, UINT fl
if (FAILED(hr = d3d10_create_effect(data, data_size, device, pool, 0, &object)))
{
WARN("Failed to create an effect, hr %#x.\n", hr);
+ return hr;
}
*effect = &object->ID3D10Effect_iface;
--
2.33.0
1
8
Hello,
I am trying to run the wine tests with `make test` but a lot of tests seem
to fail which is getting in my way of testing some failed tests are
reported by 'testbot'. For instance, currently, running `make test` fails
with:
security.c:4736: Tests skipped: Couldn't create an object for
GetSecurityInfo test
0024:fixme:advapi:SetEntriesInAclW unhandled access mode 4
0024:fixme:advapi:SetEntriesInAclW unhandled access mode 4
security.c:7735: Test failed: got error 2
security.c:7738: Test failed: got error 6
security.c:7743: Test failed: got error 6
security.c:7746: Test failed: wait failed
security.c:7843: Test failed: got error 2
security.c:7844: Test failed: wait failed
security.c:7847: Test succeeded inside todo block: expected failure
security.c:7854: Test failed: got error 2
security.c:7862: Test failed: got error 2
security.c:7869: Test failed: got error 2
security.c:7879: Test failed: got error 2
security.c:7889: Test failed: got error 2
security.c:7890: Test failed: wait failed
0024:fixme:ntdll:NtSetInformationToken unimplemented class 18
0024:fixme:ntdll:NtSetInformationToken unimplemented class 20
security.c:7248: Test failed: CreateProcess failed with error 2
security.c:7249: Test failed: Could not wait for the child process: -1 le=6
make: *** [Makefile:3396: dlls/advapi32/tests/security.ok] Error 21
Disabling this test in the Makefile leads to more errors in the tests. Is
this normal? I am pretty new to Wine and could be missing something.
What could I be missing?
Regards,
David
3
4
v2:
Add test.
Signed-off-by: Alistair Leslie-Hughes <leslie_alistair(a)hotmail.com>
---
dlls/wbemprox/builtin.c | 1 +
dlls/wbemprox/tests/services.c | 1 +
dlls/wbemprox/wbemprox_private.h | 1 +
3 files changed, 3 insertions(+)
diff --git a/dlls/wbemprox/builtin.c b/dlls/wbemprox/builtin.c
index d76602f4930..90bc5ae644f 100644
--- a/dlls/wbemprox/builtin.c
+++ b/dlls/wbemprox/builtin.c
@@ -4135,6 +4135,7 @@ builtin_namespaces[WBEMPROX_NAMESPACE_LAST] =
{
{L"cimv2", cimv2_builtin_classes, ARRAY_SIZE(cimv2_builtin_classes)},
{L"Microsoft\\Windows\\Storage", NULL, 0},
+ {L"wmi", NULL, 0},
};
void init_table_list( void )
diff --git a/dlls/wbemprox/tests/services.c b/dlls/wbemprox/tests/services.c
index 86ee99c335c..f72d43c0b0b 100644
--- a/dlls/wbemprox/tests/services.c
+++ b/dlls/wbemprox/tests/services.c
@@ -258,6 +258,7 @@ static void test_namespaces(void)
{
{L"ROOT\\CIMV2"},
{L"ROOT\\Microsoft\\Windows\\Storage", TRUE /* Before Win8. */},
+ {L"ROOT\\WMI"},
};
IWbemLocator *locator;
IWbemServices *services;
diff --git a/dlls/wbemprox/wbemprox_private.h b/dlls/wbemprox/wbemprox_private.h
index 6b94bbb9ef6..a2bf5071612 100644
--- a/dlls/wbemprox/wbemprox_private.h
+++ b/dlls/wbemprox/wbemprox_private.h
@@ -24,6 +24,7 @@ enum wbm_namespace
{
WBEMPROX_NAMESPACE_CIMV2,
WBEMPROX_NAMESPACE_MS_WINDOWS_STORAGE,
+ WBEMPROX_NAMESPACE_WMI,
WBEMPROX_NAMESPACE_LAST,
};
--
2.33.0
2
1
From: Ted Lyngmo <ted(a)lyncon.se>
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=51846
Signed-off-by: Ted Lyngmo <ted(a)lyncon.se>
Signed-off-by: Piotr Caban <piotr(a)codeweavers.com>
---
dlls/msvcrt/file.c | 7 ++++++
dlls/ucrtbase/tests/misc.c | 49 ++++++++++++++++++++++++++++++++++++++
2 files changed, 56 insertions(+)
2
1
[PATCH v2 1/6] dinput8/tests: Add mouse and keyboard object enumeration tests.
by Rémi Bernon Oct. 18, 2021
by Rémi Bernon Oct. 18, 2021
Oct. 18, 2021
Signed-off-by: Rémi Bernon <rbernon(a)codeweavers.com>
---
v2: Remove the HID usage to GUID mapping from PATCH 2, as it's outdated
and probably better to keep HID code in the HID joystick only. It
was an optimisation to avoid comparing GUIDs but probably not worth
it.
dlls/dinput8/tests/device.c | 810 +++++++++++++++++++++++++++++++++++-
1 file changed, 807 insertions(+), 3 deletions(-)
diff --git a/dlls/dinput8/tests/device.c b/dlls/dinput8/tests/device.c
index 17deed193dd..6571d1b26b2 100644
--- a/dlls/dinput8/tests/device.c
+++ b/dlls/dinput8/tests/device.c
@@ -19,12 +19,22 @@
#define DIRECTINPUT_VERSION 0x0800
-#define COBJMACROS
-#include <windows.h>
+#include <stdarg.h>
+#include <stddef.h>
-#include "wine/test.h"
+#include "ntstatus.h"
+#define WIN32_NO_STATUS
#include "windef.h"
+#include "winbase.h"
+
+#define COBJMACROS
#include "dinput.h"
+#include "hidusage.h"
+
+#include "wine/test.h"
+
+static HINSTANCE instance;
+static BOOL localized; /* object names get translated */
struct enum_data {
IDirectInput8A *pDI;
@@ -1011,10 +1021,804 @@ static void test_appdata_property(void)
IDirectInput_Release(pDI);
}
+#define check_member_( file, line, val, exp, fmt, member ) \
+ ok_( file, line )((val).member == (exp).member, "got " #member " " fmt ", expected " fmt "\n", \
+ (val).member, (exp).member)
+#define check_member( val, exp, fmt, member ) \
+ check_member_( __FILE__, __LINE__, val, exp, fmt, member )
+
+#define check_member_guid_( file, line, val, exp, member ) \
+ ok_( file, line )(IsEqualGUID( &(val).member, &(exp).member ), "got " #member " %s, expected %s\n", \
+ debugstr_guid( &(val).member ), debugstr_guid( &(exp).member ))
+#define check_member_guid( val, exp, member ) \
+ check_member_guid_( __FILE__, __LINE__, val, exp, member )
+
+#define check_member_wstr_( file, line, val, exp, member ) \
+ ok_( file, line )(!wcscmp( (val).member, (exp).member ), "got " #member " %s, expected %s\n", \
+ debugstr_w((val).member), debugstr_w((exp).member))
+#define check_member_wstr( val, exp, member ) \
+ check_member_wstr_( __FILE__, __LINE__, val, exp, member )
+
+struct check_objects_todos
+{
+ BOOL offset;
+ BOOL type;
+ BOOL name;
+};
+
+struct check_objects_params
+{
+ UINT index;
+ UINT stop_count;
+ UINT expect_count;
+ const DIDEVICEOBJECTINSTANCEW *expect_objs;
+ const struct check_objects_todos *todo_objs;
+ BOOL todo_extra;
+};
+
+static BOOL CALLBACK check_objects( const DIDEVICEOBJECTINSTANCEW *obj, void *args )
+{
+ struct check_objects_params *params = args;
+ const DIDEVICEOBJECTINSTANCEW *exp = params->expect_objs + params->index;
+ const struct check_objects_todos *todo = params->todo_objs + params->index;
+
+ todo_wine_if( params->todo_extra && params->index >= params->expect_count )
+ ok( params->index < params->expect_count, "unexpected extra object\n" );
+ if (params->index >= params->expect_count) return DIENUM_CONTINUE;
+
+ winetest_push_context( "obj[%d]", params->index );
+
+ todo_wine
+ check_member( *obj, *exp, "%u", dwSize );
+ check_member_guid( *obj, *exp, guidType );
+ todo_wine_if( todo->offset )
+ check_member( *obj, *exp, "%#x", dwOfs );
+ todo_wine_if( todo->type )
+ check_member( *obj, *exp, "%#x", dwType );
+ 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 );
+ check_member( *obj, *exp, "%#04x", wUsagePage );
+ check_member( *obj, *exp, "%#04x", wUsage );
+ check_member( *obj, *exp, "%#04x", dwDimension );
+ check_member( *obj, *exp, "%#04x", wExponent );
+ check_member( *obj, *exp, "%u", wReportId );
+
+ winetest_pop_context();
+
+ params->index++;
+ if (params->stop_count && params->index == params->stop_count) return DIENUM_STOP;
+ return DIENUM_CONTINUE;
+}
+
+static BOOL CALLBACK check_object_count( const DIDEVICEOBJECTINSTANCEW *obj, void *args )
+{
+ DWORD *count = args;
+ *count = *count + 1;
+ return DIENUM_CONTINUE;
+}
+
+static void test_mouse_info(void)
+{
+ static const DIDEVCAPS expect_caps =
+ {
+ .dwSize = sizeof(DIDEVCAPS),
+ .dwFlags = DIDC_ATTACHED | DIDC_EMULATED,
+ .dwDevType = (DI8DEVTYPEMOUSE_UNKNOWN << 8) | DI8DEVTYPE_MOUSE,
+ .dwAxes = 3,
+ .dwButtons = 5,
+ };
+ const DIDEVICEINSTANCEW expect_devinst =
+ {
+ .dwSize = sizeof(DIDEVICEINSTANCEW),
+ .guidInstance = GUID_SysMouse,
+ .guidProduct = GUID_SysMouse,
+ .dwDevType = (DI8DEVTYPEMOUSE_UNKNOWN << 8) | DI8DEVTYPE_MOUSE,
+ .tszInstanceName = L"Mouse",
+ .tszProductName = L"Mouse",
+ .guidFFDriver = GUID_NULL,
+ };
+ const DIDEVICEOBJECTINSTANCEW expect_objects[] =
+ {
+ {
+ .dwSize = sizeof(DIDEVICEOBJECTINSTANCEW),
+ .guidType = GUID_XAxis,
+ .dwOfs = 0x0,
+ .dwType = DIDFT_RELAXIS|DIDFT_MAKEINSTANCE(0),
+ .dwFlags = DIDOI_ASPECTPOSITION,
+ .tszName = L"X-axis",
+ },
+ {
+ .dwSize = sizeof(DIDEVICEOBJECTINSTANCEW),
+ .guidType = GUID_YAxis,
+ .dwOfs = 0x4,
+ .dwType = DIDFT_RELAXIS|DIDFT_MAKEINSTANCE(1),
+ .dwFlags = DIDOI_ASPECTPOSITION,
+ .tszName = L"Y-axis",
+ },
+ {
+ .dwSize = sizeof(DIDEVICEOBJECTINSTANCEW),
+ .guidType = GUID_ZAxis,
+ .dwOfs = 0x8,
+ .dwType = DIDFT_RELAXIS|DIDFT_MAKEINSTANCE(2),
+ .dwFlags = DIDOI_ASPECTPOSITION,
+ .tszName = L"Wheel",
+ },
+ {
+ .dwSize = sizeof(DIDEVICEOBJECTINSTANCEW),
+ .guidType = GUID_Button,
+ .dwOfs = 0xc,
+ .dwType = DIDFT_PSHBUTTON|DIDFT_MAKEINSTANCE(3),
+ .tszName = L"Button 0",
+ },
+ {
+ .dwSize = sizeof(DIDEVICEOBJECTINSTANCEW),
+ .guidType = GUID_Button,
+ .dwOfs = 0xd,
+ .dwType = DIDFT_PSHBUTTON|DIDFT_MAKEINSTANCE(4),
+ .tszName = L"Button 1",
+ },
+ {
+ .dwSize = sizeof(DIDEVICEOBJECTINSTANCEW),
+ .guidType = GUID_Button,
+ .dwOfs = 0xe,
+ .dwType = DIDFT_PSHBUTTON|DIDFT_MAKEINSTANCE(5),
+ .tszName = L"Button 2",
+ },
+ {
+ .dwSize = sizeof(DIDEVICEOBJECTINSTANCEW),
+ .guidType = GUID_Button,
+ .dwOfs = 0xf,
+ .dwType = DIDFT_PSHBUTTON|DIDFT_MAKEINSTANCE(6),
+ .tszName = L"Button 3",
+ },
+ {
+ .dwSize = sizeof(DIDEVICEOBJECTINSTANCEW),
+ .guidType = GUID_Button,
+ .dwOfs = 0x10,
+ .dwType = DIDFT_PSHBUTTON|DIDFT_MAKEINSTANCE(7),
+ .tszName = L"Button 4",
+ },
+ };
+ struct check_objects_todos todo_objects[ARRAY_SIZE(expect_objects)] =
+ {
+ {.name = TRUE},
+ {.name = TRUE},
+ };
+ struct check_objects_params check_objects_params =
+ {
+ .expect_count = ARRAY_SIZE(expect_objects),
+ .expect_objs = expect_objects,
+ .todo_objs = todo_objects,
+ .todo_extra = TRUE,
+ };
+ DIPROPGUIDANDPATH prop_guid_path =
+ {
+ .diph =
+ {
+ .dwSize = sizeof(DIPROPGUIDANDPATH),
+ .dwHeaderSize = sizeof(DIPROPHEADER),
+ .dwHow = DIPH_DEVICE,
+ },
+ };
+ DIPROPSTRING prop_string =
+ {
+ .diph =
+ {
+ .dwSize = sizeof(DIPROPSTRING),
+ .dwHeaderSize = sizeof(DIPROPHEADER),
+ .dwHow = DIPH_DEVICE,
+ },
+ };
+ DIPROPDWORD prop_dword =
+ {
+ .diph =
+ {
+ .dwSize = sizeof(DIPROPDWORD),
+ .dwHeaderSize = sizeof(DIPROPHEADER),
+ .dwHow = DIPH_DEVICE,
+ },
+ };
+ DIPROPRANGE prop_range =
+ {
+ .diph =
+ {
+ .dwSize = sizeof(DIPROPRANGE),
+ .dwHeaderSize = sizeof(DIPROPHEADER),
+ .dwHow = DIPH_DEVICE,
+ },
+ };
+ DIDEVICEOBJECTINSTANCEW objinst = {0};
+ DIDEVICEINSTANCEW devinst = {0};
+ IDirectInputDevice8W *device;
+ DIDEVCAPS caps = {0};
+ IDirectInput8W *di;
+ ULONG res, ref;
+ HRESULT hr;
+ GUID guid;
+
+ localized = LOWORD( GetKeyboardLayout( 0 ) ) != 0x0409;
+
+ hr = DirectInput8Create( instance, DIRECTINPUT_VERSION, &IID_IDirectInput8W, (void **)&di, NULL );
+ ok( hr == DI_OK, "DirectInput8Create returned %#x\n", hr );
+ hr = IDirectInput8_CreateDevice( di, &GUID_SysMouse, &device, NULL );
+ ok( hr == DI_OK, "CreateDevice returned %#x\n", hr );
+
+ hr = IDirectInputDevice8_Initialize( device, instance, DIRECTINPUT_VERSION, &GUID_SysMouseEm );
+ ok( hr == DI_OK, "Initialize returned %#x\n", hr );
+ guid = GUID_SysMouseEm;
+ memset( &devinst, 0, sizeof(devinst) );
+ devinst.dwSize = sizeof(DIDEVICEINSTANCEW);
+ hr = IDirectInputDevice8_GetDeviceInfo( device, &devinst );
+ ok( hr == DI_OK, "GetDeviceInfo returned %#x\n", hr );
+ ok( IsEqualGUID( &guid, &GUID_SysMouseEm ), "got %s expected %s\n", debugstr_guid( &guid ),
+ debugstr_guid( &GUID_SysMouseEm ) );
+
+ hr = IDirectInputDevice8_Initialize( device, instance, DIRECTINPUT_VERSION, &GUID_SysMouse );
+ ok( hr == DI_OK, "Initialize returned %#x\n", hr );
+
+ memset( &devinst, 0, sizeof(devinst) );
+ devinst.dwSize = sizeof(DIDEVICEINSTANCEW);
+ hr = IDirectInputDevice8_GetDeviceInfo( device, &devinst );
+ ok( hr == DI_OK, "GetDeviceInfo returned %#x\n", hr );
+ check_member( devinst, expect_devinst, "%d", dwSize );
+ check_member_guid( devinst, expect_devinst, guidInstance );
+ check_member_guid( devinst, expect_devinst, guidProduct );
+ todo_wine
+ check_member( devinst, expect_devinst, "%#x", dwDevType );
+ if (!localized) check_member_wstr( devinst, expect_devinst, tszInstanceName );
+ if (!localized) todo_wine check_member_wstr( devinst, expect_devinst, tszProductName );
+ check_member_guid( devinst, expect_devinst, guidFFDriver );
+ check_member( devinst, expect_devinst, "%04x", wUsagePage );
+ check_member( devinst, expect_devinst, "%04x", wUsage );
+
+ caps.dwSize = sizeof(DIDEVCAPS);
+ hr = IDirectInputDevice8_GetCapabilities( device, &caps );
+ 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
+ check_member( caps, expect_caps, "%#x", dwDevType );
+ check_member( caps, expect_caps, "%d", dwAxes );
+ todo_wine
+ check_member( caps, expect_caps, "%d", dwButtons );
+ check_member( caps, expect_caps, "%d", dwPOVs );
+ check_member( caps, expect_caps, "%d", dwFFSamplePeriod );
+ check_member( caps, expect_caps, "%d", dwFFMinTimeResolution );
+ todo_wine
+ check_member( caps, expect_caps, "%d", dwFirmwareRevision );
+ todo_wine
+ check_member( caps, expect_caps, "%d", dwHardwareRevision );
+ check_member( caps, expect_caps, "%d", dwFFDriverVersion );
+
+ prop_dword.diph.dwHow = DIPH_BYOFFSET;
+ prop_dword.diph.dwObj = DIMOFS_X;
+ hr = IDirectInputDevice8_GetProperty( device, DIPROP_GRANULARITY, &prop_dword.diph );
+ todo_wine
+ ok( hr == DIERR_NOTFOUND, "GetProperty DIPROP_GRANULARITY returned %#x\n", hr );
+ hr = IDirectInputDevice8_GetProperty( device, DIPROP_DEADZONE, &prop_dword.diph );
+ todo_wine
+ ok( hr == DIERR_NOTFOUND, "GetProperty DIPROP_DEADZONE returned %#x\n", hr );
+ hr = IDirectInputDevice8_GetProperty( device, DIPROP_SATURATION, &prop_dword.diph );
+ todo_wine
+ ok( hr == DIERR_NOTFOUND, "GetProperty DIPROP_SATURATION returned %#x\n", hr );
+ prop_range.diph.dwHow = DIPH_BYOFFSET;
+ prop_range.diph.dwObj = DIMOFS_X;
+ hr = IDirectInputDevice8_GetProperty( device, DIPROP_RANGE, &prop_range.diph );
+ todo_wine
+ ok( hr == DIERR_NOTFOUND, "GetProperty DIPROP_RANGE returned %#x\n", hr );
+
+ prop_dword.diph.dwHow = DIPH_DEVICE;
+ prop_dword.diph.dwObj = 0;
+ prop_dword.dwData = 0xdeadbeef;
+ hr = IDirectInputDevice8_GetProperty( device, DIPROP_AXISMODE, &prop_dword.diph );
+ todo_wine
+ ok( hr == DI_OK, "GetProperty DIPROP_AXISMODE returned %#x\n", hr );
+ todo_wine
+ ok( prop_dword.dwData == DIPROPAXISMODE_ABS, "got %u expected %u\n", prop_dword.dwData, DIPROPAXISMODE_ABS );
+ prop_dword.dwData = 0xdeadbeef;
+ hr = IDirectInputDevice8_GetProperty( device, DIPROP_BUFFERSIZE, &prop_dword.diph );
+ ok( hr == DI_OK, "GetProperty DIPROP_BUFFERSIZE returned %#x\n", hr );
+ ok( prop_dword.dwData == 0, "got %#x expected %#x\n", prop_dword.dwData, 0 );
+ prop_dword.dwData = 0xdeadbeef;
+ hr = IDirectInputDevice8_GetProperty( device, DIPROP_FFGAIN, &prop_dword.diph );
+ todo_wine
+ ok( hr == DI_OK, "GetProperty DIPROP_FFGAIN returned %#x\n", hr );
+ todo_wine
+ ok( prop_dword.dwData == 10000, "got %u expected %u\n", prop_dword.dwData, 10000 );
+
+ hr = IDirectInputDevice8_SetDataFormat( device, &c_dfDIMouse2 );
+ ok( hr == DI_OK, "SetDataFormat returned %#x\n", hr );
+
+ prop_dword.diph.dwHow = DIPH_DEVICE;
+ prop_dword.diph.dwObj = 0;
+ prop_dword.dwData = 0xdeadbeef;
+ hr = IDirectInputDevice8_GetProperty( device, DIPROP_AXISMODE, &prop_dword.diph );
+ todo_wine
+ ok( hr == DI_OK, "GetProperty DIPROP_AXISMODE returned %#x\n", hr );
+ todo_wine
+ ok( prop_dword.dwData == DIPROPAXISMODE_REL, "got %u expected %u\n", prop_dword.dwData, DIPROPAXISMODE_ABS );
+
+ prop_dword.dwData = 0xdeadbeef;
+ hr = IDirectInputDevice8_GetProperty( device, DIPROP_VIDPID, &prop_dword.diph );
+ ok( hr == DIERR_UNSUPPORTED, "GetProperty DIPROP_VIDPID returned %#x\n", hr );
+ hr = IDirectInputDevice8_GetProperty( device, DIPROP_GUIDANDPATH, &prop_guid_path.diph );
+ todo_wine
+ ok( hr == DIERR_UNSUPPORTED, "GetProperty DIPROP_GUIDANDPATH returned %#x\n", hr );
+ hr = IDirectInputDevice8_GetProperty( device, DIPROP_INSTANCENAME, &prop_string.diph );
+ todo_wine
+ ok( hr == DIERR_UNSUPPORTED, "GetProperty DIPROP_INSTANCENAME returned %#x\n", hr );
+ hr = IDirectInputDevice8_GetProperty( device, DIPROP_PRODUCTNAME, &prop_string.diph );
+ todo_wine
+ ok( hr == DIERR_UNSUPPORTED, "GetProperty DIPROP_PRODUCTNAME returned %#x\n", hr );
+ hr = IDirectInputDevice8_GetProperty( device, DIPROP_TYPENAME, &prop_string.diph );
+ todo_wine
+ ok( hr == DIERR_UNSUPPORTED, "GetProperty DIPROP_TYPENAME returned %#x\n", hr );
+ hr = IDirectInputDevice8_GetProperty( device, DIPROP_USERNAME, &prop_string.diph );
+ ok( hr == S_FALSE, "GetProperty DIPROP_USERNAME returned %#x\n", hr );
+ ok( !wcscmp( prop_string.wsz, L"" ), "got user %s\n", debugstr_w(prop_string.wsz) );
+
+ hr = IDirectInputDevice8_GetProperty( device, DIPROP_JOYSTICKID, &prop_dword.diph );
+ todo_wine
+ ok( hr == DIERR_UNSUPPORTED, "GetProperty DIPROP_VIDPID returned %#x\n", hr );
+
+ hr = IDirectInputDevice8_GetProperty( device, DIPROP_CALIBRATION, &prop_dword.diph );
+ ok( hr == DIERR_INVALIDPARAM, "GetProperty DIPROP_CALIBRATION returned %#x\n", hr );
+ hr = IDirectInputDevice8_GetProperty( device, DIPROP_AUTOCENTER, &prop_dword.diph );
+ todo_wine
+ ok( hr == DIERR_UNSUPPORTED, "GetProperty DIPROP_AUTOCENTER returned %#x\n", hr );
+ hr = IDirectInputDevice8_GetProperty( device, DIPROP_DEADZONE, &prop_dword.diph );
+ todo_wine
+ ok( hr == DIERR_UNSUPPORTED, "GetProperty DIPROP_DEADZONE returned %#x\n", hr );
+ hr = IDirectInputDevice8_GetProperty( device, DIPROP_FFLOAD, &prop_dword.diph );
+ todo_wine
+ ok( hr == DIERR_UNSUPPORTED, "GetProperty DIPROP_FFLOAD returned %#x\n", hr );
+ hr = IDirectInputDevice8_GetProperty( device, DIPROP_GRANULARITY, &prop_dword.diph );
+ todo_wine
+ ok( hr == DIERR_UNSUPPORTED, "GetProperty DIPROP_GRANULARITY returned %#x\n", hr );
+
+ prop_dword.diph.dwHow = DIPH_BYUSAGE;
+ prop_dword.diph.dwObj = MAKELONG( HID_USAGE_GENERIC_X, HID_USAGE_PAGE_GENERIC );
+ hr = IDirectInputDevice8_GetProperty( device, DIPROP_GRANULARITY, &prop_dword.diph );
+ todo_wine
+ ok( hr == DIERR_UNSUPPORTED, "GetProperty DIPROP_GRANULARITY returned %#x\n", hr );
+
+ prop_dword.diph.dwHow = DIPH_BYOFFSET;
+ prop_dword.diph.dwObj = DIMOFS_X;
+ prop_dword.dwData = 0xdeadbeef;
+ hr = IDirectInputDevice8_GetProperty( device, DIPROP_GRANULARITY, &prop_dword.diph );
+ ok( hr == DI_OK, "GetProperty DIPROP_GRANULARITY returned %#x\n", hr );
+ ok( prop_dword.dwData == 1, "got %d expected 1\n", prop_dword.dwData );
+ hr = IDirectInputDevice8_GetProperty( device, DIPROP_DEADZONE, &prop_dword.diph );
+ todo_wine
+ ok( hr == DIERR_UNSUPPORTED, "GetProperty DIPROP_DEADZONE returned %#x\n", hr );
+ hr = IDirectInputDevice8_GetProperty( device, DIPROP_SATURATION, &prop_dword.diph );
+ todo_wine
+ ok( hr == DIERR_UNSUPPORTED, "GetProperty DIPROP_SATURATION returned %#x\n", hr );
+ prop_range.lMin = 0xdeadbeef;
+ prop_range.lMax = 0xdeadbeef;
+ hr = IDirectInputDevice8_GetProperty( device, DIPROP_RANGE, &prop_range.diph );
+ ok( hr == DI_OK, "GetProperty DIPROP_RANGE returned %#x\n", hr );
+ todo_wine
+ ok( prop_range.lMin == DIPROPRANGE_NOMIN, "got %d expected %d\n", prop_range.lMin, DIPROPRANGE_NOMIN );
+ todo_wine
+ ok( prop_range.lMax == DIPROPRANGE_NOMAX, "got %d expected %d\n", prop_range.lMax, DIPROPRANGE_NOMAX );
+
+ res = 0;
+ hr = IDirectInputDevice8_EnumObjects( device, check_object_count, &res, DIDFT_AXIS | DIDFT_PSHBUTTON );
+ ok( hr == DI_OK, "EnumObjects returned %#x\n", hr );
+ todo_wine
+ ok( res == 8, "got %u expected %u\n", res, 8 );
+ 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",
+ check_objects_params.expect_count - check_objects_params.index );
+
+ objinst.dwSize = sizeof(DIDEVICEOBJECTINSTANCEW);
+ res = MAKELONG( HID_USAGE_GENERIC_X, HID_USAGE_PAGE_GENERIC );
+ hr = IDirectInputDevice8_GetObjectInfo( device, &objinst, res, DIPH_BYUSAGE );
+ todo_wine
+ ok( hr == DIERR_UNSUPPORTED, "GetObjectInfo returned: %#x\n", hr );
+
+ hr = IDirectInputDevice8_GetObjectInfo( device, &objinst, DIMOFS_Y, DIPH_BYOFFSET );
+ ok( hr == DI_OK, "GetObjectInfo returned: %#x\n", hr );
+
+ check_member( objinst, expect_objects[1], "%u", dwSize );
+ check_member_guid( objinst, expect_objects[1], guidType );
+ check_member( objinst, expect_objects[1], "%#x", dwOfs );
+ check_member( objinst, expect_objects[1], "%#x", dwType );
+ check_member( objinst, expect_objects[1], "%#x", dwFlags );
+ if (!localized) todo_wine check_member_wstr( objinst, expect_objects[1], tszName );
+ check_member( objinst, expect_objects[1], "%u", dwFFMaxForce );
+ check_member( objinst, expect_objects[1], "%u", dwFFForceResolution );
+ check_member( objinst, expect_objects[1], "%u", wCollectionNumber );
+ check_member( objinst, expect_objects[1], "%u", wDesignatorIndex );
+ check_member( objinst, expect_objects[1], "%#04x", wUsagePage );
+ check_member( objinst, expect_objects[1], "%#04x", wUsage );
+ check_member( objinst, expect_objects[1], "%#04x", dwDimension );
+ check_member( objinst, expect_objects[1], "%#04x", wExponent );
+ check_member( objinst, expect_objects[1], "%u", wReportId );
+
+ hr = IDirectInputDevice8_GetObjectInfo( device, &objinst, 7, DIPH_BYOFFSET );
+ ok( hr == DIERR_NOTFOUND, "GetObjectInfo returned: %#x\n", hr );
+ res = DIDFT_TGLBUTTON | DIDFT_MAKEINSTANCE( 3 );
+ hr = IDirectInputDevice8_GetObjectInfo( device, &objinst, res, DIPH_BYID );
+ ok( hr == DIERR_NOTFOUND, "GetObjectInfo returned: %#x\n", hr );
+ res = DIDFT_PSHBUTTON | DIDFT_MAKEINSTANCE( 3 );
+ hr = IDirectInputDevice8_GetObjectInfo( device, &objinst, res, DIPH_BYID );
+ 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 );
+
+ ref = IDirectInputDevice8_Release( device );
+ ok( ref == 0, "Release returned %d\n", ref );
+
+ ref = IDirectInput8_Release( di );
+ ok( ref == 0, "Release returned %d\n", ref );
+}
+
+static void test_keyboard_info(void)
+{
+ static const DIDEVCAPS expect_caps =
+ {
+ .dwSize = sizeof(DIDEVCAPS),
+ .dwFlags = DIDC_ATTACHED | DIDC_EMULATED,
+ .dwDevType = (DI8DEVTYPEKEYBOARD_PCENH << 8) | DI8DEVTYPE_KEYBOARD,
+ .dwButtons = 128,
+ };
+ const DIDEVICEINSTANCEW expect_devinst =
+ {
+ .dwSize = sizeof(DIDEVICEINSTANCEW),
+ .guidInstance = GUID_SysKeyboard,
+ .guidProduct = GUID_SysKeyboard,
+ .dwDevType = (DI8DEVTYPEKEYBOARD_PCENH << 8) | DI8DEVTYPE_KEYBOARD,
+ .tszInstanceName = L"Keyboard",
+ .tszProductName = L"Keyboard",
+ .guidFFDriver = GUID_NULL,
+ };
+
+ DIDEVICEOBJECTINSTANCEW expect_objects[] =
+ {
+ {
+ .dwSize = sizeof(DIDEVICEOBJECTINSTANCEW),
+ .guidType = GUID_Key,
+ .dwOfs = DIK_ESCAPE,
+ .dwType = DIDFT_PSHBUTTON|DIDFT_MAKEINSTANCE(DIK_ESCAPE),
+ .tszName = L"Esc",
+ },
+ {
+ .dwSize = sizeof(DIDEVICEOBJECTINSTANCEW),
+ .guidType = GUID_Key,
+ .dwOfs = DIK_1,
+ .dwType = DIDFT_PSHBUTTON|DIDFT_MAKEINSTANCE(DIK_1),
+ .tszName = L"1",
+ },
+ {
+ .dwSize = sizeof(DIDEVICEOBJECTINSTANCEW),
+ .guidType = GUID_Key,
+ .dwOfs = DIK_2,
+ .dwType = DIDFT_PSHBUTTON|DIDFT_MAKEINSTANCE(DIK_2),
+ .tszName = L"2",
+ },
+ {
+ .dwSize = sizeof(DIDEVICEOBJECTINSTANCEW),
+ .guidType = GUID_Key,
+ .dwOfs = DIK_3,
+ .dwType = DIDFT_PSHBUTTON|DIDFT_MAKEINSTANCE(DIK_3),
+ .tszName = L"3",
+ },
+ {
+ .dwSize = sizeof(DIDEVICEOBJECTINSTANCEW),
+ .guidType = GUID_Key,
+ .dwOfs = DIK_4,
+ .dwType = DIDFT_PSHBUTTON|DIDFT_MAKEINSTANCE(DIK_4),
+ .tszName = L"4",
+ },
+ };
+ struct check_objects_todos todo_objects[ARRAY_SIZE(expect_objects)] = {{0}};
+ struct check_objects_params check_objects_params =
+ {
+ .stop_count = ARRAY_SIZE(expect_objects),
+ .expect_count = ARRAY_SIZE(expect_objects),
+ .expect_objs = expect_objects,
+ .todo_objs = todo_objects,
+ };
+ DIPROPGUIDANDPATH prop_guid_path =
+ {
+ .diph =
+ {
+ .dwSize = sizeof(DIPROPGUIDANDPATH),
+ .dwHeaderSize = sizeof(DIPROPHEADER),
+ .dwHow = DIPH_DEVICE,
+ },
+ };
+ DIPROPSTRING prop_string =
+ {
+ .diph =
+ {
+ .dwSize = sizeof(DIPROPSTRING),
+ .dwHeaderSize = sizeof(DIPROPHEADER),
+ .dwHow = DIPH_DEVICE,
+ },
+ };
+ DIPROPDWORD prop_dword =
+ {
+ .diph =
+ {
+ .dwSize = sizeof(DIPROPDWORD),
+ .dwHeaderSize = sizeof(DIPROPHEADER),
+ .dwHow = DIPH_DEVICE,
+ },
+ };
+ DIPROPRANGE prop_range =
+ {
+ .diph =
+ {
+ .dwSize = sizeof(DIPROPRANGE),
+ .dwHeaderSize = sizeof(DIPROPHEADER),
+ .dwHow = DIPH_DEVICE,
+ },
+ };
+ DIDEVICEOBJECTINSTANCEW objinst = {0};
+ DIDEVICEINSTANCEW devinst = {0};
+ IDirectInputDevice8W *device;
+ DIDEVCAPS caps = {0};
+ IDirectInput8W *di;
+ ULONG res, ref;
+ HRESULT hr;
+ GUID guid;
+
+ localized = TRUE; /* Skip name tests, Wine sometimes succeeds depending on the host key names */
+
+ hr = DirectInput8Create( instance, DIRECTINPUT_VERSION, &IID_IDirectInput8W, (void **)&di, NULL );
+ ok( hr == DI_OK, "DirectInput8Create returned %#x\n", hr );
+ hr = IDirectInput8_CreateDevice( di, &GUID_SysKeyboard, &device, NULL );
+ ok( hr == DI_OK, "CreateDevice returned %#x\n", hr );
+
+ hr = IDirectInputDevice8_Initialize( device, instance, DIRECTINPUT_VERSION, &GUID_SysKeyboardEm );
+ ok( hr == DI_OK, "Initialize returned %#x\n", hr );
+ guid = GUID_SysKeyboardEm;
+ memset( &devinst, 0, sizeof(devinst) );
+ devinst.dwSize = sizeof(DIDEVICEINSTANCEW);
+ hr = IDirectInputDevice8_GetDeviceInfo( device, &devinst );
+ ok( hr == DI_OK, "GetDeviceInfo returned %#x\n", hr );
+ ok( IsEqualGUID( &guid, &GUID_SysKeyboardEm ), "got %s expected %s\n", debugstr_guid( &guid ),
+ debugstr_guid( &GUID_SysKeyboardEm ) );
+
+ hr = IDirectInputDevice8_Initialize( device, instance, DIRECTINPUT_VERSION, &GUID_SysKeyboard );
+ ok( hr == DI_OK, "Initialize returned %#x\n", hr );
+
+ memset( &devinst, 0, sizeof(devinst) );
+ devinst.dwSize = sizeof(DIDEVICEINSTANCEW);
+ hr = IDirectInputDevice8_GetDeviceInfo( device, &devinst );
+ ok( hr == DI_OK, "GetDeviceInfo returned %#x\n", hr );
+ check_member( devinst, expect_devinst, "%d", dwSize );
+ check_member_guid( devinst, expect_devinst, guidInstance );
+ check_member_guid( devinst, expect_devinst, guidProduct );
+ check_member( devinst, expect_devinst, "%#x", dwDevType );
+ if (!localized) check_member_wstr( devinst, expect_devinst, tszInstanceName );
+ if (!localized) todo_wine check_member_wstr( devinst, expect_devinst, tszProductName );
+ check_member_guid( devinst, expect_devinst, guidFFDriver );
+ check_member( devinst, expect_devinst, "%04x", wUsagePage );
+ check_member( devinst, expect_devinst, "%04x", wUsage );
+
+ caps.dwSize = sizeof(DIDEVCAPS);
+ hr = IDirectInputDevice8_GetCapabilities( device, &caps );
+ ok( hr == DI_OK, "GetCapabilities returned %#x\n", hr );
+ check_member( caps, expect_caps, "%d", dwSize );
+ check_member( caps, expect_caps, "%#x", dwFlags );
+ check_member( caps, expect_caps, "%#x", dwDevType );
+ check_member( caps, expect_caps, "%d", dwAxes );
+ todo_wine
+ check_member( caps, expect_caps, "%d", dwButtons );
+ check_member( caps, expect_caps, "%d", dwPOVs );
+ check_member( caps, expect_caps, "%d", dwFFSamplePeriod );
+ check_member( caps, expect_caps, "%d", dwFFMinTimeResolution );
+ todo_wine
+ check_member( caps, expect_caps, "%d", dwFirmwareRevision );
+ todo_wine
+ check_member( caps, expect_caps, "%d", dwHardwareRevision );
+ check_member( caps, expect_caps, "%d", dwFFDriverVersion );
+
+ prop_dword.diph.dwHow = DIPH_BYOFFSET;
+ prop_dword.diph.dwObj = 1;
+ hr = IDirectInputDevice8_GetProperty( device, DIPROP_GRANULARITY, &prop_dword.diph );
+ todo_wine
+ ok( hr == DIERR_NOTFOUND, "GetProperty DIPROP_GRANULARITY returned %#x\n", hr );
+ hr = IDirectInputDevice8_GetProperty( device, DIPROP_DEADZONE, &prop_dword.diph );
+ todo_wine
+ ok( hr == DIERR_NOTFOUND, "GetProperty DIPROP_DEADZONE returned %#x\n", hr );
+ hr = IDirectInputDevice8_GetProperty( device, DIPROP_SATURATION, &prop_dword.diph );
+ todo_wine
+ ok( hr == DIERR_NOTFOUND, "GetProperty DIPROP_SATURATION returned %#x\n", hr );
+ prop_range.diph.dwHow = DIPH_BYOFFSET;
+ prop_range.diph.dwObj = 1;
+ hr = IDirectInputDevice8_GetProperty( device, DIPROP_RANGE, &prop_range.diph );
+ todo_wine
+ ok( hr == DIERR_NOTFOUND, "GetProperty DIPROP_RANGE returned %#x\n", hr );
+
+ prop_dword.diph.dwHow = DIPH_DEVICE;
+ prop_dword.diph.dwObj = 0;
+ prop_dword.dwData = 0xdeadbeef;
+ hr = IDirectInputDevice8_GetProperty( device, DIPROP_AXISMODE, &prop_dword.diph );
+ todo_wine
+ ok( hr == DI_OK, "GetProperty DIPROP_AXISMODE returned %#x\n", hr );
+ todo_wine
+ ok( prop_dword.dwData == DIPROPAXISMODE_ABS, "got %u expected %u\n", prop_dword.dwData, DIPROPAXISMODE_ABS );
+ prop_dword.dwData = 0xdeadbeef;
+ hr = IDirectInputDevice8_GetProperty( device, DIPROP_BUFFERSIZE, &prop_dword.diph );
+ ok( hr == DI_OK, "GetProperty DIPROP_BUFFERSIZE returned %#x\n", hr );
+ ok( prop_dword.dwData == 0, "got %#x expected %#x\n", prop_dword.dwData, 0 );
+ prop_dword.dwData = 0xdeadbeef;
+ hr = IDirectInputDevice8_GetProperty( device, DIPROP_FFGAIN, &prop_dword.diph );
+ todo_wine
+ ok( hr == DI_OK, "GetProperty DIPROP_FFGAIN returned %#x\n", hr );
+ todo_wine
+ ok( prop_dword.dwData == 10000, "got %u expected %u\n", prop_dword.dwData, 10000 );
+
+ hr = IDirectInputDevice8_SetDataFormat( device, &c_dfDIKeyboard );
+ ok( hr == DI_OK, "SetDataFormat returned %#x\n", hr );
+
+ prop_dword.diph.dwHow = DIPH_DEVICE;
+ prop_dword.diph.dwObj = 0;
+ prop_dword.dwData = 0xdeadbeef;
+ hr = IDirectInputDevice8_GetProperty( device, DIPROP_AXISMODE, &prop_dword.diph );
+ todo_wine
+ ok( hr == DI_OK, "GetProperty DIPROP_AXISMODE returned %#x\n", hr );
+ todo_wine
+ ok( prop_dword.dwData == DIPROPAXISMODE_REL, "got %u expected %u\n", prop_dword.dwData, DIPROPAXISMODE_ABS );
+
+ prop_dword.dwData = 0xdeadbeef;
+ hr = IDirectInputDevice8_GetProperty( device, DIPROP_VIDPID, &prop_dword.diph );
+ ok( hr == DIERR_UNSUPPORTED, "GetProperty DIPROP_VIDPID returned %#x\n", hr );
+ hr = IDirectInputDevice8_GetProperty( device, DIPROP_GUIDANDPATH, &prop_guid_path.diph );
+ todo_wine
+ ok( hr == DIERR_UNSUPPORTED, "GetProperty DIPROP_GUIDANDPATH returned %#x\n", hr );
+ hr = IDirectInputDevice8_GetProperty( device, DIPROP_INSTANCENAME, &prop_string.diph );
+ todo_wine
+ ok( hr == DIERR_UNSUPPORTED, "GetProperty DIPROP_INSTANCENAME returned %#x\n", hr );
+ hr = IDirectInputDevice8_GetProperty( device, DIPROP_PRODUCTNAME, &prop_string.diph );
+ todo_wine
+ ok( hr == DIERR_UNSUPPORTED, "GetProperty DIPROP_PRODUCTNAME returned %#x\n", hr );
+ hr = IDirectInputDevice8_GetProperty( device, DIPROP_TYPENAME, &prop_string.diph );
+ todo_wine
+ ok( hr == DIERR_UNSUPPORTED, "GetProperty DIPROP_TYPENAME returned %#x\n", hr );
+ hr = IDirectInputDevice8_GetProperty( device, DIPROP_USERNAME, &prop_string.diph );
+ ok( hr == S_FALSE, "GetProperty DIPROP_USERNAME returned %#x\n", hr );
+ ok( !wcscmp( prop_string.wsz, L"" ), "got user %s\n", debugstr_w(prop_string.wsz) );
+
+ hr = IDirectInputDevice8_GetProperty( device, DIPROP_JOYSTICKID, &prop_dword.diph );
+ todo_wine
+ ok( hr == DIERR_UNSUPPORTED, "GetProperty DIPROP_VIDPID returned %#x\n", hr );
+
+ hr = IDirectInputDevice8_GetProperty( device, DIPROP_CALIBRATION, &prop_dword.diph );
+ ok( hr == DIERR_INVALIDPARAM, "GetProperty DIPROP_CALIBRATION returned %#x\n", hr );
+ hr = IDirectInputDevice8_GetProperty( device, DIPROP_AUTOCENTER, &prop_dword.diph );
+ todo_wine
+ ok( hr == DIERR_UNSUPPORTED, "GetProperty DIPROP_AUTOCENTER returned %#x\n", hr );
+ hr = IDirectInputDevice8_GetProperty( device, DIPROP_DEADZONE, &prop_dword.diph );
+ todo_wine
+ ok( hr == DIERR_UNSUPPORTED, "GetProperty DIPROP_DEADZONE returned %#x\n", hr );
+ hr = IDirectInputDevice8_GetProperty( device, DIPROP_FFLOAD, &prop_dword.diph );
+ todo_wine
+ ok( hr == DIERR_UNSUPPORTED, "GetProperty DIPROP_FFLOAD returned %#x\n", hr );
+ hr = IDirectInputDevice8_GetProperty( device, DIPROP_GRANULARITY, &prop_dword.diph );
+ todo_wine
+ ok( hr == DIERR_UNSUPPORTED, "GetProperty DIPROP_GRANULARITY returned %#x\n", hr );
+
+ prop_dword.diph.dwHow = DIPH_BYUSAGE;
+ prop_dword.diph.dwObj = MAKELONG( HID_USAGE_KEYBOARD_LCTRL, HID_USAGE_PAGE_KEYBOARD );
+ hr = IDirectInputDevice8_GetProperty( device, DIPROP_GRANULARITY, &prop_dword.diph );
+ todo_wine
+ ok( hr == DIERR_UNSUPPORTED, "GetProperty DIPROP_GRANULARITY returned %#x\n", hr );
+
+ prop_dword.diph.dwHow = DIPH_BYOFFSET;
+ prop_dword.diph.dwObj = 1;
+ hr = IDirectInputDevice8_GetProperty( device, DIPROP_GRANULARITY, &prop_dword.diph );
+ todo_wine
+ ok( hr == DIERR_UNSUPPORTED, "GetProperty DIPROP_GRANULARITY returned %#x\n", hr );
+ hr = IDirectInputDevice8_GetProperty( device, DIPROP_DEADZONE, &prop_dword.diph );
+ todo_wine
+ ok( hr == DIERR_UNSUPPORTED, "GetProperty DIPROP_DEADZONE returned %#x\n", hr );
+ hr = IDirectInputDevice8_GetProperty( device, DIPROP_SATURATION, &prop_dword.diph );
+ todo_wine
+ ok( hr == DIERR_UNSUPPORTED, "GetProperty DIPROP_SATURATION returned %#x\n", hr );
+ prop_range.diph.dwHow = DIPH_BYOFFSET;
+ prop_range.diph.dwObj = 1;
+ hr = IDirectInputDevice8_GetProperty( device, DIPROP_RANGE, &prop_range.diph );
+ ok( hr == DIERR_UNSUPPORTED, "GetProperty DIPROP_RANGE returned %#x\n", hr );
+
+ res = 0;
+ hr = IDirectInputDevice8_EnumObjects( device, check_object_count, &res, DIDFT_AXIS | DIDFT_PSHBUTTON );
+ ok( hr == DI_OK, "EnumObjects returned %#x\n", hr );
+ if (!localized) todo_wine ok( res == 127, "got %u expected %u\n", res, 127 );
+ 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",
+ check_objects_params.expect_count - check_objects_params.index );
+
+ objinst.dwSize = sizeof(DIDEVICEOBJECTINSTANCEW);
+ res = MAKELONG( HID_USAGE_KEYBOARD_LCTRL, HID_USAGE_PAGE_KEYBOARD );
+ hr = IDirectInputDevice8_GetObjectInfo( device, &objinst, res, DIPH_BYUSAGE );
+ todo_wine
+ ok( hr == DIERR_UNSUPPORTED, "GetObjectInfo returned: %#x\n", hr );
+
+ hr = IDirectInputDevice8_GetObjectInfo( device, &objinst, 2, DIPH_BYOFFSET );
+ ok( hr == DI_OK, "GetObjectInfo returned: %#x\n", hr );
+
+ check_member( objinst, expect_objects[1], "%u", dwSize );
+ check_member_guid( objinst, expect_objects[1], guidType );
+ check_member( objinst, expect_objects[1], "%#x", dwOfs );
+ check_member( objinst, expect_objects[1], "%#x", dwType );
+ check_member( objinst, expect_objects[1], "%#x", dwFlags );
+ if (!localized) check_member_wstr( objinst, expect_objects[1], tszName );
+ check_member( objinst, expect_objects[1], "%u", dwFFMaxForce );
+ check_member( objinst, expect_objects[1], "%u", dwFFForceResolution );
+ check_member( objinst, expect_objects[1], "%u", wCollectionNumber );
+ check_member( objinst, expect_objects[1], "%u", wDesignatorIndex );
+ check_member( objinst, expect_objects[1], "%#04x", wUsagePage );
+ check_member( objinst, expect_objects[1], "%#04x", wUsage );
+ check_member( objinst, expect_objects[1], "%#04x", dwDimension );
+ check_member( objinst, expect_objects[1], "%#04x", wExponent );
+ check_member( objinst, expect_objects[1], "%u", wReportId );
+
+ hr = IDirectInputDevice8_GetObjectInfo( device, &objinst, 423, DIPH_BYOFFSET );
+ ok( hr == DIERR_NOTFOUND, "GetObjectInfo returned: %#x\n", hr );
+ res = DIDFT_TGLBUTTON | DIDFT_MAKEINSTANCE( 3 );
+ hr = IDirectInputDevice8_GetObjectInfo( device, &objinst, res, DIPH_BYID );
+ ok( hr == DIERR_NOTFOUND, "GetObjectInfo returned: %#x\n", hr );
+ res = DIDFT_PSHBUTTON | DIDFT_MAKEINSTANCE( 3 );
+ hr = IDirectInputDevice8_GetObjectInfo( device, &objinst, res, DIPH_BYID );
+ ok( hr == DI_OK, "GetObjectInfo returned: %#x\n", hr );
+
+ check_member( objinst, expect_objects[2], "%u", dwSize );
+ check_member_guid( objinst, expect_objects[2], guidType );
+ check_member( objinst, expect_objects[2], "%#x", dwOfs );
+ check_member( objinst, expect_objects[2], "%#x", dwType );
+ check_member( objinst, expect_objects[2], "%#x", dwFlags );
+ if (!localized) check_member_wstr( objinst, expect_objects[2], tszName );
+ check_member( objinst, expect_objects[2], "%u", dwFFMaxForce );
+ check_member( objinst, expect_objects[2], "%u", dwFFForceResolution );
+ check_member( objinst, expect_objects[2], "%u", wCollectionNumber );
+ check_member( objinst, expect_objects[2], "%u", wDesignatorIndex );
+ check_member( objinst, expect_objects[2], "%#04x", wUsagePage );
+ check_member( objinst, expect_objects[2], "%#04x", wUsage );
+ check_member( objinst, expect_objects[2], "%#04x", dwDimension );
+ check_member( objinst, expect_objects[2], "%#04x", wExponent );
+ check_member( objinst, expect_objects[2], "%u", wReportId );
+
+ ref = IDirectInputDevice8_Release( device );
+ ok( ref == 0, "Release returned %d\n", ref );
+
+ ref = IDirectInput8_Release( di );
+ ok( ref == 0, "Release returned %d\n", ref );
+}
+
START_TEST(device)
{
+ instance = GetModuleHandleW( NULL );
+
CoInitialize(NULL);
+ test_mouse_info();
+ test_keyboard_info();
test_action_mapping();
test_save_settings();
test_mouse_keyboard();
--
2.33.0
2
7
[PATCH v5] winex11.drv: Add GPU hardware information values to the registry.
by Zhiyi Zhang Oct. 18, 2021
by Zhiyi Zhang Oct. 18, 2021
Oct. 18, 2021
From: Dmitry Timoshkov <dmitry(a)baikal.ru>
Signed-off-by: Dmitry Timoshkov <dmitry(a)baikal.ru>
Signed-off-by: Zhiyi Zhang <zzhang(a)codeweavers.com>
---
v2: Without setting "HardwareInformation.MemorySize" key.
v3: strlen() -> sizeof().
v4: Perform string size calculation ealier.
v5: Supersede 217165. Use registry type REG_BINARY as it seems more common.
dlls/winex11.drv/display.c | 18 ++++++++++++++++--
1 file changed, 16 insertions(+), 2 deletions(-)
diff --git a/dlls/winex11.drv/display.c b/dlls/winex11.drv/display.c
index c8c216c8302..bf32e82cb3e 100644
--- a/dlls/winex11.drv/display.c
+++ b/dlls/winex11.drv/display.c
@@ -463,6 +463,11 @@ static BOOL link_device(const WCHAR *instance, const GUID *guid)
static BOOL X11DRV_InitGpu(HDEVINFO devinfo, const struct x11drv_gpu *gpu, INT gpu_index, WCHAR *guid_string,
WCHAR *driver, LUID *gpu_luid)
{
+ static const WCHAR adapter_stringW[] = {'H','a','r','d','w','a','r','e','I','n','f','o','r','m','a','t','i','o','n','.','A','d','a','p','t','e','r','S','t','r','i','n','g',0};
+ static const WCHAR bios_stringW[] = {'H','a','r','d','w','a','r','e','I','n','f','o','r','m','a','t','i','o','n','.','B','i','o','s','S','t','r','i','n','g',0};
+ static const WCHAR chip_typeW[] = {'H','a','r','d','w','a','r','e','I','n','f','o','r','m','a','t','i','o','n','.','C','h','i','p','T','y','p','e',0};
+ static const WCHAR dac_typeW[] = {'H','a','r','d','w','a','r','e','I','n','f','o','r','m','a','t','i','o','n','.','D','a','c','T','y','p','e',0};
+ static const WCHAR ramdacW[] = {'I','n','t','e','r','g','r','a','t','e','d',' ','R','A','M','D','A','C',0};
static const BOOL present = TRUE;
SP_DEVINFO_DATA device_data = {sizeof(device_data)};
WCHAR instanceW[MAX_PATH];
@@ -538,9 +543,9 @@ static BOOL X11DRV_InitGpu(HDEVINFO devinfo, const struct x11drv_gpu *gpu, INT g
* This is where HKLM\System\CurrentControlSet\Control\Video\{GPU GUID}\{Adapter Index} links to */
hkey = SetupDiCreateDevRegKeyW(devinfo, &device_data, DICS_FLAG_GLOBAL, 0, DIREG_DRV, NULL, NULL);
+ size = (strlenW(gpu->name) + 1) * sizeof(WCHAR);
/* Write DriverDesc value */
- if (RegSetValueExW(hkey, driver_descW, 0, REG_SZ, (const BYTE *)gpu->name,
- (strlenW(gpu->name) + 1) * sizeof(WCHAR)))
+ if (RegSetValueExW(hkey, driver_descW, 0, REG_SZ, (const BYTE *)gpu->name, size))
goto done;
/* Write DriverDateData value, using current time as driver date, needed by Evoland */
GetSystemTimeAsFileTime(&filetime);
@@ -551,6 +556,15 @@ static BOOL X11DRV_InitGpu(HDEVINFO devinfo, const struct x11drv_gpu *gpu, INT g
sprintfW(bufferW, driver_date_fmtW, systemtime.wMonth, systemtime.wDay, systemtime.wYear);
if (RegSetValueExW(hkey, driver_dateW, 0, REG_SZ, (BYTE *)bufferW, (strlenW(bufferW) + 1) * sizeof(WCHAR)))
goto done;
+ /* The following hardware information value type may be REG_BINARY or REG_SZ */
+ if (RegSetValueExW(hkey, adapter_stringW, 0, REG_BINARY, (const BYTE *)gpu->name, size))
+ goto done;
+ if (RegSetValueExW(hkey, bios_stringW, 0, REG_BINARY, (const BYTE *)gpu->name, size))
+ goto done;
+ if (RegSetValueExW(hkey, chip_typeW, 0, REG_BINARY, (const BYTE *)gpu->name, size))
+ goto done;
+ if (RegSetValueExW(hkey, dac_typeW, 0, REG_BINARY, (const BYTE *)ramdacW, sizeof(ramdacW)))
+ goto done;
RegCloseKey(hkey);
--
2.32.0
1
0
[PATCH 1/6] dinput8/tests: Add mouse and keyboard object enumeration tests.
by Rémi Bernon Oct. 18, 2021
by Rémi Bernon Oct. 18, 2021
Oct. 18, 2021
Signed-off-by: Rémi Bernon <rbernon(a)codeweavers.com>
---
dlls/dinput8/tests/device.c | 810 +++++++++++++++++++++++++++++++++++-
1 file changed, 807 insertions(+), 3 deletions(-)
diff --git a/dlls/dinput8/tests/device.c b/dlls/dinput8/tests/device.c
index 17deed193dd..6571d1b26b2 100644
--- a/dlls/dinput8/tests/device.c
+++ b/dlls/dinput8/tests/device.c
@@ -19,12 +19,22 @@
#define DIRECTINPUT_VERSION 0x0800
-#define COBJMACROS
-#include <windows.h>
+#include <stdarg.h>
+#include <stddef.h>
-#include "wine/test.h"
+#include "ntstatus.h"
+#define WIN32_NO_STATUS
#include "windef.h"
+#include "winbase.h"
+
+#define COBJMACROS
#include "dinput.h"
+#include "hidusage.h"
+
+#include "wine/test.h"
+
+static HINSTANCE instance;
+static BOOL localized; /* object names get translated */
struct enum_data {
IDirectInput8A *pDI;
@@ -1011,10 +1021,804 @@ static void test_appdata_property(void)
IDirectInput_Release(pDI);
}
+#define check_member_( file, line, val, exp, fmt, member ) \
+ ok_( file, line )((val).member == (exp).member, "got " #member " " fmt ", expected " fmt "\n", \
+ (val).member, (exp).member)
+#define check_member( val, exp, fmt, member ) \
+ check_member_( __FILE__, __LINE__, val, exp, fmt, member )
+
+#define check_member_guid_( file, line, val, exp, member ) \
+ ok_( file, line )(IsEqualGUID( &(val).member, &(exp).member ), "got " #member " %s, expected %s\n", \
+ debugstr_guid( &(val).member ), debugstr_guid( &(exp).member ))
+#define check_member_guid( val, exp, member ) \
+ check_member_guid_( __FILE__, __LINE__, val, exp, member )
+
+#define check_member_wstr_( file, line, val, exp, member ) \
+ ok_( file, line )(!wcscmp( (val).member, (exp).member ), "got " #member " %s, expected %s\n", \
+ debugstr_w((val).member), debugstr_w((exp).member))
+#define check_member_wstr( val, exp, member ) \
+ check_member_wstr_( __FILE__, __LINE__, val, exp, member )
+
+struct check_objects_todos
+{
+ BOOL offset;
+ BOOL type;
+ BOOL name;
+};
+
+struct check_objects_params
+{
+ UINT index;
+ UINT stop_count;
+ UINT expect_count;
+ const DIDEVICEOBJECTINSTANCEW *expect_objs;
+ const struct check_objects_todos *todo_objs;
+ BOOL todo_extra;
+};
+
+static BOOL CALLBACK check_objects( const DIDEVICEOBJECTINSTANCEW *obj, void *args )
+{
+ struct check_objects_params *params = args;
+ const DIDEVICEOBJECTINSTANCEW *exp = params->expect_objs + params->index;
+ const struct check_objects_todos *todo = params->todo_objs + params->index;
+
+ todo_wine_if( params->todo_extra && params->index >= params->expect_count )
+ ok( params->index < params->expect_count, "unexpected extra object\n" );
+ if (params->index >= params->expect_count) return DIENUM_CONTINUE;
+
+ winetest_push_context( "obj[%d]", params->index );
+
+ todo_wine
+ check_member( *obj, *exp, "%u", dwSize );
+ check_member_guid( *obj, *exp, guidType );
+ todo_wine_if( todo->offset )
+ check_member( *obj, *exp, "%#x", dwOfs );
+ todo_wine_if( todo->type )
+ check_member( *obj, *exp, "%#x", dwType );
+ 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 );
+ check_member( *obj, *exp, "%#04x", wUsagePage );
+ check_member( *obj, *exp, "%#04x", wUsage );
+ check_member( *obj, *exp, "%#04x", dwDimension );
+ check_member( *obj, *exp, "%#04x", wExponent );
+ check_member( *obj, *exp, "%u", wReportId );
+
+ winetest_pop_context();
+
+ params->index++;
+ if (params->stop_count && params->index == params->stop_count) return DIENUM_STOP;
+ return DIENUM_CONTINUE;
+}
+
+static BOOL CALLBACK check_object_count( const DIDEVICEOBJECTINSTANCEW *obj, void *args )
+{
+ DWORD *count = args;
+ *count = *count + 1;
+ return DIENUM_CONTINUE;
+}
+
+static void test_mouse_info(void)
+{
+ static const DIDEVCAPS expect_caps =
+ {
+ .dwSize = sizeof(DIDEVCAPS),
+ .dwFlags = DIDC_ATTACHED | DIDC_EMULATED,
+ .dwDevType = (DI8DEVTYPEMOUSE_UNKNOWN << 8) | DI8DEVTYPE_MOUSE,
+ .dwAxes = 3,
+ .dwButtons = 5,
+ };
+ const DIDEVICEINSTANCEW expect_devinst =
+ {
+ .dwSize = sizeof(DIDEVICEINSTANCEW),
+ .guidInstance = GUID_SysMouse,
+ .guidProduct = GUID_SysMouse,
+ .dwDevType = (DI8DEVTYPEMOUSE_UNKNOWN << 8) | DI8DEVTYPE_MOUSE,
+ .tszInstanceName = L"Mouse",
+ .tszProductName = L"Mouse",
+ .guidFFDriver = GUID_NULL,
+ };
+ const DIDEVICEOBJECTINSTANCEW expect_objects[] =
+ {
+ {
+ .dwSize = sizeof(DIDEVICEOBJECTINSTANCEW),
+ .guidType = GUID_XAxis,
+ .dwOfs = 0x0,
+ .dwType = DIDFT_RELAXIS|DIDFT_MAKEINSTANCE(0),
+ .dwFlags = DIDOI_ASPECTPOSITION,
+ .tszName = L"X-axis",
+ },
+ {
+ .dwSize = sizeof(DIDEVICEOBJECTINSTANCEW),
+ .guidType = GUID_YAxis,
+ .dwOfs = 0x4,
+ .dwType = DIDFT_RELAXIS|DIDFT_MAKEINSTANCE(1),
+ .dwFlags = DIDOI_ASPECTPOSITION,
+ .tszName = L"Y-axis",
+ },
+ {
+ .dwSize = sizeof(DIDEVICEOBJECTINSTANCEW),
+ .guidType = GUID_ZAxis,
+ .dwOfs = 0x8,
+ .dwType = DIDFT_RELAXIS|DIDFT_MAKEINSTANCE(2),
+ .dwFlags = DIDOI_ASPECTPOSITION,
+ .tszName = L"Wheel",
+ },
+ {
+ .dwSize = sizeof(DIDEVICEOBJECTINSTANCEW),
+ .guidType = GUID_Button,
+ .dwOfs = 0xc,
+ .dwType = DIDFT_PSHBUTTON|DIDFT_MAKEINSTANCE(3),
+ .tszName = L"Button 0",
+ },
+ {
+ .dwSize = sizeof(DIDEVICEOBJECTINSTANCEW),
+ .guidType = GUID_Button,
+ .dwOfs = 0xd,
+ .dwType = DIDFT_PSHBUTTON|DIDFT_MAKEINSTANCE(4),
+ .tszName = L"Button 1",
+ },
+ {
+ .dwSize = sizeof(DIDEVICEOBJECTINSTANCEW),
+ .guidType = GUID_Button,
+ .dwOfs = 0xe,
+ .dwType = DIDFT_PSHBUTTON|DIDFT_MAKEINSTANCE(5),
+ .tszName = L"Button 2",
+ },
+ {
+ .dwSize = sizeof(DIDEVICEOBJECTINSTANCEW),
+ .guidType = GUID_Button,
+ .dwOfs = 0xf,
+ .dwType = DIDFT_PSHBUTTON|DIDFT_MAKEINSTANCE(6),
+ .tszName = L"Button 3",
+ },
+ {
+ .dwSize = sizeof(DIDEVICEOBJECTINSTANCEW),
+ .guidType = GUID_Button,
+ .dwOfs = 0x10,
+ .dwType = DIDFT_PSHBUTTON|DIDFT_MAKEINSTANCE(7),
+ .tszName = L"Button 4",
+ },
+ };
+ struct check_objects_todos todo_objects[ARRAY_SIZE(expect_objects)] =
+ {
+ {.name = TRUE},
+ {.name = TRUE},
+ };
+ struct check_objects_params check_objects_params =
+ {
+ .expect_count = ARRAY_SIZE(expect_objects),
+ .expect_objs = expect_objects,
+ .todo_objs = todo_objects,
+ .todo_extra = TRUE,
+ };
+ DIPROPGUIDANDPATH prop_guid_path =
+ {
+ .diph =
+ {
+ .dwSize = sizeof(DIPROPGUIDANDPATH),
+ .dwHeaderSize = sizeof(DIPROPHEADER),
+ .dwHow = DIPH_DEVICE,
+ },
+ };
+ DIPROPSTRING prop_string =
+ {
+ .diph =
+ {
+ .dwSize = sizeof(DIPROPSTRING),
+ .dwHeaderSize = sizeof(DIPROPHEADER),
+ .dwHow = DIPH_DEVICE,
+ },
+ };
+ DIPROPDWORD prop_dword =
+ {
+ .diph =
+ {
+ .dwSize = sizeof(DIPROPDWORD),
+ .dwHeaderSize = sizeof(DIPROPHEADER),
+ .dwHow = DIPH_DEVICE,
+ },
+ };
+ DIPROPRANGE prop_range =
+ {
+ .diph =
+ {
+ .dwSize = sizeof(DIPROPRANGE),
+ .dwHeaderSize = sizeof(DIPROPHEADER),
+ .dwHow = DIPH_DEVICE,
+ },
+ };
+ DIDEVICEOBJECTINSTANCEW objinst = {0};
+ DIDEVICEINSTANCEW devinst = {0};
+ IDirectInputDevice8W *device;
+ DIDEVCAPS caps = {0};
+ IDirectInput8W *di;
+ ULONG res, ref;
+ HRESULT hr;
+ GUID guid;
+
+ localized = LOWORD( GetKeyboardLayout( 0 ) ) != 0x0409;
+
+ hr = DirectInput8Create( instance, DIRECTINPUT_VERSION, &IID_IDirectInput8W, (void **)&di, NULL );
+ ok( hr == DI_OK, "DirectInput8Create returned %#x\n", hr );
+ hr = IDirectInput8_CreateDevice( di, &GUID_SysMouse, &device, NULL );
+ ok( hr == DI_OK, "CreateDevice returned %#x\n", hr );
+
+ hr = IDirectInputDevice8_Initialize( device, instance, DIRECTINPUT_VERSION, &GUID_SysMouseEm );
+ ok( hr == DI_OK, "Initialize returned %#x\n", hr );
+ guid = GUID_SysMouseEm;
+ memset( &devinst, 0, sizeof(devinst) );
+ devinst.dwSize = sizeof(DIDEVICEINSTANCEW);
+ hr = IDirectInputDevice8_GetDeviceInfo( device, &devinst );
+ ok( hr == DI_OK, "GetDeviceInfo returned %#x\n", hr );
+ ok( IsEqualGUID( &guid, &GUID_SysMouseEm ), "got %s expected %s\n", debugstr_guid( &guid ),
+ debugstr_guid( &GUID_SysMouseEm ) );
+
+ hr = IDirectInputDevice8_Initialize( device, instance, DIRECTINPUT_VERSION, &GUID_SysMouse );
+ ok( hr == DI_OK, "Initialize returned %#x\n", hr );
+
+ memset( &devinst, 0, sizeof(devinst) );
+ devinst.dwSize = sizeof(DIDEVICEINSTANCEW);
+ hr = IDirectInputDevice8_GetDeviceInfo( device, &devinst );
+ ok( hr == DI_OK, "GetDeviceInfo returned %#x\n", hr );
+ check_member( devinst, expect_devinst, "%d", dwSize );
+ check_member_guid( devinst, expect_devinst, guidInstance );
+ check_member_guid( devinst, expect_devinst, guidProduct );
+ todo_wine
+ check_member( devinst, expect_devinst, "%#x", dwDevType );
+ if (!localized) check_member_wstr( devinst, expect_devinst, tszInstanceName );
+ if (!localized) todo_wine check_member_wstr( devinst, expect_devinst, tszProductName );
+ check_member_guid( devinst, expect_devinst, guidFFDriver );
+ check_member( devinst, expect_devinst, "%04x", wUsagePage );
+ check_member( devinst, expect_devinst, "%04x", wUsage );
+
+ caps.dwSize = sizeof(DIDEVCAPS);
+ hr = IDirectInputDevice8_GetCapabilities( device, &caps );
+ 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
+ check_member( caps, expect_caps, "%#x", dwDevType );
+ check_member( caps, expect_caps, "%d", dwAxes );
+ todo_wine
+ check_member( caps, expect_caps, "%d", dwButtons );
+ check_member( caps, expect_caps, "%d", dwPOVs );
+ check_member( caps, expect_caps, "%d", dwFFSamplePeriod );
+ check_member( caps, expect_caps, "%d", dwFFMinTimeResolution );
+ todo_wine
+ check_member( caps, expect_caps, "%d", dwFirmwareRevision );
+ todo_wine
+ check_member( caps, expect_caps, "%d", dwHardwareRevision );
+ check_member( caps, expect_caps, "%d", dwFFDriverVersion );
+
+ prop_dword.diph.dwHow = DIPH_BYOFFSET;
+ prop_dword.diph.dwObj = DIMOFS_X;
+ hr = IDirectInputDevice8_GetProperty( device, DIPROP_GRANULARITY, &prop_dword.diph );
+ todo_wine
+ ok( hr == DIERR_NOTFOUND, "GetProperty DIPROP_GRANULARITY returned %#x\n", hr );
+ hr = IDirectInputDevice8_GetProperty( device, DIPROP_DEADZONE, &prop_dword.diph );
+ todo_wine
+ ok( hr == DIERR_NOTFOUND, "GetProperty DIPROP_DEADZONE returned %#x\n", hr );
+ hr = IDirectInputDevice8_GetProperty( device, DIPROP_SATURATION, &prop_dword.diph );
+ todo_wine
+ ok( hr == DIERR_NOTFOUND, "GetProperty DIPROP_SATURATION returned %#x\n", hr );
+ prop_range.diph.dwHow = DIPH_BYOFFSET;
+ prop_range.diph.dwObj = DIMOFS_X;
+ hr = IDirectInputDevice8_GetProperty( device, DIPROP_RANGE, &prop_range.diph );
+ todo_wine
+ ok( hr == DIERR_NOTFOUND, "GetProperty DIPROP_RANGE returned %#x\n", hr );
+
+ prop_dword.diph.dwHow = DIPH_DEVICE;
+ prop_dword.diph.dwObj = 0;
+ prop_dword.dwData = 0xdeadbeef;
+ hr = IDirectInputDevice8_GetProperty( device, DIPROP_AXISMODE, &prop_dword.diph );
+ todo_wine
+ ok( hr == DI_OK, "GetProperty DIPROP_AXISMODE returned %#x\n", hr );
+ todo_wine
+ ok( prop_dword.dwData == DIPROPAXISMODE_ABS, "got %u expected %u\n", prop_dword.dwData, DIPROPAXISMODE_ABS );
+ prop_dword.dwData = 0xdeadbeef;
+ hr = IDirectInputDevice8_GetProperty( device, DIPROP_BUFFERSIZE, &prop_dword.diph );
+ ok( hr == DI_OK, "GetProperty DIPROP_BUFFERSIZE returned %#x\n", hr );
+ ok( prop_dword.dwData == 0, "got %#x expected %#x\n", prop_dword.dwData, 0 );
+ prop_dword.dwData = 0xdeadbeef;
+ hr = IDirectInputDevice8_GetProperty( device, DIPROP_FFGAIN, &prop_dword.diph );
+ todo_wine
+ ok( hr == DI_OK, "GetProperty DIPROP_FFGAIN returned %#x\n", hr );
+ todo_wine
+ ok( prop_dword.dwData == 10000, "got %u expected %u\n", prop_dword.dwData, 10000 );
+
+ hr = IDirectInputDevice8_SetDataFormat( device, &c_dfDIMouse2 );
+ ok( hr == DI_OK, "SetDataFormat returned %#x\n", hr );
+
+ prop_dword.diph.dwHow = DIPH_DEVICE;
+ prop_dword.diph.dwObj = 0;
+ prop_dword.dwData = 0xdeadbeef;
+ hr = IDirectInputDevice8_GetProperty( device, DIPROP_AXISMODE, &prop_dword.diph );
+ todo_wine
+ ok( hr == DI_OK, "GetProperty DIPROP_AXISMODE returned %#x\n", hr );
+ todo_wine
+ ok( prop_dword.dwData == DIPROPAXISMODE_REL, "got %u expected %u\n", prop_dword.dwData, DIPROPAXISMODE_ABS );
+
+ prop_dword.dwData = 0xdeadbeef;
+ hr = IDirectInputDevice8_GetProperty( device, DIPROP_VIDPID, &prop_dword.diph );
+ ok( hr == DIERR_UNSUPPORTED, "GetProperty DIPROP_VIDPID returned %#x\n", hr );
+ hr = IDirectInputDevice8_GetProperty( device, DIPROP_GUIDANDPATH, &prop_guid_path.diph );
+ todo_wine
+ ok( hr == DIERR_UNSUPPORTED, "GetProperty DIPROP_GUIDANDPATH returned %#x\n", hr );
+ hr = IDirectInputDevice8_GetProperty( device, DIPROP_INSTANCENAME, &prop_string.diph );
+ todo_wine
+ ok( hr == DIERR_UNSUPPORTED, "GetProperty DIPROP_INSTANCENAME returned %#x\n", hr );
+ hr = IDirectInputDevice8_GetProperty( device, DIPROP_PRODUCTNAME, &prop_string.diph );
+ todo_wine
+ ok( hr == DIERR_UNSUPPORTED, "GetProperty DIPROP_PRODUCTNAME returned %#x\n", hr );
+ hr = IDirectInputDevice8_GetProperty( device, DIPROP_TYPENAME, &prop_string.diph );
+ todo_wine
+ ok( hr == DIERR_UNSUPPORTED, "GetProperty DIPROP_TYPENAME returned %#x\n", hr );
+ hr = IDirectInputDevice8_GetProperty( device, DIPROP_USERNAME, &prop_string.diph );
+ ok( hr == S_FALSE, "GetProperty DIPROP_USERNAME returned %#x\n", hr );
+ ok( !wcscmp( prop_string.wsz, L"" ), "got user %s\n", debugstr_w(prop_string.wsz) );
+
+ hr = IDirectInputDevice8_GetProperty( device, DIPROP_JOYSTICKID, &prop_dword.diph );
+ todo_wine
+ ok( hr == DIERR_UNSUPPORTED, "GetProperty DIPROP_VIDPID returned %#x\n", hr );
+
+ hr = IDirectInputDevice8_GetProperty( device, DIPROP_CALIBRATION, &prop_dword.diph );
+ ok( hr == DIERR_INVALIDPARAM, "GetProperty DIPROP_CALIBRATION returned %#x\n", hr );
+ hr = IDirectInputDevice8_GetProperty( device, DIPROP_AUTOCENTER, &prop_dword.diph );
+ todo_wine
+ ok( hr == DIERR_UNSUPPORTED, "GetProperty DIPROP_AUTOCENTER returned %#x\n", hr );
+ hr = IDirectInputDevice8_GetProperty( device, DIPROP_DEADZONE, &prop_dword.diph );
+ todo_wine
+ ok( hr == DIERR_UNSUPPORTED, "GetProperty DIPROP_DEADZONE returned %#x\n", hr );
+ hr = IDirectInputDevice8_GetProperty( device, DIPROP_FFLOAD, &prop_dword.diph );
+ todo_wine
+ ok( hr == DIERR_UNSUPPORTED, "GetProperty DIPROP_FFLOAD returned %#x\n", hr );
+ hr = IDirectInputDevice8_GetProperty( device, DIPROP_GRANULARITY, &prop_dword.diph );
+ todo_wine
+ ok( hr == DIERR_UNSUPPORTED, "GetProperty DIPROP_GRANULARITY returned %#x\n", hr );
+
+ prop_dword.diph.dwHow = DIPH_BYUSAGE;
+ prop_dword.diph.dwObj = MAKELONG( HID_USAGE_GENERIC_X, HID_USAGE_PAGE_GENERIC );
+ hr = IDirectInputDevice8_GetProperty( device, DIPROP_GRANULARITY, &prop_dword.diph );
+ todo_wine
+ ok( hr == DIERR_UNSUPPORTED, "GetProperty DIPROP_GRANULARITY returned %#x\n", hr );
+
+ prop_dword.diph.dwHow = DIPH_BYOFFSET;
+ prop_dword.diph.dwObj = DIMOFS_X;
+ prop_dword.dwData = 0xdeadbeef;
+ hr = IDirectInputDevice8_GetProperty( device, DIPROP_GRANULARITY, &prop_dword.diph );
+ ok( hr == DI_OK, "GetProperty DIPROP_GRANULARITY returned %#x\n", hr );
+ ok( prop_dword.dwData == 1, "got %d expected 1\n", prop_dword.dwData );
+ hr = IDirectInputDevice8_GetProperty( device, DIPROP_DEADZONE, &prop_dword.diph );
+ todo_wine
+ ok( hr == DIERR_UNSUPPORTED, "GetProperty DIPROP_DEADZONE returned %#x\n", hr );
+ hr = IDirectInputDevice8_GetProperty( device, DIPROP_SATURATION, &prop_dword.diph );
+ todo_wine
+ ok( hr == DIERR_UNSUPPORTED, "GetProperty DIPROP_SATURATION returned %#x\n", hr );
+ prop_range.lMin = 0xdeadbeef;
+ prop_range.lMax = 0xdeadbeef;
+ hr = IDirectInputDevice8_GetProperty( device, DIPROP_RANGE, &prop_range.diph );
+ ok( hr == DI_OK, "GetProperty DIPROP_RANGE returned %#x\n", hr );
+ todo_wine
+ ok( prop_range.lMin == DIPROPRANGE_NOMIN, "got %d expected %d\n", prop_range.lMin, DIPROPRANGE_NOMIN );
+ todo_wine
+ ok( prop_range.lMax == DIPROPRANGE_NOMAX, "got %d expected %d\n", prop_range.lMax, DIPROPRANGE_NOMAX );
+
+ res = 0;
+ hr = IDirectInputDevice8_EnumObjects( device, check_object_count, &res, DIDFT_AXIS | DIDFT_PSHBUTTON );
+ ok( hr == DI_OK, "EnumObjects returned %#x\n", hr );
+ todo_wine
+ ok( res == 8, "got %u expected %u\n", res, 8 );
+ 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",
+ check_objects_params.expect_count - check_objects_params.index );
+
+ objinst.dwSize = sizeof(DIDEVICEOBJECTINSTANCEW);
+ res = MAKELONG( HID_USAGE_GENERIC_X, HID_USAGE_PAGE_GENERIC );
+ hr = IDirectInputDevice8_GetObjectInfo( device, &objinst, res, DIPH_BYUSAGE );
+ todo_wine
+ ok( hr == DIERR_UNSUPPORTED, "GetObjectInfo returned: %#x\n", hr );
+
+ hr = IDirectInputDevice8_GetObjectInfo( device, &objinst, DIMOFS_Y, DIPH_BYOFFSET );
+ ok( hr == DI_OK, "GetObjectInfo returned: %#x\n", hr );
+
+ check_member( objinst, expect_objects[1], "%u", dwSize );
+ check_member_guid( objinst, expect_objects[1], guidType );
+ check_member( objinst, expect_objects[1], "%#x", dwOfs );
+ check_member( objinst, expect_objects[1], "%#x", dwType );
+ check_member( objinst, expect_objects[1], "%#x", dwFlags );
+ if (!localized) todo_wine check_member_wstr( objinst, expect_objects[1], tszName );
+ check_member( objinst, expect_objects[1], "%u", dwFFMaxForce );
+ check_member( objinst, expect_objects[1], "%u", dwFFForceResolution );
+ check_member( objinst, expect_objects[1], "%u", wCollectionNumber );
+ check_member( objinst, expect_objects[1], "%u", wDesignatorIndex );
+ check_member( objinst, expect_objects[1], "%#04x", wUsagePage );
+ check_member( objinst, expect_objects[1], "%#04x", wUsage );
+ check_member( objinst, expect_objects[1], "%#04x", dwDimension );
+ check_member( objinst, expect_objects[1], "%#04x", wExponent );
+ check_member( objinst, expect_objects[1], "%u", wReportId );
+
+ hr = IDirectInputDevice8_GetObjectInfo( device, &objinst, 7, DIPH_BYOFFSET );
+ ok( hr == DIERR_NOTFOUND, "GetObjectInfo returned: %#x\n", hr );
+ res = DIDFT_TGLBUTTON | DIDFT_MAKEINSTANCE( 3 );
+ hr = IDirectInputDevice8_GetObjectInfo( device, &objinst, res, DIPH_BYID );
+ ok( hr == DIERR_NOTFOUND, "GetObjectInfo returned: %#x\n", hr );
+ res = DIDFT_PSHBUTTON | DIDFT_MAKEINSTANCE( 3 );
+ hr = IDirectInputDevice8_GetObjectInfo( device, &objinst, res, DIPH_BYID );
+ 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 );
+
+ ref = IDirectInputDevice8_Release( device );
+ ok( ref == 0, "Release returned %d\n", ref );
+
+ ref = IDirectInput8_Release( di );
+ ok( ref == 0, "Release returned %d\n", ref );
+}
+
+static void test_keyboard_info(void)
+{
+ static const DIDEVCAPS expect_caps =
+ {
+ .dwSize = sizeof(DIDEVCAPS),
+ .dwFlags = DIDC_ATTACHED | DIDC_EMULATED,
+ .dwDevType = (DI8DEVTYPEKEYBOARD_PCENH << 8) | DI8DEVTYPE_KEYBOARD,
+ .dwButtons = 128,
+ };
+ const DIDEVICEINSTANCEW expect_devinst =
+ {
+ .dwSize = sizeof(DIDEVICEINSTANCEW),
+ .guidInstance = GUID_SysKeyboard,
+ .guidProduct = GUID_SysKeyboard,
+ .dwDevType = (DI8DEVTYPEKEYBOARD_PCENH << 8) | DI8DEVTYPE_KEYBOARD,
+ .tszInstanceName = L"Keyboard",
+ .tszProductName = L"Keyboard",
+ .guidFFDriver = GUID_NULL,
+ };
+
+ DIDEVICEOBJECTINSTANCEW expect_objects[] =
+ {
+ {
+ .dwSize = sizeof(DIDEVICEOBJECTINSTANCEW),
+ .guidType = GUID_Key,
+ .dwOfs = DIK_ESCAPE,
+ .dwType = DIDFT_PSHBUTTON|DIDFT_MAKEINSTANCE(DIK_ESCAPE),
+ .tszName = L"Esc",
+ },
+ {
+ .dwSize = sizeof(DIDEVICEOBJECTINSTANCEW),
+ .guidType = GUID_Key,
+ .dwOfs = DIK_1,
+ .dwType = DIDFT_PSHBUTTON|DIDFT_MAKEINSTANCE(DIK_1),
+ .tszName = L"1",
+ },
+ {
+ .dwSize = sizeof(DIDEVICEOBJECTINSTANCEW),
+ .guidType = GUID_Key,
+ .dwOfs = DIK_2,
+ .dwType = DIDFT_PSHBUTTON|DIDFT_MAKEINSTANCE(DIK_2),
+ .tszName = L"2",
+ },
+ {
+ .dwSize = sizeof(DIDEVICEOBJECTINSTANCEW),
+ .guidType = GUID_Key,
+ .dwOfs = DIK_3,
+ .dwType = DIDFT_PSHBUTTON|DIDFT_MAKEINSTANCE(DIK_3),
+ .tszName = L"3",
+ },
+ {
+ .dwSize = sizeof(DIDEVICEOBJECTINSTANCEW),
+ .guidType = GUID_Key,
+ .dwOfs = DIK_4,
+ .dwType = DIDFT_PSHBUTTON|DIDFT_MAKEINSTANCE(DIK_4),
+ .tszName = L"4",
+ },
+ };
+ struct check_objects_todos todo_objects[ARRAY_SIZE(expect_objects)] = {{0}};
+ struct check_objects_params check_objects_params =
+ {
+ .stop_count = ARRAY_SIZE(expect_objects),
+ .expect_count = ARRAY_SIZE(expect_objects),
+ .expect_objs = expect_objects,
+ .todo_objs = todo_objects,
+ };
+ DIPROPGUIDANDPATH prop_guid_path =
+ {
+ .diph =
+ {
+ .dwSize = sizeof(DIPROPGUIDANDPATH),
+ .dwHeaderSize = sizeof(DIPROPHEADER),
+ .dwHow = DIPH_DEVICE,
+ },
+ };
+ DIPROPSTRING prop_string =
+ {
+ .diph =
+ {
+ .dwSize = sizeof(DIPROPSTRING),
+ .dwHeaderSize = sizeof(DIPROPHEADER),
+ .dwHow = DIPH_DEVICE,
+ },
+ };
+ DIPROPDWORD prop_dword =
+ {
+ .diph =
+ {
+ .dwSize = sizeof(DIPROPDWORD),
+ .dwHeaderSize = sizeof(DIPROPHEADER),
+ .dwHow = DIPH_DEVICE,
+ },
+ };
+ DIPROPRANGE prop_range =
+ {
+ .diph =
+ {
+ .dwSize = sizeof(DIPROPRANGE),
+ .dwHeaderSize = sizeof(DIPROPHEADER),
+ .dwHow = DIPH_DEVICE,
+ },
+ };
+ DIDEVICEOBJECTINSTANCEW objinst = {0};
+ DIDEVICEINSTANCEW devinst = {0};
+ IDirectInputDevice8W *device;
+ DIDEVCAPS caps = {0};
+ IDirectInput8W *di;
+ ULONG res, ref;
+ HRESULT hr;
+ GUID guid;
+
+ localized = TRUE; /* Skip name tests, Wine sometimes succeeds depending on the host key names */
+
+ hr = DirectInput8Create( instance, DIRECTINPUT_VERSION, &IID_IDirectInput8W, (void **)&di, NULL );
+ ok( hr == DI_OK, "DirectInput8Create returned %#x\n", hr );
+ hr = IDirectInput8_CreateDevice( di, &GUID_SysKeyboard, &device, NULL );
+ ok( hr == DI_OK, "CreateDevice returned %#x\n", hr );
+
+ hr = IDirectInputDevice8_Initialize( device, instance, DIRECTINPUT_VERSION, &GUID_SysKeyboardEm );
+ ok( hr == DI_OK, "Initialize returned %#x\n", hr );
+ guid = GUID_SysKeyboardEm;
+ memset( &devinst, 0, sizeof(devinst) );
+ devinst.dwSize = sizeof(DIDEVICEINSTANCEW);
+ hr = IDirectInputDevice8_GetDeviceInfo( device, &devinst );
+ ok( hr == DI_OK, "GetDeviceInfo returned %#x\n", hr );
+ ok( IsEqualGUID( &guid, &GUID_SysKeyboardEm ), "got %s expected %s\n", debugstr_guid( &guid ),
+ debugstr_guid( &GUID_SysKeyboardEm ) );
+
+ hr = IDirectInputDevice8_Initialize( device, instance, DIRECTINPUT_VERSION, &GUID_SysKeyboard );
+ ok( hr == DI_OK, "Initialize returned %#x\n", hr );
+
+ memset( &devinst, 0, sizeof(devinst) );
+ devinst.dwSize = sizeof(DIDEVICEINSTANCEW);
+ hr = IDirectInputDevice8_GetDeviceInfo( device, &devinst );
+ ok( hr == DI_OK, "GetDeviceInfo returned %#x\n", hr );
+ check_member( devinst, expect_devinst, "%d", dwSize );
+ check_member_guid( devinst, expect_devinst, guidInstance );
+ check_member_guid( devinst, expect_devinst, guidProduct );
+ check_member( devinst, expect_devinst, "%#x", dwDevType );
+ if (!localized) check_member_wstr( devinst, expect_devinst, tszInstanceName );
+ if (!localized) todo_wine check_member_wstr( devinst, expect_devinst, tszProductName );
+ check_member_guid( devinst, expect_devinst, guidFFDriver );
+ check_member( devinst, expect_devinst, "%04x", wUsagePage );
+ check_member( devinst, expect_devinst, "%04x", wUsage );
+
+ caps.dwSize = sizeof(DIDEVCAPS);
+ hr = IDirectInputDevice8_GetCapabilities( device, &caps );
+ ok( hr == DI_OK, "GetCapabilities returned %#x\n", hr );
+ check_member( caps, expect_caps, "%d", dwSize );
+ check_member( caps, expect_caps, "%#x", dwFlags );
+ check_member( caps, expect_caps, "%#x", dwDevType );
+ check_member( caps, expect_caps, "%d", dwAxes );
+ todo_wine
+ check_member( caps, expect_caps, "%d", dwButtons );
+ check_member( caps, expect_caps, "%d", dwPOVs );
+ check_member( caps, expect_caps, "%d", dwFFSamplePeriod );
+ check_member( caps, expect_caps, "%d", dwFFMinTimeResolution );
+ todo_wine
+ check_member( caps, expect_caps, "%d", dwFirmwareRevision );
+ todo_wine
+ check_member( caps, expect_caps, "%d", dwHardwareRevision );
+ check_member( caps, expect_caps, "%d", dwFFDriverVersion );
+
+ prop_dword.diph.dwHow = DIPH_BYOFFSET;
+ prop_dword.diph.dwObj = 1;
+ hr = IDirectInputDevice8_GetProperty( device, DIPROP_GRANULARITY, &prop_dword.diph );
+ todo_wine
+ ok( hr == DIERR_NOTFOUND, "GetProperty DIPROP_GRANULARITY returned %#x\n", hr );
+ hr = IDirectInputDevice8_GetProperty( device, DIPROP_DEADZONE, &prop_dword.diph );
+ todo_wine
+ ok( hr == DIERR_NOTFOUND, "GetProperty DIPROP_DEADZONE returned %#x\n", hr );
+ hr = IDirectInputDevice8_GetProperty( device, DIPROP_SATURATION, &prop_dword.diph );
+ todo_wine
+ ok( hr == DIERR_NOTFOUND, "GetProperty DIPROP_SATURATION returned %#x\n", hr );
+ prop_range.diph.dwHow = DIPH_BYOFFSET;
+ prop_range.diph.dwObj = 1;
+ hr = IDirectInputDevice8_GetProperty( device, DIPROP_RANGE, &prop_range.diph );
+ todo_wine
+ ok( hr == DIERR_NOTFOUND, "GetProperty DIPROP_RANGE returned %#x\n", hr );
+
+ prop_dword.diph.dwHow = DIPH_DEVICE;
+ prop_dword.diph.dwObj = 0;
+ prop_dword.dwData = 0xdeadbeef;
+ hr = IDirectInputDevice8_GetProperty( device, DIPROP_AXISMODE, &prop_dword.diph );
+ todo_wine
+ ok( hr == DI_OK, "GetProperty DIPROP_AXISMODE returned %#x\n", hr );
+ todo_wine
+ ok( prop_dword.dwData == DIPROPAXISMODE_ABS, "got %u expected %u\n", prop_dword.dwData, DIPROPAXISMODE_ABS );
+ prop_dword.dwData = 0xdeadbeef;
+ hr = IDirectInputDevice8_GetProperty( device, DIPROP_BUFFERSIZE, &prop_dword.diph );
+ ok( hr == DI_OK, "GetProperty DIPROP_BUFFERSIZE returned %#x\n", hr );
+ ok( prop_dword.dwData == 0, "got %#x expected %#x\n", prop_dword.dwData, 0 );
+ prop_dword.dwData = 0xdeadbeef;
+ hr = IDirectInputDevice8_GetProperty( device, DIPROP_FFGAIN, &prop_dword.diph );
+ todo_wine
+ ok( hr == DI_OK, "GetProperty DIPROP_FFGAIN returned %#x\n", hr );
+ todo_wine
+ ok( prop_dword.dwData == 10000, "got %u expected %u\n", prop_dword.dwData, 10000 );
+
+ hr = IDirectInputDevice8_SetDataFormat( device, &c_dfDIKeyboard );
+ ok( hr == DI_OK, "SetDataFormat returned %#x\n", hr );
+
+ prop_dword.diph.dwHow = DIPH_DEVICE;
+ prop_dword.diph.dwObj = 0;
+ prop_dword.dwData = 0xdeadbeef;
+ hr = IDirectInputDevice8_GetProperty( device, DIPROP_AXISMODE, &prop_dword.diph );
+ todo_wine
+ ok( hr == DI_OK, "GetProperty DIPROP_AXISMODE returned %#x\n", hr );
+ todo_wine
+ ok( prop_dword.dwData == DIPROPAXISMODE_REL, "got %u expected %u\n", prop_dword.dwData, DIPROPAXISMODE_ABS );
+
+ prop_dword.dwData = 0xdeadbeef;
+ hr = IDirectInputDevice8_GetProperty( device, DIPROP_VIDPID, &prop_dword.diph );
+ ok( hr == DIERR_UNSUPPORTED, "GetProperty DIPROP_VIDPID returned %#x\n", hr );
+ hr = IDirectInputDevice8_GetProperty( device, DIPROP_GUIDANDPATH, &prop_guid_path.diph );
+ todo_wine
+ ok( hr == DIERR_UNSUPPORTED, "GetProperty DIPROP_GUIDANDPATH returned %#x\n", hr );
+ hr = IDirectInputDevice8_GetProperty( device, DIPROP_INSTANCENAME, &prop_string.diph );
+ todo_wine
+ ok( hr == DIERR_UNSUPPORTED, "GetProperty DIPROP_INSTANCENAME returned %#x\n", hr );
+ hr = IDirectInputDevice8_GetProperty( device, DIPROP_PRODUCTNAME, &prop_string.diph );
+ todo_wine
+ ok( hr == DIERR_UNSUPPORTED, "GetProperty DIPROP_PRODUCTNAME returned %#x\n", hr );
+ hr = IDirectInputDevice8_GetProperty( device, DIPROP_TYPENAME, &prop_string.diph );
+ todo_wine
+ ok( hr == DIERR_UNSUPPORTED, "GetProperty DIPROP_TYPENAME returned %#x\n", hr );
+ hr = IDirectInputDevice8_GetProperty( device, DIPROP_USERNAME, &prop_string.diph );
+ ok( hr == S_FALSE, "GetProperty DIPROP_USERNAME returned %#x\n", hr );
+ ok( !wcscmp( prop_string.wsz, L"" ), "got user %s\n", debugstr_w(prop_string.wsz) );
+
+ hr = IDirectInputDevice8_GetProperty( device, DIPROP_JOYSTICKID, &prop_dword.diph );
+ todo_wine
+ ok( hr == DIERR_UNSUPPORTED, "GetProperty DIPROP_VIDPID returned %#x\n", hr );
+
+ hr = IDirectInputDevice8_GetProperty( device, DIPROP_CALIBRATION, &prop_dword.diph );
+ ok( hr == DIERR_INVALIDPARAM, "GetProperty DIPROP_CALIBRATION returned %#x\n", hr );
+ hr = IDirectInputDevice8_GetProperty( device, DIPROP_AUTOCENTER, &prop_dword.diph );
+ todo_wine
+ ok( hr == DIERR_UNSUPPORTED, "GetProperty DIPROP_AUTOCENTER returned %#x\n", hr );
+ hr = IDirectInputDevice8_GetProperty( device, DIPROP_DEADZONE, &prop_dword.diph );
+ todo_wine
+ ok( hr == DIERR_UNSUPPORTED, "GetProperty DIPROP_DEADZONE returned %#x\n", hr );
+ hr = IDirectInputDevice8_GetProperty( device, DIPROP_FFLOAD, &prop_dword.diph );
+ todo_wine
+ ok( hr == DIERR_UNSUPPORTED, "GetProperty DIPROP_FFLOAD returned %#x\n", hr );
+ hr = IDirectInputDevice8_GetProperty( device, DIPROP_GRANULARITY, &prop_dword.diph );
+ todo_wine
+ ok( hr == DIERR_UNSUPPORTED, "GetProperty DIPROP_GRANULARITY returned %#x\n", hr );
+
+ prop_dword.diph.dwHow = DIPH_BYUSAGE;
+ prop_dword.diph.dwObj = MAKELONG( HID_USAGE_KEYBOARD_LCTRL, HID_USAGE_PAGE_KEYBOARD );
+ hr = IDirectInputDevice8_GetProperty( device, DIPROP_GRANULARITY, &prop_dword.diph );
+ todo_wine
+ ok( hr == DIERR_UNSUPPORTED, "GetProperty DIPROP_GRANULARITY returned %#x\n", hr );
+
+ prop_dword.diph.dwHow = DIPH_BYOFFSET;
+ prop_dword.diph.dwObj = 1;
+ hr = IDirectInputDevice8_GetProperty( device, DIPROP_GRANULARITY, &prop_dword.diph );
+ todo_wine
+ ok( hr == DIERR_UNSUPPORTED, "GetProperty DIPROP_GRANULARITY returned %#x\n", hr );
+ hr = IDirectInputDevice8_GetProperty( device, DIPROP_DEADZONE, &prop_dword.diph );
+ todo_wine
+ ok( hr == DIERR_UNSUPPORTED, "GetProperty DIPROP_DEADZONE returned %#x\n", hr );
+ hr = IDirectInputDevice8_GetProperty( device, DIPROP_SATURATION, &prop_dword.diph );
+ todo_wine
+ ok( hr == DIERR_UNSUPPORTED, "GetProperty DIPROP_SATURATION returned %#x\n", hr );
+ prop_range.diph.dwHow = DIPH_BYOFFSET;
+ prop_range.diph.dwObj = 1;
+ hr = IDirectInputDevice8_GetProperty( device, DIPROP_RANGE, &prop_range.diph );
+ ok( hr == DIERR_UNSUPPORTED, "GetProperty DIPROP_RANGE returned %#x\n", hr );
+
+ res = 0;
+ hr = IDirectInputDevice8_EnumObjects( device, check_object_count, &res, DIDFT_AXIS | DIDFT_PSHBUTTON );
+ ok( hr == DI_OK, "EnumObjects returned %#x\n", hr );
+ if (!localized) todo_wine ok( res == 127, "got %u expected %u\n", res, 127 );
+ 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",
+ check_objects_params.expect_count - check_objects_params.index );
+
+ objinst.dwSize = sizeof(DIDEVICEOBJECTINSTANCEW);
+ res = MAKELONG( HID_USAGE_KEYBOARD_LCTRL, HID_USAGE_PAGE_KEYBOARD );
+ hr = IDirectInputDevice8_GetObjectInfo( device, &objinst, res, DIPH_BYUSAGE );
+ todo_wine
+ ok( hr == DIERR_UNSUPPORTED, "GetObjectInfo returned: %#x\n", hr );
+
+ hr = IDirectInputDevice8_GetObjectInfo( device, &objinst, 2, DIPH_BYOFFSET );
+ ok( hr == DI_OK, "GetObjectInfo returned: %#x\n", hr );
+
+ check_member( objinst, expect_objects[1], "%u", dwSize );
+ check_member_guid( objinst, expect_objects[1], guidType );
+ check_member( objinst, expect_objects[1], "%#x", dwOfs );
+ check_member( objinst, expect_objects[1], "%#x", dwType );
+ check_member( objinst, expect_objects[1], "%#x", dwFlags );
+ if (!localized) check_member_wstr( objinst, expect_objects[1], tszName );
+ check_member( objinst, expect_objects[1], "%u", dwFFMaxForce );
+ check_member( objinst, expect_objects[1], "%u", dwFFForceResolution );
+ check_member( objinst, expect_objects[1], "%u", wCollectionNumber );
+ check_member( objinst, expect_objects[1], "%u", wDesignatorIndex );
+ check_member( objinst, expect_objects[1], "%#04x", wUsagePage );
+ check_member( objinst, expect_objects[1], "%#04x", wUsage );
+ check_member( objinst, expect_objects[1], "%#04x", dwDimension );
+ check_member( objinst, expect_objects[1], "%#04x", wExponent );
+ check_member( objinst, expect_objects[1], "%u", wReportId );
+
+ hr = IDirectInputDevice8_GetObjectInfo( device, &objinst, 423, DIPH_BYOFFSET );
+ ok( hr == DIERR_NOTFOUND, "GetObjectInfo returned: %#x\n", hr );
+ res = DIDFT_TGLBUTTON | DIDFT_MAKEINSTANCE( 3 );
+ hr = IDirectInputDevice8_GetObjectInfo( device, &objinst, res, DIPH_BYID );
+ ok( hr == DIERR_NOTFOUND, "GetObjectInfo returned: %#x\n", hr );
+ res = DIDFT_PSHBUTTON | DIDFT_MAKEINSTANCE( 3 );
+ hr = IDirectInputDevice8_GetObjectInfo( device, &objinst, res, DIPH_BYID );
+ ok( hr == DI_OK, "GetObjectInfo returned: %#x\n", hr );
+
+ check_member( objinst, expect_objects[2], "%u", dwSize );
+ check_member_guid( objinst, expect_objects[2], guidType );
+ check_member( objinst, expect_objects[2], "%#x", dwOfs );
+ check_member( objinst, expect_objects[2], "%#x", dwType );
+ check_member( objinst, expect_objects[2], "%#x", dwFlags );
+ if (!localized) check_member_wstr( objinst, expect_objects[2], tszName );
+ check_member( objinst, expect_objects[2], "%u", dwFFMaxForce );
+ check_member( objinst, expect_objects[2], "%u", dwFFForceResolution );
+ check_member( objinst, expect_objects[2], "%u", wCollectionNumber );
+ check_member( objinst, expect_objects[2], "%u", wDesignatorIndex );
+ check_member( objinst, expect_objects[2], "%#04x", wUsagePage );
+ check_member( objinst, expect_objects[2], "%#04x", wUsage );
+ check_member( objinst, expect_objects[2], "%#04x", dwDimension );
+ check_member( objinst, expect_objects[2], "%#04x", wExponent );
+ check_member( objinst, expect_objects[2], "%u", wReportId );
+
+ ref = IDirectInputDevice8_Release( device );
+ ok( ref == 0, "Release returned %d\n", ref );
+
+ ref = IDirectInput8_Release( di );
+ ok( ref == 0, "Release returned %d\n", ref );
+}
+
START_TEST(device)
{
+ instance = GetModuleHandleW( NULL );
+
CoInitialize(NULL);
+ test_mouse_info();
+ test_keyboard_info();
test_action_mapping();
test_save_settings();
test_mouse_keyboard();
--
2.33.0
1
5
[PATCH 1/2] localspl: Add ARM environments, and choose one based on cpu.
by Esme Povirk Oct. 18, 2021
by Esme Povirk Oct. 18, 2021
Oct. 18, 2021
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=51815
Signed-off-by: Esme Povirk <esme(a)codeweavers.com>
---
I took some liberties with the ARM environments. I haven't found
an actual Windows machine with a 32-bit ARM print environment, but
MS-RPRN implies that "Windows ARM" is a valid environment name.
My Windows 10 machine does have a "Windows ARM64" environment but
it only has driver version 4 in the registry, not 3.
dlls/localspl/provider.c | 22 ++++++++++++++++++++--
1 file changed, 20 insertions(+), 2 deletions(-)
diff --git a/dlls/localspl/provider.c b/dlls/localspl/provider.c
index c17983e3037..aded4ed44c4 100644
--- a/dlls/localspl/provider.c
+++ b/dlls/localspl/provider.c
@@ -245,10 +245,28 @@ static const printenv_t env_x86 = {x86_envnameW, L"w32x86", 3,
static const printenv_t env_x64 = {L"Windows x64", L"x64", 3,
L"\\Version-3", L"\\3"};
+static const printenv_t env_arm = {L"Windows ARM", L"arm", 3,
+ L"\\Version-3", L"\\3"};
+
+static const printenv_t env_arm64 = {L"Windows ARM64", L"arm64", 3,
+ L"\\Version-3", L"\\3"};
+
static const printenv_t env_win40 = {L"Windows 4.0", L"win40", 0,
L"\\Version-0", L"\\0"};
-static const printenv_t * const all_printenv[] = {&env_x86, &env_x64, &env_ia64, &env_win40};
+static const printenv_t * const all_printenv[] = {&env_x86, &env_x64, &env_ia64, &env_arm, &env_arm64, &env_win40};
+
+#ifdef __i386__
+#define env_arch env_x86
+#elif defined __x86_64__
+#define env_arch env_x64
+#elif defined __arm__
+#define env_arch env_arm
+#elif defined __aarch64__
+#define env_arch env_arm64
+#else
+#error not defined for this cpu
+#endif
static const DWORD di_sizeof[] = {0, sizeof(DRIVER_INFO_1W), sizeof(DRIVER_INFO_2W),
@@ -916,7 +934,7 @@ static const printenv_t * validate_envW(LPCWSTR env)
}
else
{
- result = (GetVersion() & 0x80000000) ? &env_win40 : &env_x86;
+ result = (GetVersion() & 0x80000000) ? &env_win40 : &env_arch;
}
TRACE("=> using %p: %s\n", result, debugstr_w(result ? result->envname : NULL));
--
2.30.2
2
2
Oct. 18, 2021
It's called by StartDocW.
Signed-off-by: Jacek Caban <jacek(a)codeweavers.com>
---
dlls/win32u/printdrv.c | 9 +++------
1 file changed, 3 insertions(+), 6 deletions(-)
2
1
Oct. 18, 2021
Signed-off-by: Jacek Caban <jacek(a)codeweavers.com>
---
dlls/win32u/dibdrv/dibdrv.h | 12 ++++++------
dlls/win32u/dibdrv/opengl.c | 12 ++++++------
2 files changed, 12 insertions(+), 12 deletions(-)
2
1