Piotr Caban : winebus: Fix DEVICE_RELATIONS content on device removal.
Alexandre Julliard
julliard at winehq.org
Tue Nov 12 16:56:07 CST 2019
Module: wine
Branch: master
Commit: c3bfc1b7264277395f2bbe9b2c059d34f4dffae3
URL: https://source.winehq.org/git/wine.git/?a=commit;h=c3bfc1b7264277395f2bbe9b2c059d34f4dffae3
Author: Piotr Caban <piotr at codeweavers.com>
Date: Tue Nov 12 20:03:31 2019 +0100
winebus: Fix DEVICE_RELATIONS content on device removal.
Signed-off-by: Piotr Caban <piotr at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/winebus.sys/bus.h | 1 +
dlls/winebus.sys/bus_iohid.c | 1 +
dlls/winebus.sys/bus_sdl.c | 2 ++
dlls/winebus.sys/bus_udev.c | 2 ++
dlls/winebus.sys/main.c | 14 ++++++++++----
5 files changed, 16 insertions(+), 4 deletions(-)
diff --git a/dlls/winebus.sys/bus.h b/dlls/winebus.sys/bus.h
index 09666dc151..041a37ad04 100644
--- a/dlls/winebus.sys/bus.h
+++ b/dlls/winebus.sys/bus.h
@@ -45,6 +45,7 @@ DEVICE_OBJECT *bus_create_hid_device(const WCHAR *busidW, WORD vid, WORD pid,
WORD input, DWORD version, DWORD uid, const WCHAR *serialW, BOOL is_gamepad,
const platform_vtbl *vtbl, DWORD platform_data_size) DECLSPEC_HIDDEN;
DEVICE_OBJECT *bus_find_hid_device(const platform_vtbl *vtbl, void *platform_dev) DECLSPEC_HIDDEN;
+void bus_unlink_hid_device(DEVICE_OBJECT *device) DECLSPEC_HIDDEN;
void bus_remove_hid_device(DEVICE_OBJECT *device) DECLSPEC_HIDDEN;
void process_hid_report(DEVICE_OBJECT *device, BYTE *report, DWORD length) DECLSPEC_HIDDEN;
DEVICE_OBJECT* bus_enumerate_hid_devices(const platform_vtbl *vtbl, enum_func function, void* context) DECLSPEC_HIDDEN;
diff --git a/dlls/winebus.sys/bus_iohid.c b/dlls/winebus.sys/bus_iohid.c
index ed91b51fc8..df578b4b9d 100644
--- a/dlls/winebus.sys/bus_iohid.c
+++ b/dlls/winebus.sys/bus_iohid.c
@@ -368,6 +368,7 @@ static void handle_RemovalCallback(void *context, IOReturn result, void *sender,
device = bus_find_hid_device(&iohid_vtbl, IOHIDDevice);
if (device)
{
+ bus_unlink_hid_device(device);
IoInvalidateDeviceRelations(bus_pdo, BusRelations);
bus_remove_hid_device(device);
}
diff --git a/dlls/winebus.sys/bus_sdl.c b/dlls/winebus.sys/bus_sdl.c
index 61651c92f6..7a2069fafe 100644
--- a/dlls/winebus.sys/bus_sdl.c
+++ b/dlls/winebus.sys/bus_sdl.c
@@ -899,6 +899,7 @@ static void try_remove_device(SDL_JoystickID id)
sdl_controller = private->sdl_controller;
sdl_haptic = private->sdl_haptic;
+ bus_unlink_hid_device(device);
IoInvalidateDeviceRelations(bus_pdo, BusRelations);
bus_remove_hid_device(device);
@@ -988,6 +989,7 @@ static void try_add_device(unsigned int index)
if (!rc)
{
ERR("Building report descriptor failed, removing device\n");
+ bus_unlink_hid_device(device);
bus_remove_hid_device(device);
HeapFree(GetProcessHeap(), 0, serial);
return;
diff --git a/dlls/winebus.sys/bus_udev.c b/dlls/winebus.sys/bus_udev.c
index 239051723c..24d7961b06 100644
--- a/dlls/winebus.sys/bus_udev.c
+++ b/dlls/winebus.sys/bus_udev.c
@@ -1259,6 +1259,7 @@ static void try_add_device(struct udev_device *dev)
ERR("Building report descriptor failed, removing device\n");
close(fd);
udev_device_unref(dev);
+ bus_unlink_hid_device(device);
bus_remove_hid_device(device);
HeapFree(GetProcessHeap(), 0, serial);
return;
@@ -1293,6 +1294,7 @@ static void try_remove_device(struct udev_device *dev)
#endif
if (!device) return;
+ bus_unlink_hid_device(device);
IoInvalidateDeviceRelations(bus_pdo, BusRelations);
private = impl_from_DEVICE_OBJECT(device);
diff --git a/dlls/winebus.sys/main.c b/dlls/winebus.sys/main.c
index 7b05d4ce84..8bba968202 100644
--- a/dlls/winebus.sys/main.c
+++ b/dlls/winebus.sys/main.c
@@ -346,6 +346,16 @@ DEVICE_OBJECT* bus_enumerate_hid_devices(const platform_vtbl *vtbl, enum_func fu
return ret;
}
+void bus_unlink_hid_device(DEVICE_OBJECT *device)
+{
+ struct device_extension *ext = (struct device_extension *)device->DeviceExtension;
+ struct pnp_device *pnp_device = ext->pnp_device;
+
+ EnterCriticalSection(&device_list_cs);
+ list_remove(&pnp_device->entry);
+ LeaveCriticalSection(&device_list_cs);
+}
+
void bus_remove_hid_device(DEVICE_OBJECT *device)
{
struct device_extension *ext = (struct device_extension *)device->DeviceExtension;
@@ -355,10 +365,6 @@ void bus_remove_hid_device(DEVICE_OBJECT *device)
TRACE("(%p)\n", device);
- EnterCriticalSection(&device_list_cs);
- list_remove(&pnp_device->entry);
- LeaveCriticalSection(&device_list_cs);
-
/* Cancel pending IRPs */
EnterCriticalSection(&ext->report_cs);
while ((entry = RemoveHeadList(&ext->irp_queue)) != &ext->irp_queue)
More information about the wine-cvs
mailing list