I haven't done a full review yet, but here are some first comments.
On 01.03.2017 17:16, Aric Stewart wrote:
- subsystem = udev_device_get_subsystem(dev); usbdev = udev_device_get_parent_with_subsystem_devtype(dev, "usb", "usb_device"); if (usbdev) {
- #ifdef HAS_PROPER_INPUT_HEADER
const platform_vtbl *other_vtbl = NULL;
DEVICE_OBJECT *dup = NULL;
if (strcmp(subsystem, "hidraw") == 0)
other_vtbl = &lnxev_vtbl;
else if (strcmp(subsystem, "input") == 0)
other_vtbl = &hidraw_vtbl;
if (other_vtbl)
dup = bus_enumerate_hid_devices(other_vtbl, check_same_device, dev);
Shouldn't we have some preference of either hidraw or linux event devices? Otherwise this could lead to different results in each run.
}
+DEVICE_OBJECT* bus_enumerate_hid_devices(const platform_vtbl *vtbl, enum_func function, void* context) +{
- struct pnp_device *dev;
- DEVICE_OBJECT *ret = NULL;
- TRACE("(%p)\n", vtbl);
- EnterCriticalSection(&device_list_cs);
- LIST_FOR_EACH_ENTRY(dev, &pnp_devset, struct pnp_device, entry)
- {
struct device_extension *ext = (struct device_extension *)dev->device->DeviceExtension;
if (ext->vtbl != vtbl) continue;
if (function(dev->device, context) == 0)
ret = dev->device;
break;
This is wrong and will always abort after the first function call.
- }
- LeaveCriticalSection(&device_list_cs);
- return ret;
+}