Zhiyi Zhang : winebus.sys: Handle create existent device failure.

Alexandre Julliard julliard at winehq.org
Thu Mar 21 17:21:19 CDT 2019


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

Author: Zhiyi Zhang <zzhang at codeweavers.com>
Date:   Wed Mar 20 23:28:15 2019 +0800

winebus.sys: Handle create existent device failure.

Signed-off-by: Zhiyi Zhang <zzhang at codeweavers.com>
Signed-off-by: Aric Stewart <aric at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/winebus.sys/main.c | 41 ++++++++++++++++++++++++-----------------
 1 file changed, 24 insertions(+), 17 deletions(-)

diff --git a/dlls/winebus.sys/main.c b/dlls/winebus.sys/main.c
index fd68833..f9675b3 100644
--- a/dlls/winebus.sys/main.c
+++ b/dlls/winebus.sys/main.c
@@ -207,6 +207,8 @@ DEVICE_OBJECT *bus_create_hid_device(DRIVER_OBJECT *driver, const WCHAR *busidW,
     UNICODE_STRING nameW;
     WCHAR dev_name[256];
     HDEVINFO devinfo;
+    SP_DEVINFO_DATA data = {sizeof(data)};
+    WCHAR *instance = NULL;
     NTSTATUS status;
     DWORD length;
 
@@ -258,26 +260,31 @@ DEVICE_OBJECT *bus_create_hid_device(DRIVER_OBJECT *driver, const WCHAR *busidW,
 
     LeaveCriticalSection(&device_list_cs);
 
-    devinfo = SetupDiGetClassDevsW(class, NULL, NULL, DIGCF_DEVICEINTERFACE);
-    if (devinfo)
+    devinfo = SetupDiCreateDeviceInfoList(class, NULL);
+    if (devinfo == INVALID_HANDLE_VALUE)
     {
-        SP_DEVINFO_DATA data;
-        WCHAR *instance;
-
-        data.cbSize = sizeof(data);
-        if (!(instance = get_instance_id(device)))
-            ERR("failed to generate instance id\n");
-        else if (!SetupDiCreateDeviceInfoW(devinfo, instance, class, NULL, NULL, DICD_INHERIT_CLASSDRVS, &data))
-            ERR("failed to create device info: %x\n", GetLastError());
-        else if (!SetupDiRegisterDeviceInfo(devinfo, &data, 0, NULL, NULL, NULL))
-            ERR("failed to register device info: %x\n", GetLastError());
-
-        HeapFree(GetProcessHeap(), 0, instance);
-        SetupDiDestroyDeviceInfoList(devinfo);
+        ERR("failed to create device info list, error %#x\n", GetLastError());
+        goto error;
     }
-    else
-        ERR("failed to get ClassDevs: %x\n", GetLastError());
 
+    instance = get_instance_id(device);
+    if (!instance)
+    {
+        ERR("failed to generate instance id\n");
+        goto error;
+    }
+
+    if (SetupDiCreateDeviceInfoW(devinfo, instance, class, NULL, NULL, DICD_INHERIT_CLASSDRVS, &data))
+    {
+        if (!SetupDiRegisterDeviceInfo(devinfo, &data, 0, NULL, NULL, NULL))
+            ERR("failed to register device info, error %#x\n", GetLastError());
+    }
+    else if (GetLastError() != ERROR_DEVINST_ALREADY_EXISTS)
+        ERR("failed to create device info, error %#x\n", GetLastError());
+
+error:
+    HeapFree(GetProcessHeap(), 0, instance);
+    SetupDiDestroyDeviceInfoList(devinfo);
     return device;
 }
 




More information about the wine-cvs mailing list