setupapi: Support full path enumerator in SetupDiGetClassDevs.

Based on a patch by Michael Müller.

Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=35345
Signed-off-by: Zhiyi Zhang <zzhang@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Zhiyi Zhang 2019-07-16 17:36:48 +08:00 committed by Alexandre Julliard
parent 074dd6959f
commit d5e24897e2
2 changed files with 15 additions and 8 deletions

View File

@ -2392,8 +2392,21 @@ static void SETUPDI_EnumerateDevices(HDEVINFO DeviceInfoSet, const GUID *class,
&enumStrKey);
if (!l)
{
SETUPDI_EnumerateMatchingDevices(DeviceInfoSet, enumstr,
enumStrKey, class, flags);
WCHAR *bus, *device;
if (!wcschr(enumstr, '\\'))
{
SETUPDI_EnumerateMatchingDevices(DeviceInfoSet, enumstr, enumStrKey, class, flags);
}
else if ((bus = strdupW(enumstr)))
{
device = wcschr(bus, '\\');
*device++ = 0;
SETUPDI_EnumerateMatchingDeviceInstances(DeviceInfoSet, bus, device, enumStrKey, class, flags);
HeapFree(GetProcessHeap(), 0, bus);
}
RegCloseKey(enumStrKey);
}
}

View File

@ -2823,11 +2823,9 @@ static void test_get_class_devs(void)
set = SetupDiGetClassDevsA(NULL, "ROOT\\LEGACY_BOGUS", NULL, DIGCF_ALLCLASSES);
ok(set != INVALID_HANDLE_VALUE, "Failed to create device list, error %#x.\n", GetLastError());
check_device_list(set, &GUID_NULL);
todo_wine {
check_device_info(set, 0, &guid2, "ROOT\\LEGACY_BOGUS\\BAR");
check_device_info(set, 1, &guid, "ROOT\\LEGACY_BOGUS\\FOO");
check_device_info(set, 2, &guid, "ROOT\\LEGACY_BOGUS\\QUX");
}
check_device_info(set, 3, NULL, NULL);
check_device_iface(set, NULL, &iface_guid, 0, 0, NULL);
ret = SetupDiDestroyDeviceInfoList(set);
@ -2836,10 +2834,8 @@ todo_wine {
set = SetupDiGetClassDevsA(&guid, "ROOT\\LEGACY_BOGUS", NULL, 0);
ok(set != INVALID_HANDLE_VALUE, "Failed to create device list, error %#x.\n", GetLastError());
check_device_list(set, &guid);
todo_wine {
check_device_info(set, 0, &guid, "ROOT\\LEGACY_BOGUS\\FOO");
check_device_info(set, 1, &guid, "ROOT\\LEGACY_BOGUS\\QUX");
}
check_device_info(set, 2, NULL, NULL);
check_device_iface(set, NULL, &iface_guid, 0, 0, NULL);
ret = SetupDiDestroyDeviceInfoList(set);
@ -2848,11 +2844,9 @@ todo_wine {
set = SetupDiGetClassDevsA(&guid, "ROOT\\LEGACY_BOGUS", NULL, DIGCF_ALLCLASSES);
ok(set != INVALID_HANDLE_VALUE, "Failed to create device list, error %#x.\n", GetLastError());
check_device_list(set, &GUID_NULL);
todo_wine {
check_device_info(set, 0, &guid2, "ROOT\\LEGACY_BOGUS\\BAR");
check_device_info(set, 1, &guid, "ROOT\\LEGACY_BOGUS\\FOO");
check_device_info(set, 2, &guid, "ROOT\\LEGACY_BOGUS\\QUX");
}
check_device_info(set, 3, NULL, NULL);
check_device_iface(set, NULL, &iface_guid, 0, 0, NULL);
ret = SetupDiDestroyDeviceInfoList(set);