Zebediah Figura : setupapi: Also check devices not in the set when using DICD_GENERATE_ID.

Alexandre Julliard julliard at winehq.org
Mon Apr 1 16:32:01 CDT 2019


Module: wine
Branch: master
Commit: 54800316531275678ee9711f889350a68d98f19b
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=54800316531275678ee9711f889350a68d98f19b

Author: Zebediah Figura <z.figura12 at 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 at gmail.com>
Signed-off-by: Alexandre Julliard <julliard at 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




More information about the wine-cvs mailing list