[PATCH] setupapi: Also check devices not in the set when using DICD_GENERATE_ID.
See also 1fa7782c080e5d4719bb230110992a0705f9b224. Signed-off-by: Zebediah Figura <z.figura12(a)gmail.com> --- dlls/setupapi/devinst.c | 34 +++++++++++++++------------------- 1 file changed, 15 insertions(+), 19 deletions(-) diff --git a/dlls/setupapi/devinst.c b/dlls/setupapi/devinst.c index 6acee0aa54..1d091640f1 100644 --- a/dlls/setupapi/devinst.c +++ b/dlls/setupapi/devinst.c @@ -1543,6 +1543,7 @@ BOOL WINAPI SetupDiCreateDeviceInfoW(HDEVINFO devinfo, const WCHAR *name, const HKEY enum_hkey; HKEY instance_hkey; struct device *device; + LONG l; TRACE("devinfo %p, name %s, class %s, description %s, hwnd %p, flags %#x, device_data %p.\n", devinfo, debugstr_w(name), debugstr_guid(class), debugstr_w(description), @@ -1570,8 +1571,8 @@ BOOL WINAPI SetupDiCreateDeviceInfoW(HDEVINFO devinfo, const WCHAR *name, const } if ((flags & DICD_GENERATE_ID)) { - static const WCHAR formatW[] = {'R','O','O','T','\\','%','s','\\','%','0','4','d',0}; - int instance_id, highest_id = -1; + static const WCHAR formatW[] = {'R','O','O','T','\\','%','s','\\','%','0','4','u',0}; + unsigned int instance_id; if (strchrW(name, '\\')) { @@ -1579,25 +1580,20 @@ BOOL WINAPI SetupDiCreateDeviceInfoW(HDEVINFO devinfo, const WCHAR *name, const return FALSE; } - LIST_FOR_EACH_ENTRY(device, &set->devices, struct device, entry) + for (instance_id = 0; ; ++instance_id) { - const WCHAR *instance_str = strrchrW(device->instanceId, '\\'); - WCHAR *endptr; - - if (instance_str) - instance_str++; - else - instance_str = device->instanceId; - - instance_id = strtoulW(instance_str, &endptr, 10); - if (*instance_str && !*endptr) - highest_id = max(highest_id, instance_id); - } + if (snprintfW(id, ARRAY_SIZE(id), formatW, name, instance_id) == -1) + { + SetLastError(ERROR_INVALID_DEVINST_NAME); + return FALSE; + } - if (snprintfW(id, ARRAY_SIZE(id), formatW, name, highest_id + 1) == -1) - { - SetLastError(ERROR_INVALID_DEVINST_NAME); - return FALSE; + RegCreateKeyExW(HKEY_LOCAL_MACHINE, Enum, 0, NULL, 0, KEY_READ, NULL, &enum_hkey, NULL); + if (!(l = RegOpenKeyExW(enum_hkey, name, 0, KEY_READ, &instance_hkey))) + RegCloseKey(instance_hkey); + if (l == ERROR_FILE_NOT_FOUND) + break; + RegCloseKey(enum_hkey); } } else -- 2.20.1
Hi, While running your changed tests, I think I found new failures. Being a bot and all I'm not very good at pattern recognition, so I might be wrong, but could you please double-check? Full results can be found at: https://testbot.winehq.org/JobDetails.pl?Key=50220 Your paranoid android. === debian9 (32 bit report) === setupapi: devinst.c:761: Test failed: Got unexpected id ROOT\LEGACY_BOGUS\0000. === debian9 (32 bit Chinese:China report) === setupapi: devinst.c:761: Test failed: Got unexpected id ROOT\LEGACY_BOGUS\0000. === debian9 (32 bit WoW report) === setupapi: devinst.c:761: Test failed: Got unexpected id ROOT\LEGACY_BOGUS\0000. === debian9 (64 bit WoW report) === setupapi: devinst.c:761: Test failed: Got unexpected id ROOT\LEGACY_BOGUS\0000.
participants (2)
-
Marvin -
Zebediah Figura