Control de una solicitud de IRP_MN_STOP_DEVICE (Windows 2000 y versiones posteriores)
El controlador superior de la pila del dispositivo controla primero una solicitud de IRP_MN_STOP_DEVICE y, a continuación, cada controlador inferior siguiente. Un controlador controla los IRP detención en su rutina DispatchPnP .
Un controlador controla una solicitud de IRP_MN_STOP_DEVICE con un procedimiento como el siguiente:
Asegúrese de que el dispositivo está en pausa.
Si un controlador no ha pausado completamente el dispositivo en respuesta a la solicitud de IRP_MN_QUERY_STOP_DEVICE , debe hacerlo ahora. Establezca una marca de HOLD_NEW_REQUESTS en la extensión de dispositivo y realice cualquier otra operación necesaria para pausar el dispositivo.
El dispositivo podría perder energía durante la operación de reequilibrio de recursos y, por tanto, podría perder el estado del dispositivo. Los controladores del dispositivo deben guardar cualquier información de estado del dispositivo y restaurarla cuando reciban la solicitud de IRP_MN_START_DEVICE posterior.
Libere los recursos de hardware para el dispositivo.
En un controlador de función, las operaciones exactas dependen del dispositivo y del controlador, pero pueden incluir la desconexión de una interrupción con IoDisconnectInterrupt, liberar intervalos de direcciones físicas con MmUnmapIoSpace y liberar puertos de E/S.
Si un controlador de bus o filtro adquirió recursos de hardware para el dispositivo, ese controlador debe liberar los recursos en respuesta a una solicitud de IRP_MN_STOP_DEVICE .
Establezca Irp-IoStatus.Status> en STATUS_SUCCESS.
Pase el IRP al siguiente controlador inferior o complete el IRP.
En un controlador de filtro o función, configure la siguiente ubicación de pila con IoSkipCurrentIrpStackLocation, pase irP al siguiente controlador inferior con IoCallDriver y devuelva el estado de IoCallDriver como estado devuelto de la rutina DispatchPnP . No complete el IRP.
En un controlador de autobús, complete el IRP mediante IoCompleteRequest con IO_NO_INCREMENT y vuelva de la rutina DispatchPnP .
Mientras el dispositivo se detiene para reequilibrar los recursos, un controlador no puede iniciar ningún IRP que accedan al dispositivo. Un controlador debe poner en cola estos IRP, como se describe en Retención de IRP entrantes cuando un dispositivo está en pausa o si el controlador no implementa una cola de retención de IRP y no debe quitar solicitudes de E/S.