Hacer un ISR activo o inactivo

A partir de Windows 8, un controlador puede llamar a la rutina IoReportInterruptActive o IoReportInterruptInactive para que una rutina de servicio de interrupción registrada (ISR) esté activa o inactiva.

Para registrar un ISR y conectar el ISR a una interrupción o a un conjunto de interrupciones, el controlador llama a la rutina IoConnectInterruptEx . Una vez registrado el ISR, el controlador puede usar IoReportInterruptActive e IoReportInterruptInactive para realizar operaciones ligeras (o "suaves") de conexión y desconexión que dejan sin cambios el registro del ISR. IoReportInterruptInactive deshabilita las llamadas al ISR desconectando temporalmente la interrupción o las interrupciones asociadas. IoReportInterruptActive conecta estas interrupciones para habilitar las llamadas al ISR.

Por ejemplo, un controlador podría llamar a IoReportInterruptInactive para desconectar temporalmente un conjunto de interrupciones antes de que un dispositivo salga del estado de alimentación D0 y llamar a IoReportInterruptActive para conectar temporalmente estas interrupciones después de que el dispositivo vuelva a escribir D0. En principio, un controlador podría llamar a IoDisconnectInterruptEx antes de que el dispositivo salga de D0 y llamar a IoConnectInterruptEx después de que el dispositivo vuelva a escribir D0. Sin embargo, las llamadas IoReportInterruptXxx son más rápidas que las llamadas IoConnectInterruptEx e IoDisconnectInterruptEx . A diferencia de las llamadas IoConnectInterruptEx e IoDisconnectInterruptEx , lo que podría producir un error por diversos motivos (por ejemplo, recursos del sistema insuficientes), las llamadas IoReportInterruptXxx rara vez, si alguna vez, producen un error. Además, se puede llamar a las rutinas IoReportInterruptXxx en IRQL <= DISPATCH_LEVEL, mientras que ioConnectInterruptEx e IoDisconnectInterruptEx solo se pueden llamar en PASSIVE_LEVEL.

De forma predeterminada, el ISR está activo (y las llamadas al ISR están habilitadas) después de que IoConnectInterruptEx registre correctamente el ISR.

Las llamadas a IoReportInterruptInactive y IoReportInterruptActive son opcionales. Si un controlador nunca llama a estas rutinas, el ISR registrado permanece activo hasta que el controlador llama a la rutina IoDisconnectInterruptEx para anular el registro del ISR.

El controlador debe configurar el dispositivo para que emita interrupciones solo cuando el ISR de estas interrupciones esté activo. Si no se impide que un dispositivo emita interrupciones cuando el ISR está inactivo, podría provocar inestabilidad del sistema. Por ejemplo, si un dispositivo comparte una línea de interrupción desencadenada por el nivel con otros dispositivos, y el dispositivo emite solicitudes de interrupción cuando el ISR está inactivo, los ISR para los demás dispositivos de la línea no reconocerán la interrupción y la interrupción seguirá activando. Antes de llamar a IoReportInterruptInactive, el controlador debe configurar el dispositivo para dejar de emitir interrupciones. Después de llamar a IoReportInterruptActive, el controlador debe configurar el dispositivo para empezar a emitir interrupciones.

Para anular el registro de un ISR, un controlador puede llamar a IoDisconnectInterruptEx independientemente de si el ISR está activo o inactivo actualmente.

Una llamada a IoReportInterruptActive que se produce cuando el ISR ya está activo no tiene ningún efecto, pero no se trata como un error. Del mismo modo, una llamada IoReportInterruptInactive que se produce cuando el ISR ya está inactivo no tiene ningún efecto, pero no se trata como un error.