Поделиться через


Как сделать ISR активным или неактивным

Начиная с Windows 8, драйвер может вызывать подпрограмму IoReportInterruptActive или IoReportInterruptInactive, чтобы сделать зарегистрированную подпрограмму службы прерываний (ISR) активной или неактивной.

Чтобы зарегистрировать ISR и подключить ISR к прерыванию или набору прерываний, драйвер вызывает подпрограмму IoConnectInterruptEx . После регистрации ISR драйвер может использовать IoReportInterruptActive и IoReportInterruptInactive для выполнения упрощенных (или "мягких") операций подключения и отключения, которые оставляют регистрацию ISR без изменений. IoReportInterruptInactive отключает вызовы ISR путем обратимого отключения связанного прерывания или прерываний. IoReportInterruptActive обеспечивает обратимое подключение этих прерываний для включения вызовов ISR.

Например, драйвер может вызвать IoReportInterruptInactive для обратимого отключения набора прерываний, прежде чем устройство выйдет из состояния питания D0, и вызвать IoReportInterruptActive для обратимого подключения этих прерываний после повторного ввода D0 устройства. В принципе драйвер может вместо этого вызвать IoDisconnectInterruptEx до выхода устройства из D0 и вызвать IoConnectInterruptEx после повторного ввода D0. Однако вызовы IoReportInterruptXxx выполняются быстрее, чем вызовы IoConnectInterruptEx и IoDisconnectInterruptEx . В отличие от вызовов IoConnectInterruptEx и IoDisconnectInterruptEx , которые могут завершиться сбоем по различным причинам (например, из-за нехватки системных ресурсов), вызовы IoReportInterruptXxx редко, если когда-либо, завершаются сбоем. Кроме того, подпрограммы IoReportInterruptXxx можно вызывать по адресу IRQL <= DISPATCH_LEVEL, тогда как IoConnectInterruptEx и IoDisconnectInterruptEx можно вызывать только в PASSIVE_LEVEL.

По умолчанию ISR активен (и включены вызовы ISR) после успешной регистрации ISR IoConnectInterruptEx .

Вызовы IoReportInterruptInactive и IoReportInterruptActive являются необязательными. Если драйвер никогда не вызывает эти подпрограммы, зарегистрированный ISR остается активным до тех пор, пока драйвер не вызовет подпрограмму IoDisconnectInterruptEx для отмены регистрации ISR.

Драйвер должен настроить устройство на выдачу прерываний только в том случае, если isr для этих прерываний активен. Если isr неактивен, устройство не может выдавать прерывания, это может привести к нестабильной работе системы. Например, если устройство совместно использует линию прерывания уровня с другими устройствами, а устройство выдает запросы прерывания, когда ISR неактивна, isR для других устройств в строке не будут подтверждать прерывание, и прерывание будет продолжать срабатывать. Перед вызовом IoReportInterruptInactive драйвер должен настроить устройство для прекращения прерываний. После вызова IoReportInterruptActive драйвер должен настроить устройство для запуска прерываний.

Чтобы отменить регистрацию ISR, драйвер может вызвать IoDisconnectInterruptEx независимо от того, активна или неактивна.

Вызов IoReportInterruptActive , который происходит, когда ISR уже активен, не влияет, но не обрабатывается как ошибка. Аналогичным образом, вызов IoReportInterruptInactive , который происходит, когда ISR уже неактивен, не влияет, но не обрабатывается как ошибка.