[PATCH 4/5] dinput/tests: Introduce a new find_hid_device_path helper.

Rémi Bernon rbernon at codeweavers.com
Mon Mar 21 03:54:14 CDT 2022


Signed-off-by: Rémi Bernon <rbernon at codeweavers.com>
---
 dlls/dinput/tests/hid.c | 106 ++++++++++++++++++----------------------
 1 file changed, 48 insertions(+), 58 deletions(-)

diff --git a/dlls/dinput/tests/hid.c b/dlls/dinput/tests/hid.c
index b5683b18850..6203f67bb25 100644
--- a/dlls/dinput/tests/hid.c
+++ b/dlls/dinput/tests/hid.c
@@ -489,6 +489,42 @@ static void pnp_driver_stop(void)
     ok( ret || GetLastError() == ERROR_FILE_NOT_FOUND, "Failed to delete file, error %lu\n", GetLastError() );
 }
 
+static BOOL find_hid_device_path( WCHAR *device_path )
+{
+    char buffer[FIELD_OFFSET( SP_DEVICE_INTERFACE_DETAIL_DATA_W, DevicePath[MAX_PATH] )] = {0};
+    SP_DEVICE_INTERFACE_DATA iface = {sizeof(SP_DEVICE_INTERFACE_DATA)};
+    SP_DEVICE_INTERFACE_DETAIL_DATA_W *iface_detail = (void *)buffer;
+    SP_DEVINFO_DATA device = {sizeof(SP_DEVINFO_DATA)};
+    ULONG i, len = wcslen( device_path );
+    HDEVINFO set;
+    BOOL ret;
+
+    set = SetupDiGetClassDevsW( &GUID_DEVINTERFACE_HID, NULL, NULL, DIGCF_DEVICEINTERFACE | DIGCF_PRESENT );
+    ok( set != INVALID_HANDLE_VALUE, "Failed to get device list, error %#lx\n", GetLastError() );
+
+    for (i = 0; SetupDiEnumDeviceInfo( set, i, &device ); ++i)
+    {
+        ret = SetupDiEnumDeviceInterfaces( set, &device, &GUID_DEVINTERFACE_HID, 0, &iface );
+        ok( ret, "Failed to get interface, error %#lx\n", GetLastError() );
+        ok( IsEqualGUID( &iface.InterfaceClassGuid, &GUID_DEVINTERFACE_HID ), "wrong class %s\n",
+            debugstr_guid( &iface.InterfaceClassGuid ) );
+        ok( iface.Flags == SPINT_ACTIVE, "got flags %#lx\n", iface.Flags );
+
+        iface_detail->cbSize = sizeof(*iface_detail);
+        ret = SetupDiGetDeviceInterfaceDetailW( set, &iface, iface_detail, sizeof(buffer), NULL, NULL );
+        ok( ret, "Failed to get interface path, error %#lx\n", GetLastError() );
+
+        if (!wcsncmp( iface_detail->DevicePath, device_path, len )) break;
+    }
+
+    ret = SetupDiDestroyDeviceInfoList( set );
+    ok( ret, "Failed to destroy set, error %lu\n", GetLastError() );
+
+    ret = !wcsncmp( iface_detail->DevicePath, device_path, len );
+    if (ret) wcscpy( device_path, iface_detail->DevicePath );
+    return ret;
+}
+
 static BOOL pnp_driver_start(void)
 {
     static const WCHAR hardware_id[] = L"test_hardware_id\0";
@@ -2337,50 +2373,22 @@ static void test_hidp( HANDLE file, HANDLE async_file, int report_id, BOOL polle
 
 static void test_hid_device( DWORD report_id, DWORD polled, const HIDP_CAPS *expect_caps )
 {
-    char buffer[FIELD_OFFSET( SP_DEVICE_INTERFACE_DETAIL_DATA_W, DevicePath[MAX_PATH] )];
-    SP_DEVICE_INTERFACE_DATA iface = {sizeof(SP_DEVICE_INTERFACE_DATA)};
-    SP_DEVICE_INTERFACE_DETAIL_DATA_W *iface_detail = (void *)buffer;
-    SP_DEVINFO_DATA device = {sizeof(SP_DEVINFO_DATA)};
     ULONG count, poll_freq, out_len;
+    WCHAR device_path[MAX_PATH];
     HANDLE file, async_file;
-    BOOL ret, found = FALSE;
     OBJECT_ATTRIBUTES attr;
     UNICODE_STRING string;
     IO_STATUS_BLOCK io;
     NTSTATUS status;
-    unsigned int i;
-    HDEVINFO set;
+    BOOL ret;
 
     winetest_push_context( "id %ld%s", report_id, polled ? " poll" : "" );
 
-    set = SetupDiGetClassDevsW( &GUID_DEVINTERFACE_HID, NULL, NULL, DIGCF_DEVICEINTERFACE | DIGCF_PRESENT );
-    ok( set != INVALID_HANDLE_VALUE, "failed to get device list, error %#lx\n", GetLastError() );
+    swprintf( device_path, MAX_PATH, L"\\\\?\\hid#winetest#" );
+    ret = find_hid_device_path( device_path );
+    ok( ret, "Failed to find HID device matching %s\n", debugstr_w( device_path ) );
 
-    for (i = 0; SetupDiEnumDeviceInfo( set, i, &device ); ++i)
-    {
-        ret = SetupDiEnumDeviceInterfaces( set, &device, &GUID_DEVINTERFACE_HID, 0, &iface );
-        ok( ret, "failed to get interface, error %#lx\n", GetLastError() );
-        ok( IsEqualGUID( &iface.InterfaceClassGuid, &GUID_DEVINTERFACE_HID ), "wrong class %s\n",
-            debugstr_guid( &iface.InterfaceClassGuid ) );
-        ok( iface.Flags == SPINT_ACTIVE, "got flags %#lx\n", iface.Flags );
-
-        iface_detail->cbSize = sizeof(*iface_detail);
-        ret = SetupDiGetDeviceInterfaceDetailW( set, &iface, iface_detail, sizeof(buffer), NULL, NULL );
-        ok( ret, "failed to get interface path, error %#lx\n", GetLastError() );
-
-        if (wcsstr( iface_detail->DevicePath, L"\\\\?\\hid#winetest#1" ))
-        {
-            found = TRUE;
-            break;
-        }
-    }
-
-    SetupDiDestroyDeviceInfoList( set );
-
-    todo_wine
-    ok( found, "didn't find device\n" );
-
-    file = CreateFileW( iface_detail->DevicePath, FILE_READ_ACCESS | FILE_WRITE_ACCESS,
+    file = CreateFileW( device_path, FILE_READ_ACCESS | FILE_WRITE_ACCESS,
                         FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL );
     ok( file != INVALID_HANDLE_VALUE, "got error %lu\n", GetLastError() );
 
@@ -2411,7 +2419,7 @@ static void test_hid_device( DWORD report_id, DWORD polled, const HIDP_CAPS *exp
     ok( ret, "HidD_GetNumInputBuffers failed last error %lu\n", GetLastError() );
     ok( count == 16, "HidD_GetNumInputBuffers returned %lu\n", count );
 
-    async_file = CreateFileW( iface_detail->DevicePath, FILE_READ_ACCESS | FILE_WRITE_ACCESS,
+    async_file = CreateFileW( device_path, FILE_READ_ACCESS | FILE_WRITE_ACCESS,
                               FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING,
                               FILE_FLAG_OVERLAPPED | FILE_FLAG_NO_BUFFERING, NULL );
     ok( async_file != INVALID_HANDLE_VALUE, "got error %lu\n", GetLastError() );
@@ -3133,17 +3141,13 @@ static void test_hidp_kdr(void)
         },
     };
 
-    char buffer[FIELD_OFFSET( SP_DEVICE_INTERFACE_DETAIL_DATA_W, DevicePath[MAX_PATH] )];
-    SP_DEVICE_INTERFACE_DATA iface = {sizeof(SP_DEVICE_INTERFACE_DATA)};
-    SP_DEVICE_INTERFACE_DETAIL_DATA_W *iface_detail = (void *)buffer;
-    SP_DEVINFO_DATA device = {sizeof(SP_DEVINFO_DATA)};
     WCHAR cwd[MAX_PATH], tempdir[MAX_PATH];
     PHIDP_PREPARSED_DATA preparsed_data;
     DWORD i, report_id = 0, polled = 0;
+    WCHAR device_path[MAX_PATH];
     struct hidp_kdr *kdr;
     char context[64];
     LSTATUS status;
-    HDEVINFO set;
     HANDLE file;
     HKEY hkey;
     BOOL ret;
@@ -3183,25 +3187,11 @@ static void test_hidp_kdr(void)
 
     if (!hid_device_start()) goto done;
 
-    set = SetupDiGetClassDevsW( &GUID_DEVINTERFACE_HID, NULL, NULL, DIGCF_DEVICEINTERFACE | DIGCF_PRESENT );
-    ok( set != INVALID_HANDLE_VALUE, "failed to get device list, error %#lx\n", GetLastError() );
-    for (i = 0; SetupDiEnumDeviceInfo( set, i, &device ); ++i)
-    {
-        ret = SetupDiEnumDeviceInterfaces( set, &device, &GUID_DEVINTERFACE_HID, 0, &iface );
-        ok( ret, "failed to get interface, error %#lx\n", GetLastError() );
-        ok( IsEqualGUID( &iface.InterfaceClassGuid, &GUID_DEVINTERFACE_HID ), "wrong class %s\n",
-            debugstr_guid( &iface.InterfaceClassGuid ) );
-        ok( iface.Flags == SPINT_ACTIVE, "got flags %#lx\n", iface.Flags );
+    swprintf( device_path, MAX_PATH, L"\\\\?\\hid#winetest#" );
+    ret = find_hid_device_path( device_path );
+    ok( ret, "Failed to find HID device matching %s\n", debugstr_w( device_path ) );
 
-        iface_detail->cbSize = sizeof(*iface_detail);
-        ret = SetupDiGetDeviceInterfaceDetailW( set, &iface, iface_detail, sizeof(buffer), NULL, NULL );
-        ok( ret, "failed to get interface path, error %#lx\n", GetLastError() );
-
-        if (wcsstr( iface_detail->DevicePath, L"\\\\?\\hid#winetest#1" )) break;
-    }
-    SetupDiDestroyDeviceInfoList( set );
-
-    file = CreateFileW( iface_detail->DevicePath, FILE_READ_ACCESS | FILE_WRITE_ACCESS,
+    file = CreateFileW( device_path, FILE_READ_ACCESS | FILE_WRITE_ACCESS,
                         FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL );
     ok( file != INVALID_HANDLE_VALUE, "got error %lu\n", GetLastError() );
 
-- 
2.35.1




More information about the wine-devel mailing list