Compartilhar via


Tornando um ISR ativo ou inativo

A partir do Windows 8, um driver pode chamar a rotina IoReportInterruptActive ou IoReportInterruptInactive para tornar uma ISR (rotina de serviço de interrupção) registrada ativa ou inativa.

Para registrar um ISR e conectar o ISR a uma interrupção ou um conjunto de interrupções, o driver chama a rotina IoConnectInterruptEx . Depois que o ISR for registrado, o driver poderá usar IoReportInterruptActive e IoReportInterruptInactive para executar operações leves (ou "suaves") de conexão e desconexão que deixam o registro do ISR inalterado. IoReportInterruptInactive desabilita as chamadas para o ISR desconectando-se suavemente da interrupção ou das interrupções associadas. IoReportInterruptActive conecta essas interrupções para habilitar chamadas para o ISR.

Por exemplo, um driver pode chamar IoReportInterruptInactive para desconectar temporariamente um conjunto de interrupções antes que um dispositivo saia do estado de energia D0 e chame IoReportInterruptActive para conectar-se suavemente a essas interrupções depois que o dispositivo reentrar D0. Em princípio, um driver pode, em vez disso, chamar IoDisconnectInterruptEx antes que o dispositivo saia do D0 e chamar IoConnectInterruptEx após o dispositivo reentrar em D0. No entanto, as chamadas de IoReportInterruptXxx são mais rápidas do que as chamadas IoConnectInterruptEx e IoDisconnectInterruptEx . Ao contrário das chamadas IoConnectInterruptEx e IoDisconnectInterruptEx , que podem falhar por uma variedade de motivos (por exemplo, recursos insuficientes do sistema), as chamadas de IoReportInterruptXxx raramente, se alguma vez, falham. Além disso, as rotinas IoReportInterruptXxx podem ser chamadas em IRQL <= DISPATCH_LEVEL, enquanto IoConnectInterruptEx e IoDisconnectInterruptEx só podem ser chamadas em PASSIVE_LEVEL.

Por padrão, o ISR está ativo (e as chamadas para o ISR são habilitadas) depois que IoConnectInterruptEx registra com êxito o ISR.

As chamadas para IoReportInterruptInactive e IoReportInterruptActive são opcionais. Se um driver nunca chamar essas rotinas, o ISR registrado permanecerá ativo até que o driver chame a rotina IoDisconnectInterruptEx para cancelar o registro do ISR.

O driver deve configurar o dispositivo para emitir interrupções somente quando o ISR para essas interrupções estiver ativo. Falha ao impedir que um dispositivo emita interrupções quando o ISR está inativo pode causar instabilidade do sistema. Por exemplo, se um dispositivo compartilhar uma linha de interrupção disparada em nível com outros dispositivos e o dispositivo emitir solicitações de interrupção quando o ISR estiver inativo, os ISRs para os outros dispositivos na linha não reconhecerão a interrupção e a interrupção continuará a ser disparada. Antes de chamar IoReportInterruptInactive, o driver deve configurar o dispositivo para interromper a emissão de interrupções. Depois de chamar IoReportInterruptActive, o driver deve configurar o dispositivo para iniciar a emissão de interrupções.

Para cancelar o registro de um ISR, um driver pode chamar IoDisconnectInterruptEx independentemente de o ISR estiver ativo ou inativo no momento.

Uma chamada IoReportInterruptActive que ocorre quando o ISR já está ativo não tem efeito, mas não é tratada como um erro. Da mesma forma, uma chamada IoReportInterruptInactive que ocorre quando o ISR já está inativo não tem efeito, mas não é tratada como um erro.