[PATCH v2] setupapi: Also check devices not in the set when using DICD_GENERATE_ID.
Zebediah Figura
z.figura12 at gmail.com
Sun Mar 31 21:22:11 CDT 2019
Signed-off-by: Zebediah Figura <z.figura12 at 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..8e616e0281 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, id, 0, KEY_READ, &instance_hkey)))
+ RegCloseKey(instance_hkey);
+ if (l == ERROR_FILE_NOT_FOUND)
+ break;
+ RegCloseKey(enum_hkey);
}
}
else
--
2.20.1
More information about the wine-devel
mailing list