Compartir a través de


Controlar una solicitud de IRP_MN_CANCEL_STOP_DEVICE (Windows 2000 y versiones posteriores)

En primer lugar, el controlador de autobús primario debe controlar una solicitud IRP_MN_CANCEL_STOP_DEVICE para un dispositivo y, a continuación, cada controlador superior siguiente de la pila de dispositivos. Un controlador controla los IRP detención en su rutina DispatchPnP .

En respuesta a una solicitud de IRP_MN_CANCEL_STOP_DEVICE , un controlador debe devolver el dispositivo a su estado iniciado y reanudar la operación normal. Los controladores deben realizar correctamente un IRP de cancelación.

Un controlador controla una solicitud de IRP_MN_CANCEL_STOP_DEVICE con un procedimiento como el siguiente:

  1. Posponer el reinicio del dispositivo hasta que los controladores inferiores hayan completado sus operaciones de reinicio. (Consulte Posponer el procesamiento de IRP de PnP hasta que finalicen los controladores inferiores).

  2. Una vez finalizados los controladores inferiores, devuelva el dispositivo a su estado iniciado.

    Las operaciones exactas dependen del dispositivo y del controlador.

  3. Inicie irP en la cola de retención de IRP.

    Si el controlador estaba manteniendo solicitudes mientras el dispositivo estaba en estado de detención pendiente, borre la marca de HOLD_NEW_REQUESTS e inicie los IRP en la cola de retención de IRP. Consulte Mantener los IRP entrantes cuando un dispositivo está en pausa para obtener más información.

  4. Complete el IRP con IoCompleteRequest.

    • En una función o un controlador de filtro:

      La rutina de IoCompletion del controlador devolvió STATUS_MORE_PROCESSING_REQUIRED, como se describe en Posponing PnP IRP Processing Until Lower Drivers Finish, por lo que la rutina DispatchPnP del controlador debe llamar a IoCompleteRequest para reanudar el procesamiento de finalización de E/S.

      El controlador establece Irp-IoStatus.Status> en STATUS_SUCCESS, llama a IoCompleteRequest con un aumento de prioridad de IO_NO_INCREMENT y devuelve STATUS_SUCCESS de su rutina DispatchPnP.

      Los controladores no deben producir un error en esta operación. Si un controlador produce un error en el IRP de reinicio, el dispositivo está en un estado incoherente y no funcionará correctamente.

    • En un controlador de autobús primario:

      El controlador establece Irp-IoStatus.Status> en STATUS_SUCCESS y llama a IoCompleteRequest especificando un aumento de prioridad de IO_NO_INCREMENT. El controlador de autobús devuelve STATUS_SUCCESS de su rutina DispatchPnP .

      Un controlador de autobús no debe producir un error en esta operación. Si un controlador produce un error en el IRP de reinicio, el dispositivo está en un estado incoherente y no funcionará correctamente.

Un controlador puede recibir una solicitud falsa de cancelación y detención cuando se inicia y activa el dispositivo. Esto puede ocurrir, por ejemplo, si el controlador (o un controlador superior en la pila de dispositivos) produjo un error en una solicitud de IRP_MN_QUERY_STOP_DEVICE . Cuando se inicia y activa un dispositivo, los controladores pueden realizar correctamente solicitudes de cancelación falsas para el dispositivo.