[PATCH 5/5] winebus.sys: Use irp IoStatus.Status consistently.

Zebediah Figura (she/her) zfigura at codeweavers.com
Thu Aug 12 12:10:15 CDT 2021


On 8/12/21 2:47 AM, Rémi Bernon wrote:
>           case IOCTL_HID_READ_REPORT:
>           {
>               TRACE_(hid_report)("IOCTL_HID_READ_REPORT\n");
> -            status = ext->vtbl->begin_report_processing(device);
> -            if (status != STATUS_SUCCESS)
> -            {
> -                irp->IoStatus.Status = status;
> -                break;
> -            }
> +            irp->IoStatus.Status = ext->vtbl->begin_report_processing(device);
> +            if (irp->IoStatus.Status != STATUS_SUCCESS) break;
>               if (!ext->last_report_read)
>               {
> -                irp->IoStatus.Status = status = deliver_last_report(ext,
> +                irp->IoStatus.Status = deliver_last_report(ext,
>                       buffer_len, irp->UserBuffer, &irp->IoStatus.Information);
>                   ext->last_report_read = TRUE;
>               }
>               else
>               {
>                   InsertTailList(&ext->irp_queue, &irp->Tail.Overlay.ListEntry);
> -                status = STATUS_PENDING;
> +                irp->IoStatus.Status = STATUS_PENDING;
>               }
>               break;
>           }

If you return STATUS_PENDING and queue the IRP here...

> @@ -990,9 +982,8 @@ static NTSTATUS WINAPI hid_internal_dispatch(DEVICE_OBJECT *device, IRP *irp)
>   
>       LeaveCriticalSection(&ext->cs);

...and release the CS here, then the IRP can be completed before you 
access it...

>   
> -    if (status != STATUS_PENDING)
> -        IoCompleteRequest(irp, IO_NO_INCREMENT);
> -
> +    status = irp->IoStatus.Status;

...here.

This is kind of the reason that I've gone for the pattern

     switch (ioctl)
     {
         case X:
             status = STATUS_SUCCESS;
             break;

         case Y:
             status = STATUS_PENDING;
             IoMarkIrpPending(irp);
             queue_irp(irp);
             break;
     }

     if (status != STATUS_PENDING)
     {
         irp->IoStatus.Status = status;
         IoCompleteRequest(irp);
     }
     return status;

in other ntoskrnl code; it's almost the same amount of code and less 
easy to get wrong.

> +    if (status != STATUS_PENDING) IoCompleteRequest(irp, IO_NO_INCREMENT);
>       return status;
>   }



More information about the wine-devel mailing list