Wine-devel
Threads by month
- ----- 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
October 2021
- 81 participants
- 772 discussions
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=51894
Signed-off-by: Piotr Caban <piotr(a)codeweavers.com>
---
dlls/ucrtbase/tests/misc.c | 15 ++++++++-------
1 file changed, 8 insertions(+), 7 deletions(-)
1
0
Signed-off-by: Nikolay Sivov <nsivov(a)codeweavers.com>
---
dlls/dwrite/analyzer.c | 4 ++++
dlls/dwrite/scripts.h | 6 +++++-
tools/make_unicode | 5 +++++
3 files changed, 14 insertions(+), 1 deletion(-)
diff --git a/dlls/dwrite/analyzer.c b/dlls/dwrite/analyzer.c
index 89c76da0bb9..e8a30a7ae45 100644
--- a/dlls/dwrite/analyzer.c
+++ b/dlls/dwrite/analyzer.c
@@ -198,6 +198,10 @@ static const struct dwritescript_properties dwritescripts_properties[Script_Last
{ /* Hmnp */ { 0x706e6d48, 451, 8, 0x0020, 1, 1, 0, 0, 0, 0, 0 }, { _OT('h','m','n','p') } },
{ /* Nand */ { 0x646e614e, 311, 8, 0x0020, 1, 1, 0, 0, 0, 1, 0 }, { _OT('n','a','n','d') } },
{ /* Wcho */ { 0x6f686357, 283, 8, 0x0020, 1, 1, 0, 0, 0, 0, 0 }, { _OT('w','c','h','o') } },
+ { /* Chrs */ { 0x73726843, 109, 8, 0x0020, 0, 1, 0, 0, 0, 1, 1 }, { _OT('c','h','r','s') } },
+ { /* Diak */ { 0x6b616944, 342, 8, 0x0020, 1, 1, 0, 0, 0, 0, 0 }, { _OT('d','i','a','k') } },
+ { /* Kits */ { 0x7374694b, 288, 8, 0x0020, 1, 0, 1, 1, 0, 0, 0 }, { _OT('k','i','t','s') } },
+ { /* Yezi */ { 0x697a6559, 192, 8, 0x0020, 0, 1, 1, 0, 0, 0, 0 }, { _OT('y','e','z','i') } },
};
#undef _OT
diff --git a/dlls/dwrite/scripts.h b/dlls/dwrite/scripts.h
index 594d9edea87..fbc467c38bb 100644
--- a/dlls/dwrite/scripts.h
+++ b/dlls/dwrite/scripts.h
@@ -156,5 +156,9 @@ enum unicode_script_id {
Script_Nyiakeng_Puachue_Hmong = 150,
Script_Nandinagari = 151,
Script_Wancho = 152,
- Script_LastId = 152
+ Script_Chorasmian = 153,
+ Script_Dives_Akuru = 154,
+ Script_Khitan_Small_Script = 155,
+ Script_Yezidi = 156,
+ Script_LastId = 156
};
diff --git a/tools/make_unicode b/tools/make_unicode
index 4c9d3d6d988..2bfe6f9bb32 100755
--- a/tools/make_unicode
+++ b/tools/make_unicode
@@ -1512,6 +1512,11 @@ my %scripts =
"Nyiakeng_Puachue_Hmong" => 150,
"Nandinagari" => 151,
"Wancho" => 152,
+ # Win11
+ "Chorasmian" => 153,
+ "Dives_Akuru" => 154,
+ "Khitan_Small_Script" => 155,
+ "Yezidi" => 156,
);
################################################################
--
2.33.0
1
0
Signed-off-by: Paul Gofman <pgofman(a)codeweavers.com>
---
dlls/ntdll/loader.c | 13 ++++++++-----
1 file changed, 8 insertions(+), 5 deletions(-)
diff --git a/dlls/ntdll/loader.c b/dlls/ntdll/loader.c
index 797d72aedb6..dd41d6b66d2 100644
--- a/dlls/ntdll/loader.c
+++ b/dlls/ntdll/loader.c
@@ -136,6 +136,7 @@ typedef struct _wine_modref
int alloc_deps;
int nDeps;
struct _wine_modref **deps;
+ ULONG CheckSum;
} WINE_MODREF;
static UINT tls_module_count; /* number of modules with TLS directory */
@@ -220,16 +221,17 @@ static RTL_UNLOAD_EVENT_TRACE unload_traces[RTL_UNLOAD_EVENT_TRACE_NUMBER];
static RTL_UNLOAD_EVENT_TRACE *unload_trace_ptr;
static unsigned int unload_trace_seq;
-static void module_push_unload_trace( const LDR_DATA_TABLE_ENTRY *ldr )
+static void module_push_unload_trace( const WINE_MODREF *wm )
{
RTL_UNLOAD_EVENT_TRACE *ptr = &unload_traces[unload_trace_seq];
+ const LDR_DATA_TABLE_ENTRY *ldr = &wm->ldr;
unsigned int len = min(sizeof(ptr->ImageName) - sizeof(WCHAR), ldr->BaseDllName.Length);
ptr->BaseAddress = ldr->DllBase;
ptr->SizeOfImage = ldr->SizeOfImage;
ptr->Sequence = unload_trace_seq;
ptr->TimeDateStamp = ldr->TimeDateStamp;
- ptr->CheckSum = ldr->CheckSum;
+ ptr->CheckSum = wm->CheckSum;
memcpy(ptr->ImageName, ldr->BaseDllName.Buffer, len);
ptr->ImageName[len / sizeof(*ptr->ImageName)] = 0;
@@ -1222,7 +1224,7 @@ static WINE_MODREF *alloc_module( HMODULE hModule, const UNICODE_STRING *nt_name
wm->ldr.Flags = LDR_DONT_RESOLVE_REFS | (builtin ? LDR_WINE_INTERNAL : 0);
wm->ldr.TlsIndex = -1;
wm->ldr.LoadCount = 1;
- wm->ldr.CheckSum = nt->OptionalHeader.CheckSum;
+ wm->CheckSum = nt->OptionalHeader.CheckSum;
wm->ldr.TimeDateStamp = nt->FileHeader.TimeDateStamp;
if (!(buffer = RtlAllocateHeap( GetProcessHeap(), 0, nt_name->Length - 3 * sizeof(WCHAR) )))
@@ -2350,7 +2352,8 @@ static WINE_MODREF *find_existing_module( HMODULE module )
{
mod = CONTAINING_RECORD( entry, LDR_DATA_TABLE_ENTRY, InMemoryOrderLinks );
if (mod->TimeDateStamp != nt->FileHeader.TimeDateStamp) continue;
- if (mod->CheckSum != nt->OptionalHeader.CheckSum) continue;
+ wm = CONTAINING_RECORD( mod, WINE_MODREF, ldr );
+ if (wm->CheckSum != nt->OptionalHeader.CheckSum) continue;
if (NtAreMappedFilesTheSame( mod->DllBase, module ) != STATUS_SUCCESS) continue;
return CONTAINING_RECORD( mod, WINE_MODREF, ldr );
}
@@ -3592,7 +3595,7 @@ static void MODULE_DecRefCount( WINE_MODREF *wm )
wm->ldr.Flags &= ~LDR_UNLOAD_IN_PROGRESS;
- module_push_unload_trace( &wm->ldr );
+ module_push_unload_trace( wm );
}
}
--
2.31.1
1
1
[PATCH 1/9] d3d10/effect: Add missing return when effect creation failed.
by Nikolay Sivov 18 Oct '21
by Nikolay Sivov 18 Oct '21
18 Oct '21
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 18 Oct '21
by Rémi Bernon 18 Oct '21
18 Oct '21
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 18 Oct '21
by Zhiyi Zhang 18 Oct '21
18 Oct '21
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 18 Oct '21
by Rémi Bernon 18 Oct '21
18 Oct '21
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