Module: wine Branch: master Commit: 54800316531275678ee9711f889350a68d98f19b URL: https://source.winehq.org/git/wine.git/?a=commit;h=54800316531275678ee9711f8...
Author: Zebediah Figura z.figura12@gmail.com Date: Sun Mar 31 21:22:11 2019 -0500
setupapi: Also check devices not in the set when using DICD_GENERATE_ID.
Signed-off-by: Zebediah Figura z.figura12@gmail.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
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 ab7eeeb..45f4df7 100644 --- a/dlls/setupapi/devinst.c +++ b/dlls/setupapi/devinst.c @@ -1513,6 +1513,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), @@ -1540,8 +1541,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, '\')) { @@ -1549,25 +1550,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, id, 0, KEY_READ, &instance_hkey))) + RegCloseKey(instance_hkey); + if (l == ERROR_FILE_NOT_FOUND) + break; + RegCloseKey(enum_hkey); } } else