디바이스의 하드웨어 인터럽트를 처리하는 WDF(Windows 드라이버 프레임워크) 드라이버는 각 디바이스가 지원할 수 있는 각 인터럽트마다 프레임워크 인터럽트 개체를 만들어야 합니다. Windows 8 이상 버전의 운영 체제에서 실행되는 프레임워크 버전 1.11 이상에서 Kernel-Mode KMDF(드라이버 프레임워크) 및 UMDF(User-Mode Driver Framework) 드라이버는 수동 수준 처리 필요한 인터럽트 개체를 만들 수 있습니다. 그러나 System on a Chip(SoC) 플랫폼용 드라이버를 작성하지 않는 한 드라이버는 DIRQL 인터럽트 개체를 사용해야 합니다.
드라이버는 일반적으로 EvtDriverDeviceAdd 콜백 함수에 프레임워크 인터럽트 개체를 만듭니다. 드라이버는 EvtDevicePrepareHardware 콜백 함수에서 인터럽트 개체를 만들 수도 있습니다.
프레임워크는 PnP(플러그 앤 플레이) 관리자가 인터럽트 벡터와 같은 시스템 리소스를 디바이스에 할당하기 전에 드라이버의 EvtDriverDeviceAdd 콜백 함수를 호출합니다. PnP 관리자가 리소스를 할당한 후 프레임워크는 디바이스의 인터럽트 개체에 인터럽트 리소스를 저장합니다. (플러그 앤 플레이를 지원하지 않는 드라이버는 인터럽트 오브젝트를 사용할 수 없습니다.)
프레임워크 인터럽트 개체를 만들려면 드라이버가 WDF_INTERRUPT_CONFIG 구조를 초기화하고 WdfInterruptCreate 메서드에 전달해야 합니다.
UMDF는 다음과 같은 유형의 인터럽트(interrupts)를 지원합니다.
- 레벨 트리거(공유 또는 전용)
- 엣지 트리거 전용 (독점적)
- MSI (정의상 배타적)
참고 UMDF는 에지 트리거 인터럽트 공유 지원하지 않습니다.
UMDF 버전 2.15부터, UMDF는 하드웨어 레지스터를 명시적으로 사용하지 않아도 되는 GPIO 핀으로 지원되는 하드웨어 푸시 버튼과 같은 간단한 장치에 대한 인터럽트를 지원합니다. 이러한 디바이스를 지원하려면 UMDF 드라이버에서 배타적인 에지 트리거 인터럽트를 사용해야 합니다.
KMDF 버전 1.15부터 KMDF는 처리 Active-Both 인터럽트설명된 해결 방법 없이 이러한 디바이스에 대한 인터럽트도 지원합니다.
또한 WDF_INTERRUPT_CONFIG에서 드라이버는 다음과 같은 드라이버 제공 이벤트 콜백 함수의 포인터를 제공합니다.
EvtInterruptEnable
하드웨어 인터럽트를 사용하도록 설정합니다.
EvtInterruptDisable(이벤트 인터럽트 비활성화)
하드웨어 인터럽트를 사용하지 않도록 설정합니다.
EvtInterruptIsr
인터럽트를 처리하는 인터럽트 서비스 루틴(ISR)입니다.
EvtInterruptDpc
인터럽트용 DPC(지연 프로시저 호출)입니다.
EvtInterruptWorkItem
수동 수준 인터럽트대한 작업 항목입니다.
Windows 8 이상 버전의 운영 체제에서 프레임워크 버전 1.11 이상을 사용하는 드라이버의 경우 드라이버는 프레임워크 인터럽트 개체(DIRQL 또는 수동)의 부모를 프레임워크 디바이스 개체 또는 프레임워크 큐 개체로 명시적으로 설정할 수 있습니다. 드라이버가 부모를 지정하는 경우 드라이버는 인터럽트 개체의 WDF_INTERRUPT_CONFIG 구조체의 AutomaticSerialization 멤버를 TRUE로 설정해야 합니다. (AutomaticSerialization TRUE이면 프레임워크는 인터럽트 개체의 EvtInterruptDpc 또는 EvtInterruptWorkItem 콜백 함수의 실행을 인터럽트의 부모 개체 아래에 있는 다른 개체의 콜백 함수와 동기화합니다.
예를 들어 드라이버는 큐를 인터럽트의 부모로 지정하여 큐의 콜백을 인터럽트의 EvtInterruptDpc 또는 EvtInterruptWorkItem 콜백과 동기화할 수 있습니다. 이 구성에서 프레임워크는 디바이스 개체를 삭제할 때 큐 개체를 삭제합니다.
WdfInterruptCreate호출한 후 드라이버는 필요에 따라 WdfInterruptSetPolicy 또는 WdfInterruptSetExtendedPolicy 호출하여 추가 인터럽트 매개 변수를 지정할 수 있습니다. 일반적으로 드라이버는 EvtDriverDeviceAdd 콜백 함수에서 이러한 메서드를 호출합니다.
프레임워크는 인터럽트의 부모를 삭제하기 전에 인터럽트 삭제를 자동으로 합니다. 필요에 따라 드라이버는 WdfObjectDelete 호출하여 이전 시간에 인터럽트를 삭제할 수 있습니다.
메시지 신호 인터럽트 지원
MSI(메시지 신호 인터럽트)는 Windows Vista부터 지원됩니다. 운영 체제가 디바이스에 대한 MSI를 지원할 수 있도록 하려면 드라이버의 INF 파일이 레지스트리에 일부 값을 설정해야 합니다. 이러한 값을 설정하는 방법에 대한 자세한 내용은 레지스트리에서 Message-Signaled 인터럽트 사용을 참조하세요.
드라이버는 디바이스에서 지원할 수 있는 각 인터럽트 벡터 또는 MSI 메시지에 대한 프레임워크 인터럽트 개체를 만들어야 합니다. PnP 관리자가 디바이스에서 지원할 수 있는 인터럽트 리소스를 모두 디바이스에 부여하지 않으면 추가 인터럽트 개체가 사용되지 않으며 해당 콜백 함수가 호출되지 않습니다.
Windows 7에서 운영 체제는 디바이스 함수당 910개 이상의 인터럽트 메시지에 대한 리소스 요청을 지원하지 않습니다. Windows 8에서 운영 체제는 디바이스 함수당 2048개 이상의 인터럽트 리소스 요청을 지원하지 않습니다.
디바이스 드라이버가 이 제한을 초과하면 디바이스가 시작되지 않을 수 있습니다. 많은 논리 프로세서가 포함된 컴퓨터에서 작동하려면 드라이버가 프로세서당 둘 이상의 인터럽트를 요청해서는 안 됩니다.
드라이버는 PnP 관리자가 리소스 요구 사항 목록에서 대체 인터럽트 리소스 집합을 디바이스에 할당하는 인터럽트 리소스의 시스템 균형을 실패 없이 허용해야 합니다. 예를 들어 디바이스에 요청된 드라이버보다 적은 수의 메시지 인터럽트를 할당할 수 있습니다. 최악의 경우 드라이버는 한 줄 기반 인터럽트만 사용하여 디바이스를 작동하도록 준비해야 합니다.