[PATCH 7/8] user32: Factor out add_device().
Zebediah Figura
zfigura at codeweavers.com
Tue Jul 2 18:08:00 CDT 2019
Signed-off-by: Zebediah Figura <zfigura at codeweavers.com>
---
dlls/user32/rawinput.c | 142 +++++++++++++++++++++--------------------
1 file changed, 74 insertions(+), 68 deletions(-)
diff --git a/dlls/user32/rawinput.c b/dlls/user32/rawinput.c
index 294926400fd..49cf9f73a0d 100644
--- a/dlls/user32/rawinput.c
+++ b/dlls/user32/rawinput.c
@@ -85,20 +85,73 @@ static BOOL array_reserve(void **elements, unsigned int *capacity, unsigned int
return TRUE;
}
+static struct hid_device *add_device(HDEVINFO set, SP_DEVICE_INTERFACE_DATA *iface)
+{
+ SP_DEVICE_INTERFACE_DETAIL_DATA_W *detail;
+ struct hid_device *device;
+ HANDLE file;
+ WCHAR *path;
+ DWORD size;
+
+ SetupDiGetDeviceInterfaceDetailW(set, iface, NULL, 0, &size, NULL);
+ if (GetLastError() != ERROR_INSUFFICIENT_BUFFER)
+ {
+ ERR("Failed to get device path, error %#x.\n", GetLastError());
+ return FALSE;
+ }
+ if (!(detail = heap_alloc(size)))
+ {
+ ERR("Failed to allocate memory.\n");
+ return FALSE;
+ }
+ detail->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA_W);
+ SetupDiGetDeviceInterfaceDetailW(set, iface, detail, size, NULL, NULL);
+
+ TRACE("Found HID device %s.\n", debugstr_w(detail->DevicePath));
+
+ if (!(path = heap_strdupW(detail->DevicePath)))
+ {
+ ERR("Failed to allocate memory.\n");
+ heap_free(detail);
+ return NULL;
+ }
+ heap_free(detail);
+
+ file = CreateFileW(path, GENERIC_READ | GENERIC_WRITE,
+ FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, 0);
+ if (file == INVALID_HANDLE_VALUE)
+ {
+ ERR("Failed to open device file %s, error %u.\n", debugstr_w(path), GetLastError());
+ heap_free(path);
+ return NULL;
+ }
+
+ if (!array_reserve((void **)&hid_devices, &hid_devices_max, hid_devices_count + 1, sizeof(*hid_devices)))
+ {
+ ERR("Failed to allocate memory.\n");
+ CloseHandle(file);
+ heap_free(path);
+ return NULL;
+ }
+
+ device = &hid_devices[hid_devices_count++];
+ device->path = path;
+ device->file = file;
+
+ return device;
+}
+
static void find_hid_devices(void)
{
static ULONGLONG last_check;
SP_DEVICE_INTERFACE_DATA iface = { sizeof(iface) };
- SP_DEVICE_INTERFACE_DETAIL_DATA_W *detail;
- DWORD detail_size, needed;
+ struct hid_device *device;
HIDD_ATTRIBUTES attr;
- DWORD idx, didx;
HIDP_CAPS caps;
GUID hid_guid;
HDEVINFO set;
- HANDLE file;
- WCHAR *path;
+ DWORD idx;
if (GetTickCount64() - last_check < 2000)
return;
@@ -108,87 +161,40 @@ static void find_hid_devices(void)
set = SetupDiGetClassDevsW(&hid_guid, NULL, NULL, DIGCF_DEVICEINTERFACE | DIGCF_PRESENT);
- detail_size = sizeof(*detail) + (MAX_PATH * sizeof(WCHAR));
- if (!(detail = heap_alloc(detail_size)))
- return;
- detail->cbSize = sizeof(*detail);
-
EnterCriticalSection(&hid_devices_cs);
/* destroy previous list */
- for (didx = 0; didx < hid_devices_count; ++didx)
+ for (idx = 0; idx < hid_devices_count; ++idx)
{
- CloseHandle(hid_devices[didx].file);
- heap_free(hid_devices[didx].path);
+ CloseHandle(hid_devices[idx].file);
+ heap_free(hid_devices[idx].path);
}
- didx = 0;
+ hid_devices_count = 0;
for (idx = 0; SetupDiEnumDeviceInterfaces(set, NULL, &hid_guid, idx, &iface); ++idx)
{
- if (!SetupDiGetDeviceInterfaceDetailW(set, &iface, detail, detail_size, &needed, NULL))
- {
- if (!(detail = heap_realloc(detail, needed)))
- {
- ERR("Failed to allocate memory.\n");
- goto done;
- }
- detail_size = needed;
-
- SetupDiGetDeviceInterfaceDetailW(set, &iface, detail, detail_size, NULL, NULL);
- }
-
- if (!(path = heap_strdupW(detail->DevicePath)))
- {
- ERR("Failed to allocate memory.\n");
- goto done;
- }
-
- file = CreateFileW(path, GENERIC_READ | GENERIC_WRITE,
- FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, 0);
- if (file == INVALID_HANDLE_VALUE)
- {
- ERR("Failed to open device file %s, error %u.\n", debugstr_w(path), GetLastError());
- heap_free(path);
+ if (!(device = add_device(set, &iface)))
continue;
- }
-
- if (!array_reserve((void **)&hid_devices, &hid_devices_max, didx + 1, sizeof(*hid_devices)))
- {
- ERR("Failed to allocate memory.\n");
- CloseHandle(file);
- heap_free(path);
- goto done;
- }
-
- TRACE("Found HID device %s.\n", debugstr_w(path));
-
- hid_devices[didx].path = path;
- hid_devices[didx].file = file;
attr.Size = sizeof(HIDD_ATTRIBUTES);
- if (!HidD_GetAttributes(file, &attr))
- WARN_(rawinput)("Failed to get attributes.\n");
- hid_devices[didx].info.dwVendorId = attr.VendorID;
- hid_devices[didx].info.dwProductId = attr.ProductID;
- hid_devices[didx].info.dwVersionNumber = attr.VersionNumber;
+ if (!HidD_GetAttributes(device->file, &attr))
+ WARN("Failed to get attributes.\n");
+ device->info.dwVendorId = attr.VendorID;
+ device->info.dwProductId = attr.ProductID;
+ device->info.dwVersionNumber = attr.VersionNumber;
- if (!HidD_GetPreparsedData(file, &hid_devices[didx].data))
- WARN_(rawinput)("Failed to get preparsed data.\n");
+ if (!HidD_GetPreparsedData(device->file, &device->data))
+ WARN("Failed to get preparsed data.\n");
- if (!HidP_GetCaps(hid_devices[didx].data, &caps))
- WARN_(rawinput)("Failed to get caps.\n");
+ if (!HidP_GetCaps(device->data, &caps))
+ WARN("Failed to get caps.\n");
- hid_devices[didx].info.usUsagePage = caps.UsagePage;
- hid_devices[didx].info.usUsage = caps.Usage;
-
- didx++;
+ device->info.usUsagePage = caps.UsagePage;
+ device->info.usUsage = caps.Usage;
}
- hid_devices_count = didx;
-done:
LeaveCriticalSection(&hid_devices_cs);
SetupDiDestroyDeviceInfoList(set);
- heap_free(detail);
}
/***********************************************************************
--
2.20.1
More information about the wine-devel
mailing list