경고
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 시작하기를 참조하세요.
인터럽트 데이터 버퍼에 액세스하는 모든 드라이버 코드는 한 번에 하나의 루틴만 데이터에 액세스하게 되도록 동기화되어야 합니다.
수동 인터럽트 잠금 또는 자동 콜백 직렬화를 사용하여 인터럽트 코드를 동기화할 수 있습니다.
수동 인터럽트 잠그기
UMDF는 OnInterruptIsr, OnInterruptDisable, 또는 OnInterruptEnable 콜백을 호출하기 전에 인터럽트 잠금을 획득합니다.
드라이버가 인터럽트 잠금을 사용하여 코드를 동기화해야 하는 경우 IWDFInterrupt::AcquireInterruptLock 및 IWDFInterrupt::ReleaseInterruptLock을 호출합니다. 예를 들어 드라이버는 이러한 메서드를 사용하여 OnInterruptWorkItem 콜백 루틴에서 인터럽트 잠금을 획득하고 해제합니다. 그러나 I/O 디스패치 콜백(예: OnRead 및 OnWrite)에서 드라이버는 먼저 IWDFInterrupt::TryToAcquireInterruptLock 을 호출하여 작업 항목을 큐에 추가할지 아니면 교착 상태를 방지하기 위해 동일한 스레드에서 작업을 수행할지 결정합니다. 임의 스레드 컨텍스트에서 IWDFInterrupt::AcquireInterruptLock 을 호출하여 발생할 수 있는 교착 상태 시나리오의 예는 IWDFInterrupt::AcquireInterruptLock의 설명 섹션을 참조하세요.
IWDFInterrupt::TryToAcquireInterruptLock이 TRUE를 반환하는 경우 드라이버는 동일한 스레드에서 인터럽트 잠금을 획득했습니다. 이 경우 드라이버는 해당 잠금이 필요한 작업을 수행한 다음 ReleaseInterruptLock을 호출합니다. IWDFInterrupt::TryToAcquireInterruptLock이 FALSE를 반환하면 드라이버는 작업 항목을 큐에 대기시키고 OnWorkItem 콜백에서 작업을 수행합니다. 이 경우 작업 항목은 자동 직렬화를 사용해서는 안 됩니다.
자동 직렬화 사용
UMDF 드라이버는 LockType 매개 변수가 WdfDeviceLevel로 설정된 IWDFDeviceInitialize::SetLockingConstraint를 호출하여 자동 콜백 동기화를 요청할 수 있습니다.
그런 다음, 드라이버는 CreateInterrupt를 호출하기 전에 WUDF_INTERRUPT_CONFIG 구조체의 AutomaticSerialization 멤버를 TRUE로 설정합니다.
결과적으로 UMDF는 I/O 큐, 요청 취소 및 파일 개체 콜백 루틴을 사용하여 드라이버의 OnInterruptWorkItem 콜백을 직렬화합니다. 이 시나리오에서 UMDF는 인터럽트당 개체 잠금 대신 콜백 잠금을 사용합니다.