[PATCH v2 2/7] winebus.sys: Implement removing IOHID devices

Sebastian Lackner sebastian at fds-team.de
Mon Nov 7 10:04:49 CST 2016


On 04.11.2016 13:45, Aric Stewart wrote:
> v2: Suggestions from Ken Thomases
> Signed-off-by: Aric Stewart <aric at codeweavers.com>
> ---
>  dlls/winebus.sys/bus_iohid.c | 18 +++++++++++++++++-
>  1 file changed, 17 insertions(+), 1 deletion(-)
> 
> 
> 
> v2-0002-winebus.sys-Implement-removing-IOHID-devices.txt
> 
> 
> diff --git a/dlls/winebus.sys/bus_iohid.c b/dlls/winebus.sys/bus_iohid.c
> index e47ed13..3cd0b19 100644
> --- a/dlls/winebus.sys/bus_iohid.c
> +++ b/dlls/winebus.sys/bus_iohid.c
> @@ -120,7 +120,9 @@ static DWORD CFNumberToDWORD(CFNumberRef num)
>  
>  static int compare_platform_device(DEVICE_OBJECT *device, void *platform_dev)
>  {
> -    return 0;
> +    ULONG_PTR dev1 = (ULONG_PTR)*(IOHIDDeviceRef*)get_platform_private(device);
> +    ULONG_PTR dev2 = (ULONG_PTR)platform_dev;
> +    return dev1 - dev2;

As already mentioned, the int return value is not sufficient to hold the
difference between the two ULONG_PTR values.

>  }
>  
>  static NTSTATUS get_reportdescriptor(DEVICE_OBJECT *device, BYTE *buffer, DWORD length, DWORD *out_length)
> @@ -196,6 +198,18 @@ static void handle_DeviceMatchingCallback(void *inContext, IOReturn inResult, vo
>      }
>  }
>  
> +static void handle_RemovalCallback(void *inContext, IOReturn inResult, void *inSender, IOHIDDeviceRef inIOHIDDeviceRef)

Similar to patch 1, you could probably use better parameter names here.

> +{
> +    DEVICE_OBJECT *device;
> +    TRACE("OS/X IOHID Device Removed %p\n", inIOHIDDeviceRef);
> +    device = bus_find_hid_device(&iohid_vtbl, inIOHIDDeviceRef);
> +    if (device)
> +    {
> +        IoInvalidateDeviceRelations(device, RemovalRelations);
> +        bus_remove_hid_device(device);
> +    }
> +}
> +
>  /* This puts the relevant run loop for event handling into a WINE thread */
>  static DWORD CALLBACK runloop_thread(VOID *args)
>  {
> @@ -204,6 +218,7 @@ static DWORD CALLBACK runloop_thread(VOID *args)
>  
>      IOHIDManagerSetDeviceMatching(hid_manager, NULL);
>      IOHIDManagerRegisterDeviceMatchingCallback(hid_manager, handle_DeviceMatchingCallback, driver);
> +    IOHIDManagerRegisterDeviceRemovalCallback(hid_manager, handle_RemovalCallback, driver);

The context parameter is also not really used here.

>      IOHIDManagerScheduleWithRunLoop(hid_manager, run_loop, kCFRunLoopDefaultMode);
>      if (IOHIDManagerOpen( hid_manager, 0 ) != kIOReturnSuccess)
>      {
> @@ -217,6 +232,7 @@ static DWORD CALLBACK runloop_thread(VOID *args)
>      TRACE("Run Loop exiting\n");
>  
>      IOHIDManagerRegisterDeviceMatchingCallback(hid_manager, NULL, NULL);
> +    IOHIDManagerRegisterDeviceRemovalCallback(hid_manager, NULL, NULL);
>      IOHIDManagerUnscheduleFromRunLoop(hid_manager, run_loop, kCFRunLoopDefaultMode);
>      CFRelease(hid_manager);
>      return 1;
> 
> 
> 




More information about the wine-devel mailing list