WdfInterruptAcquireLock 함수(wdfinterrupt.h)
[KMDF 및 UMDF에 적용]
WdfInterruptAcquireLock 메서드는 인터럽트 개체의 스핀 잠금을 유지하면서 디바이스의 DIRQL(디바이스 인터럽트 요청 수준)에서 실행되는 코드 시퀀스를 시작합니다.
수동 수준 인터럽트 개체의 경우 메서드는 인터럽트 개체의 수동 잠금을 유지하면서 수동 수준에서 실행되는 코드 시퀀스를 시작합니다.
구문론
void WdfInterruptAcquireLock(
[in] WDFINTERRUPT Interrupt
);
매개 변수
[in] Interrupt
프레임워크 인터럽트 개체에 대한 핸들입니다.
반환 값
없음
비고
드라이버에서 잘못된 개체 핸들을 제공하면 버그 검사가 수행됩니다.
드라이버가 DIRQL 인터럽트 개체에서 WdfInterruptAcquireLock 호출하면 시스템은 프로세서의 IRQL을 디바이스의 DIRQL로 올리고 인터럽트 개체의 WDF_INTERRUPT_CONFIG 구조에 지정된 드라이버가 스핀 잠금을 획득합니다. 따라서 인터럽트 개체의 EvtInterruptIsr 및 EvtInterruptSynchronize 콜백 함수(및 동일한 인터럽트 개체에 대해 WdfInterruptAcquireLock 호출하는 다른 코드)는 실행할 수 없습니다.
드라이버가 WdfInterruptReleaseLock호출하면 시스템은 프로세서의 IRQL을 이전 수준으로 반환하고 스핀 잠금을 해제합니다.
드라이버가 수동 수준 인터럽트 개체에서 WdfInterruptAcquireLock 호출하면 시스템은 인터럽트 개체의 WDF_INTERRUPT_CONFIG 구조에서 드라이버가 구성한 수동 수준 인터럽트 잠금을 획득합니다.
드라이버가 WdfInterruptReleaseLock 호출하면 시스템에서 인터럽트 잠금을 해제합니다.
수동 수준 인터럽트의 경우 드라이버는 IRQL = PASSIVE_LEVEL WdfInterruptAcquireLock 호출해야 합니다.
요청 처리기같은 임의의 스레드 컨텍스트에서 WdfInterruptAcquireLock 호출하지 마세요.
WdfInterruptAcquireLock 및 WdfInterruptReleaseLock 사용하여 드라이버가 선점되지 않고 디바이스 인터럽트를 효과적으로 사용하지 않도록 설정하지 않고 몇 줄의 코드를 실행해야 하는 경우 사용할 수 있습니다. 더 큰 코드 섹션의 경우 드라이버는 EvtInterruptSynchronize 콜백 함수를 제공해야 합니다.
프레임워크가 드라이버의 EvtInterruptEnable 콜백 함수를 호출하거나 프레임워크가 드라이버의 EvtInterruptDisable 콜백 함수를 호출한 후에는 WdfInterruptAcquireLock 호출할 수 없습니다.
드라이버가 WdfInterruptAcquireLock 호출한 후에는 WdfInterruptReleaseLock호출하기 전에 동일한 인터럽트 개체에 대해 메서드를 다시 호출해서는 안 됩니다.
WdfInterruptAcquireLock 메서드에 대한 자세한 내용은 인터럽트 코드 동기화 참조하세요.
프레임워크 기반 드라이버에서 인터럽트 처리에 대한 자세한 내용은 하드웨어 인터럽트 처리참조하세요.
수동 수준 인터럽트 개체의 경우 드라이버는 큐 개체 콜백 함수같은 임의의 스레드에서 실행되는 경우 WdfInterruptAcquireLock대신 WdfInterruptTryToAcquireLock 호출해야 합니다. 예를 들어 드라이버는 EvtIoReadWdfInterruptTryToAcquireLock 호출할 수 있습니다.
이렇게 하면 다음 시나리오에 설명된 대로 교착 상태가 발생할 가능성을 방지할 수 있습니다.
- 디바이스가 중단되었는지 확인하기 위해 SPB 주변 장치용 함수 드라이버는 수동 수준 인터럽트 잠금이 유지된 상태에서 ISR 내에서 해당 버스로 I/O를 보냅니다.
- 버스 드라이버는 위의 요청을 받은 동일한 스레드에서 두 번째 요청을 완료합니다.
- 두 번째 요청의 완료 루틴은 주변 드라이버에 요청을 보냅니다.
- 주변 드라이버의 I/O 디스패치 루틴은 WdfInterruptAcquireLock 호출합니다. 그러면 인터럽트 개체의 수동 잠금을 획득하려고 시도하는 교착 상태가 발생합니다.
요구 사항
요구 사항 | 가치 |
---|---|
대상 플랫폼 | 보편적 |
최소 KMDF 버전 | 1.0 |
최소 UMDF 버전 | 2.0 |
헤더 | wdfinterrupt.h(Wdf.h 포함) |
IRQL | <= DIRQL |
DDI 규정 준수 규칙 | DriverCreate(kmdf), KmdfIrql(kmdf), KmdfIrql2(kmdf), KmdfIrqlExplicit(kmdf), WdfInterruptLock(kmdf), WdfInterruptLockRelease(kmdf) |