[PATCH] HID: Handle failure to create device by trying to open it instead

Huw Davies huw at codeweavers.com
Wed Mar 20 05:14:28 CDT 2019


On Tue, Mar 19, 2019 at 01:44:56PM -0500, Aric Stewart wrote:
> 
> Signed-off-by: Aric Stewart <aric at codeweavers.com>
> ---
>  dlls/hidclass.sys/device.c |  9 +++++----
>  dlls/winebus.sys/main.c    | 15 ++++++++++++---
>  2 files changed, 17 insertions(+), 7 deletions(-)
> 
> 

> diff --git a/dlls/hidclass.sys/device.c b/dlls/hidclass.sys/device.c
> index 547c355410..55bcb66eb3 100644
> --- a/dlls/hidclass.sys/device.c
> +++ b/dlls/hidclass.sys/device.c
> @@ -99,13 +99,14 @@ NTSTATUS HID_LinkDevice(DEVICE_OBJECT *device)
>      Data.cbSize = sizeof(Data);
>      if (!SetupDiCreateDeviceInfoW(devinfo, ext->instance_id, &GUID_DEVCLASS_HIDCLASS, NULL, NULL, DICD_INHERIT_CLASSDRVS, &Data))
>      {
> +        BOOL rc = FALSE;
>          if (GetLastError() == ERROR_DEVINST_ALREADY_EXISTS)
> +            rc = SetupDiOpenDeviceInfoW(devinfo, ext->instance_id, NULL, DICD_INHERIT_CLASSDRVS, &Data);
> +        if (!rc)
>          {
> -            SetupDiDestroyDeviceInfoList(devinfo);
> -            return STATUS_SUCCESS;
> +            FIXME( "failed to Create Device Info %x\n", GetLastError());
> +            goto error;
>          }
> -        FIXME( "failed to Create Device Info %x\n", GetLastError());
> -        goto error;
>      }

This looks a bit clumsy to me.  How about moving BOOL rc to function scope and then
something like:


    rc = SetupDiCreateDeviceInfoW(devinfo, ext->instance_id, &GUID_DEVCLASS_HIDCLASS, NULL, NULL, DICD_INHERIT_CLASSDRVS, &Data))
    if (!rc && GetLastError() == ERROR_DEVINST_ALREADY_EXISTS)
        rc = SetupDiOpenDeviceInfoW(devinfo, ext->instance_id, NULL, DICD_INHERIT_CLASSDRVS, &Data);
    if (!rc)
    {
        FIXME( "failed to Create Device Info %x\n", GetLastError());
        goto error;
    }


>      if (!SetupDiRegisterDeviceInfo( devinfo, &Data, 0, NULL, NULL, NULL ))
>      {
> diff --git a/dlls/winebus.sys/main.c b/dlls/winebus.sys/main.c
> index fd68833ac3..779ba34dfb 100644
> --- a/dlls/winebus.sys/main.c
> +++ b/dlls/winebus.sys/main.c
> @@ -263,13 +263,22 @@ DEVICE_OBJECT *bus_create_hid_device(DRIVER_OBJECT *driver, const WCHAR *busidW,
>      {
>          SP_DEVINFO_DATA data;
>          WCHAR *instance;
> +        BOOL rc = FALSE;

No need for the initialization.

>  
>          data.cbSize = sizeof(data);
>          if (!(instance = get_instance_id(device)))
>              ERR("failed to generate instance id\n");
> -        else if (!SetupDiCreateDeviceInfoW(devinfo, instance, class, NULL, NULL, DICD_INHERIT_CLASSDRVS, &data))
> -            ERR("failed to create device info: %x\n", GetLastError());
> -        else if (!SetupDiRegisterDeviceInfo(devinfo, &data, 0, NULL, NULL, NULL))
> +        rc = SetupDiCreateDeviceInfoW(devinfo, instance, class, NULL, NULL, DICD_INHERIT_CLASSDRVS, &data);
> +        if (!rc)
> +        {
> +            if (GetLastError() == ERROR_DEVINST_ALREADY_EXISTS)
> +                rc = SetupDiOpenDeviceInfoW(devinfo, instance, NULL, DICD_INHERIT_CLASSDRVS, &data);
> +            if (!rc)
> +            {
> +                ERR("failed to open device info: %x\n", GetLastError());
> +            }
> +        }

And if this was also written as I suggested above it would avoid a level of indentation.

Huw.



More information about the wine-devel mailing list