ISR 활성 또는 비활성 만들기

Windows 8 시작하여 드라이버는 IoReportInterruptActive 또는 IoReportInterruptInactive 루틴을 호출하여 ISR(등록된 인터럽트 서비스 루틴)을 활성 또는 비활성 상태로 만들 수 있습니다.

ISR을 등록하고 ISR을 인터럽트 또는 인터럽트 집합에 연결하기 위해 드라이버는 IoConnectInterruptEx 루틴을 호출합니다. ISR이 등록되면 드라이버는 IoReportInterruptActiveIoReportInterruptInactive 를 사용하여 ISR의 등록을 변경하지 않고 경량(또는 "소프트") 연결 및 연결 끊기 작업을 수행할 수 있습니다. IoReportInterruptInactive 는 연결된 인터럽트 또는 인터럽트의 연결을 일시 끊어 ISR에 대한 호출을 사용하지 않도록 설정합니다. IoReportInterruptActive 는 이러한 인터럽트를 소프트 연결하여 ISR에 대한 호출을 사용하도록 설정합니다.

예를 들어 드라이버가 IoReportInterruptInactive 를 호출하여 디바이스가 D0 전원 상태를 종료하기 전에 인터럽트 집합을 일시 분리하고 IoReportInterruptActive 를 호출하여 디바이스가 D0을 다시 입력한 후 이러한 인터럽트를 소프트 연결합니다. 원칙적으로 드라이버는 디바이스가 D0을 종료하기 전에 IoDisconnectInterruptEx 를 호출하고 디바이스가 D0을 다시 입력한 후 IoConnectInterruptEx 를 호출할 수 있습니다. 그러나 IoReportInterruptXxx 호출은 IoConnectInterruptExIoDisconnectInterruptEx 호출보다 빠릅니다. 다양한 이유(예: 시스템 리소스 부족)로 인해 실패할 수 있는 IoConnectInterruptExIoDisconnectInterruptEx 호출과 달리 IoReportInterruptXxx 호출은 거의 실패하지 않습니다. 또한 IoReportInterruptXxx 루틴은 IRQL <= DISPATCH_LEVEL 호출할 수 있지만 IoConnectInterruptExIoDisconnectInterruptEx 는 PASSIVE_LEVEL 호출할 수 있습니다.

기본적으로 IoConnectInterruptEx 가 ISR을 성공적으로 등록한 후 ISR이 활성화되고 ISR에 대한 호출이 활성화됩니다.

IoReportInterruptInactiveIoReportInterruptActive에 대한 호출은 선택 사항입니다. 드라이버가 이러한 루틴을 호출하지 않으면 드라이버가 IoDisconnectInterruptEx 루틴을 호출하여 ISR의 등록을 취소할 때까지 등록된 ISR이 활성 상태로 유지됩니다.

드라이버는 이러한 인터럽트용 ISR이 활성 상태인 경우에만 인터럽트 발급을 위해 디바이스를 구성해야 합니다. ISR이 비활성 상태일 때 디바이스가 인터럽트 발급을 방지하지 못하면 시스템 불안정이 발생할 수 있습니다. 예를 들어 디바이스가 수준 트리거 인터럽트 라인을 다른 디바이스와 공유하고 ISR이 비활성 상태일 때 디바이스가 인터럽트 요청을 발급하는 경우 줄에 있는 다른 디바이스의 ISR은 인터럽트 확인을 승인하지 않으며 인터럽트는 계속 발생합니다. IoReportInterruptInactive를 호출하기 전에 드라이버는 인터럽트 발급을 중지하도록 디바이스를 구성해야 합니다. IoReportInterruptActive를 호출한 후 드라이버는 인터럽트 발급을 시작하도록 디바이스를 구성해야 합니다.

ISR의 등록을 취소하기 위해 드라이버는 ISR이 현재 활성 상태인지 비활성 상태인지에 관계없이 IoDisconnectInterruptEx 를 호출할 수 있습니다.

ISR이 이미 활성 상태일 때 발생하는 IoReportInterruptActive 호출은 효과가 없지만 오류로 처리되지 않습니다. 마찬가지로 ISR이 이미 비활성 상태일 때 발생하는 IoReportInterruptInactive 호출은 효과가 없지만 오류로 처리되지는 않습니다.