Mantener los IRP entrantes cuando un dispositivo está en pausa
Los controladores de un dispositivo deben pausar el dispositivo cuando se reequilibran sus recursos. Durante el reequilibrio de recursos, algunos controladores pausan el dispositivo en respuesta a una solicitud de IRP_MN_QUERY_STOP_DEVICE y otros controladores retrasan la pausa del dispositivo hasta que reciben la solicitud de IRP_MN_STOP_DEVICE . En cualquier caso, el dispositivo debe pausarse cuando la IRP_MN_STOP_DEVICE se realiza correctamente.
Los controladores deben finalizar los IRP en curso en el dispositivo y no iniciar los nuevos IRP que requieran acceso al dispositivo.
Para contener IRP mientras un dispositivo está en pausa, un controlador implementa un procedimiento como el siguiente:
En su rutina AddDevice , defina una marca en la extensión de dispositivo con un nombre como HOLD_NEW_REQUESTS. Borre la marca.
Cree una cola FIFO para contener IRP.
Si el controlador ya pone en cola los IRP, puede volver a usar la misma cola porque el controlador es necesario para finalizar las solicitudes pendientes antes de pausar el dispositivo.
Si el controlador aún no tiene una cola IRP, debe crear una en su rutina AddDevice . El tipo de cola que crea depende de cómo vacíe el controlador de la cola. Un controlador puede usar una lista vinculada interbloqueada y doblemente vinculada y las rutinas De listaXxxinterlocked .
En su código DispatchPnP para IRP_MN_QUERY_STOP_DEVICE (o IRP_MN_STOP_DEVICE), finalice las solicitudes pendientes y establezca la marca HOLD_NEW_REQUESTS.
En una rutina de envío que accede al dispositivo, como DispatchWrite o DispatchRead, compruebe si está establecida la marca HOLD_NEW_REQUESTS. Si es así, el controlador debe marcar el IRP pendiente y ponerlo en cola.
La rutina DispatchPnP del controlador debe seguir procesando IRP de PnP en lugar de contenerlas y la rutina DispatchPower debe seguir procesando los IRP de energía.
En DispatchPnP, en respuesta a un IRP de inicio o cancelación, borre la marca de HOLD_NEW_REQUESTS e inicie los IRP en la cola de retención de IRP.
Estas acciones son probablemente los últimos pasos para procesar estos IRP de PnP. Por ejemplo, en respuesta a un IRP de inicio, el controlador debe realizar primero las operaciones para iniciar el dispositivo y, a continuación, puede iniciar los IRP en la cola de retención de IRP.
Los errores en el procesamiento de IRP desde la cola de retención de IRP no afectan al estado devuelto para los IRP de inicio o cancelación.