WdfInterruptAcquireLock 함수(wdfinterrupt.h)

[KMDF 및 UMDF에 적용]

WdfInterruptAcquireLock 메서드는 인터럽트 개체의 스핀 잠금을 유지하면서 디바이스의 DIRQL(디바이스 인터럽트 요청 수준)에서 실행되는 코드 시퀀스를 시작합니다.

수동 수준 인터럽트 개체의 경우 메서드는 인터럽트 개체의 수동 잠금을 유지하면서 수동 수준에서 실행되는 코드 시퀀스를 시작합니다.

구문

void WdfInterruptAcquireLock(
  [in] WDFINTERRUPT Interrupt
);

매개 변수

[in] Interrupt

프레임워크 인터럽트 개체에 대한 핸들입니다.

설명

드라이버가 잘못된 개체 핸들을 제공하는 경우 버그 검사 발생합니다.

드라이버가 DIRQL 인터럽트 개체에서 WdfInterruptAcquireLock 을 호출하면 시스템은 프로세서의 IRQL을 디바이스의 DIRQL로 올리고 인터럽트 개체의 WDF_INTERRUPT_CONFIG 구조에 지정된 드라이버가 지정한 스핀 잠금을 획득합니다. 결과적으로 인터럽트 개체의 EvtInterruptIsrEvtInterruptSynchronize 콜백 함수(및 동일한 인터럽트 개체에 대해 WdfInterruptAcquireLock 을 호출하는 다른 코드)는 실행할 수 없습니다.

드라이버가 WdfInterruptReleaseLock을 호출하면 시스템은 프로세서의 IRQL을 이전 수준으로 반환하고 스핀 잠금을 해제합니다.

드라이버가 수동 수준 인터럽트 개체에서 WdfInterruptAcquireLock 을 호출하면 시스템은 드라이버가 인터럽트 개체의 WDF_INTERRUPT_CONFIG 구조에 구성된 수동 수준 인터럽트 잠금을 획득합니다.

드라이버가 WdfInterruptReleaseLock을 호출하면 시스템에서 인터럽트 잠금을 해제합니다.

수동 수준 인터럽트의 경우 드라이버는 IRQL = PASSIVE_LEVEL WdfInterruptAcquireLock 을 호출해야 합니다.

요청 처리기와 같은 임의의 스레드 컨텍스트에서 WdfInterruptAcquireLock을 호출하지 마세요.

드라이버가 선점되지 않고 디바이스 인터럽트 서비스를 효과적으로 사용하지 않도록 설정하지 않고 몇 줄의 코드를 실행해야 하는 경우 WdfInterruptAcquireLockWdfInterruptReleaseLock 을 사용할 수 있습니다. 더 큰 코드 섹션의 경우 드라이버는 EvtInterruptSynchronize 콜백 함수를 제공해야 합니다.

프레임워크가 드라이버의 EvtInterruptEnable 콜백 함수를 호출하거나 프레임워크가 드라이버의 EvtInterruptDisable 콜백 함수를 호출한 후에는 드라이버가 WdfInterruptAcquireLock을 호출할 수 없습니다.

드라이버 가 WdfInterruptAcquireLock을 호출한 후에는 WdfInterruptReleaseLock을 호출하기 전에 동일한 인터럽트 개체에 대해 메서드를 다시 호출해서는 안 됩니다.

WdfInterruptAcquireLock 메서드에 대한 자세한 내용은 인터럽트 코드 동기화를 참조하세요.

프레임워크 기반 드라이버에서 인터럽트 처리에 대한 자세한 내용은 하드웨어 인터럽트 처리를 참조하세요.

수동 수준 인터럽트 개체의 경우 드라이버는 큐 개체 콜백 함수와 같은 임의의 스레드에서 실행할 때 WdfInterruptAcquireLock 대신 WdfInterruptTryToAcquireLock을 호출해야 합니다. 예를 들어 드라이버는 EvtIoRead에서 WdfInterruptTryToAcquireLock을 호출할 수 있습니다.

이렇게 하면 다음 시나리오에 설명된 대로 교착 상태가 발생할 가능성이 방지됩니다.

  1. 디바이스가 중단되었는지 확인하기 위해 SPB 주변 장치용 함수 드라이버는 수동 수준 인터럽트 잠금이 유지된 상태에서 ISR 내에서 버스로 I/O를 보냅니다.
  2. 버스 드라이버는 위의 요청을 받은 동일한 스레드에서 두 번째 요청을 완료합니다.
  3. 두 번째 요청의 완료 루틴은 주변 장치 드라이버에 요청을 보냅니다.
  4. 주변 장치 드라이버의 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)

추가 정보