From 30990089b8d7b38075375f61319c6d3ddd6534e3 Mon Sep 17 00:00:00 2001 From: Armin Novak Date: Mon, 2 Mar 2020 08:40:40 +0100 Subject: [PATCH] Implemented del_device by vid/pid --- channels/urbdrc/client/libusb/libusb_udevman.c | 2 +- channels/urbdrc/client/urbdrc_main.c | 32 ++++++++++++++++++++++++-- channels/urbdrc/client/urbdrc_main.h | 4 ++-- 3 files changed, 33 insertions(+), 5 deletions(-) diff --git a/channels/urbdrc/client/libusb/libusb_udevman.c b/channels/urbdrc/client/libusb/libusb_udevman.c index dbfed15..db45673 100644 --- a/channels/urbdrc/client/libusb/libusb_udevman.c +++ b/channels/urbdrc/client/libusb/libusb_udevman.c @@ -628,7 +628,7 @@ static int hotplug_callback(struct libusb_context* ctx, struct libusb_device* de break; case LIBUSB_HOTPLUG_EVENT_DEVICE_LEFT: - del_device(idevman, bus, addr, desc.idVendor, desc.idProduct); + del_device(idevman, DEVICE_ADD_FLAG_ALL, bus, addr, desc.idVendor, desc.idProduct); break; default: diff --git a/channels/urbdrc/client/urbdrc_main.c b/channels/urbdrc/client/urbdrc_main.c index 15c4b71..ce7a9c7 100644 --- a/channels/urbdrc/client/urbdrc_main.c +++ b/channels/urbdrc/client/urbdrc_main.c @@ -836,7 +836,8 @@ BOOL add_device(IUDEVMAN* idevman, UINT32 flags, BYTE busnum, BYTE devnum, UINT1 return TRUE; } -BOOL del_device(IUDEVMAN* idevman, BYTE busnum, BYTE devnum, UINT16 idVendor, UINT16 idProduct) +BOOL del_device(IUDEVMAN* idevman, UINT32 flags, BYTE busnum, BYTE devnum, UINT16 idVendor, + UINT16 idProduct) { IUDEVICE* pdev = NULL; URBDRC_PLUGIN* urbdrc; @@ -854,9 +855,36 @@ BOOL del_device(IUDEVMAN* idevman, BYTE busnum, BYTE devnum, UINT16 idVendor, UI while (idevman->has_next(idevman)) { + BOOL match = TRUE; IUDEVICE* dev = idevman->get_next(idevman); - if (dev->get_bus_number(dev) == busnum && dev->get_dev_number(dev) == devnum) + if ((flags & (DEVICE_ADD_FLAG_BUS | DEVICE_ADD_FLAG_DEV | DEVICE_ADD_FLAG_VENDOR | + DEVICE_ADD_FLAG_PRODUCT)) == 0) + match = FALSE; + if (flags & DEVICE_ADD_FLAG_BUS) + { + if (dev->get_bus_number(dev) != busnum) + match = FALSE; + } + if (flags & DEVICE_ADD_FLAG_DEV) + { + if (dev->get_dev_number(dev) != devnum) + match = FALSE; + } + if (flags & DEVICE_ADD_FLAG_VENDOR) + { + int vid = dev->query_device_descriptor(dev, ID_VENDOR); + if (vid != idVendor) + match = FALSE; + } + if (flags & DEVICE_ADD_FLAG_PRODUCT) + { + int pid = dev->query_device_descriptor(dev, ID_PRODUCT); + if (pid != idProduct) + match = FALSE; + } + + if (match) { pdev = dev; break; diff --git a/channels/urbdrc/client/urbdrc_main.h b/channels/urbdrc/client/urbdrc_main.h index 5a7a6a1..ca6ab1f 100644 --- a/channels/urbdrc/client/urbdrc_main.h +++ b/channels/urbdrc/client/urbdrc_main.h @@ -236,8 +236,8 @@ enum FREERDP_API BOOL add_device(IUDEVMAN* idevman, UINT32 flags, BYTE busnum, BYTE devnum, UINT16 idVendor, UINT16 idProduct); -FREERDP_API BOOL del_device(IUDEVMAN* idevman, BYTE busnum, BYTE devnum, UINT16 idVendor, - UINT16 idProduct); +FREERDP_API BOOL del_device(IUDEVMAN* idevman, UINT32 flags, BYTE busnum, BYTE devnum, + UINT16 idVendor, UINT16 idProduct); UINT stream_write_and_free(IWTSPlugin* plugin, IWTSVirtualChannel* channel, wStream* s); -- 2.7.4