Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Начиная с 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 независимо от того, активен ли ISR в настоящее время или неактивен.
Вызов IoReportInterruptActive , который возникает, когда ISR уже активен, не действует, но не рассматривается как ошибка. Аналогичным образом, вызов IoReportInterruptInactive , который возникает, когда ISR уже неактивен, не действует, но не рассматривается как ошибка.