[PATCH 4/5] hidclass.sys: Stop accepting IRPs after device removal.

Rémi Bernon rbernon at codeweavers.com
Thu Jul 1 11:29:07 CDT 2021


On 7/1/21 5:16 PM, Zebediah Figura (she/her) wrote:
>> diff --git a/dlls/hidclass.sys/pnp.c b/dlls/hidclass.sys/pnp.c
>> index 5f59257cdf7..5d6fb3d068c 100644
>> --- a/dlls/hidclass.sys/pnp.c
>> +++ b/dlls/hidclass.sys/pnp.c
>> @@ -359,11 +359,24 @@ static NTSTATUS fdo_pnp(DEVICE_OBJECT *device, 
>> IRP *irp)
>>       }
>>   }
>> +static void remove_pending_irps(BASE_DEVICE_EXTENSION *ext)
>> +{
>> +    IRP *irp;
>> +
>> +    while ((irp = pop_irp_from_queue(ext)))
>> +    {
>> +        irp->IoStatus.Status = STATUS_DELETE_PENDING;
>> +        IoCompleteRequest(irp, IO_NO_INCREMENT);
>> +    }
>> +}
>> +
>>   static NTSTATUS pdo_pnp(DEVICE_OBJECT *device, IRP *irp)
>>   {
>>       IO_STACK_LOCATION *irpsp = IoGetCurrentIrpStackLocation(irp);
>>       BASE_DEVICE_EXTENSION *ext = device->DeviceExtension;
>>       NTSTATUS status = irp->IoStatus.Status;
>> +    IRP *queued_irp;
>> +    KIRQL irql;
>>       TRACE("irp %p, minor function %#x.\n", irp, irpsp->MinorFunction);
>> @@ -453,12 +466,14 @@ static NTSTATUS pdo_pnp(DEVICE_OBJECT *device, 
>> IRP *irp)
>>                   
>> IoSetDeviceInterfaceState(&ext->u.pdo.mouse_link_name, TRUE);
>>               if (ext->u.pdo.is_keyboard)
>>                   
>> IoSetDeviceInterfaceState(&ext->u.pdo.keyboard_link_name, TRUE);
>> +
>> +            ext->u.pdo.removed = FALSE;
>>               status = STATUS_SUCCESS;
>>               break;
>>           case IRP_MN_REMOVE_DEVICE:
>>           {
>> -            IRP *queued_irp;
>> +            remove_pending_irps(ext);
> 
> In that case there's no reason to delete queued IRPs later in the handler.
> 

Well, according to [1] it's what we are supposed to do:

> 4. Prevent any new I/O operations on the device.
> 
> [...]
> 
> 5. Fail outstanding I/O requests on the device.

[1] 
https://docs.microsoft.com/en-us/windows-hardware/drivers/kernel/handling-an-irp-mn-surprise-removal-request

-- 
Rémi Bernon <rbernon at codeweavers.com>



More information about the wine-devel mailing list