다음을 통해 공유


인터럽트 코드 동기화(UMDF 1)

경고

UMDF 2는 UMDF의 최신 버전이며 UMDF 1을 대체합니다. 모든 새 UMDF 드라이버는 UMDF 2를 사용하여 작성해야 합니다. UMDF 1에 새 기능이 추가되지 않으며 최신 버전의 Windows 10 UMDF 1에 대한 지원이 제한되어 있습니다. 유니버설 Windows 드라이버는 UMDF 2를 사용해야 합니다.

보관된 UMDF 1 샘플은 Windows 11 버전 22H2 - 2022년 5월 드라이버 샘플 업데이트에서 찾을 수 있습니다.

자세한 내용은 UMDF를 사용하여 시작 참조하세요.

인터럽트 데이터 버퍼에 액세스하는 모든 드라이버 코드는 한 번에 하나의 루틴만 데이터에 액세스할 수 있도록 동기화되어야 합니다.

수동 인터럽트 잠금 또는 자동 콜백 serialization을 사용하여 인터럽트 코드를 동기화할 수 있습니다.

수동 인터럽트 잠금

UMDF는 OnInterruptIsr, OnInterruptDisable 또는 OnInterruptEnable 콜백을 호출하기 전에 인터럽 트 잠금을 획득합니다.

드라이버가 인터럽트 잠금을 사용하여 코드를 동기화해야 하는 경우 IWDFInterrupt::AcquireInterruptLockIWDFInterrupt::ReleaseInterruptLock을 호출합니다. 예를 들어 드라이버는 이러한 메서드를 사용하여 OnInterruptWorkItem 콜백 루틴에서 인터럽트 잠금을 획득하고 해제합니다. 그러나 I/O 디스패치 콜백(예: OnReadOnWrite)에서 드라이버는 먼저 IWDFInterrupt::TryToAcquireInterruptLock 을 호출하여 작업 항목을 큐에 추가할지 아니면 잠재적 교착 상태를 방지하기 위해 동일한 스레드에서 작업을 수행할지 결정합니다. 임의 스레드 컨텍스트에서 IWDFInterrupt::AcquireInterruptLock 을 호출하여 발생할 수 있는 교착 상태 시나리오의 예는 IWDFInterrupt::AcquireInterruptLock의 설명 섹션을 참조하세요.

IWDFInterrupt::TryToAcquireInterruptLockTRUE를 반환하면 드라이버가 동일한 스레드에서 인터럽트 잠금을 획득했습니다. 이 경우 드라이버는 해당 잠금이 필요한 작업을 수행한 다음 ReleaseInterruptLock을 호출합니다. IWDFInterrupt::TryToAcquireInterruptLockFALSE를 반환하면 드라이버는 작업 항목을 큐에 대기시키고 OnWorkItem 콜백에서 작업을 수행합니다. 이 경우 작업 항목에서 자동 serialization을 사용하면 안됩니다.

자동 직렬화 사용

UMDF 드라이버는 LockType 매개 변수가 WdfDeviceLevel로 설정된 IWDFDeviceInitialize::SetLockingConstraint를 호출하여 자동 콜백 동기화를 요청할 수 있습니다.

그런 다음, 드라이버는 CreateInterrupt를 호출하기 전에 WUDF_INTERRUPT_CONFIG 구조체의 AutomaticSerialization 멤버를 TRUE로 설정합니다.

결과적으로 UMDF는 I/O 큐, 요청 취소 및 파일 개체 콜백 루틴을 사용하여 드라이버의 OnInterruptWorkItem 콜백을 직렬화합니다. 이 시나리오에서 UMDF는 인터럽트당 개체 잠금 대신 콜백 잠금을 사용합니다.