Controlar un IRP de System Query-Power en un controlador de filtro o función
Un controlador de filtro o función (que no es el propietario de la directiva de energía para un dispositivo) debe pasar un IRP de consulta del sistema al controlador inferior siguiente, en los pasos siguientes:
Llame a IoAcquireRemoveLock, pasando el IRP actual, para asegurarse de que el controlador no recibe una solicitud de IRP_MN_REMOVE_DEVICE PnP mientras controla el IRP de energía.
Si IoAcquireRemoveLock devuelve un estado de error, el controlador no debe seguir procesando el IRP. En su lugar, a partir de Windows Vista, el controlador debe llamar a IoCompleteRequest para completar el IRP y devolver el estado de error. En Windows Server 2003, Windows XP y Windows 2000, el controlador debe llamar a PoStartNextPowerIrp, llamar a IoCompleteRequest para completar el IRP y devolver el estado de error.
Determine si debe producir un error en la consulta. Para obtener instrucciones, consulte Error de un irP del sistema Query-Power en un controlador de filtro o función y procesamiento completo, como se describe en esa sección.
Llame a PoStartNextPowerIrp. (Solo Windows Server 2003, Windows XP y Windows 2000)
Establezca la ubicación de la pila IRP (IoSkipCurrentIrpStackLocation o IoCopyCurrentIrpStackLocationToNext). El controlador puede establecer una rutina de IoCompletion en el IRP, pero hacerlo rara vez es necesario.
Llame a IoCallDriver (en Windows 7 y Windows Vista) o PoCallDriver (en Windows Server 2003, Windows XP y Windows 2000) para pasar el IRP al controlador inferior siguiente.
Llame a IoReleaseRemoveLock. Sin embargo, si el controlador establece una rutina de IoCompletion para irP, realice esta llamada desde la rutina ioCompletion en su lugar.
Devuelve STATUS_PENDING de su rutina DispatchPower .