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