다음을 통해 공유


프레임워크 잠금 사용

드라이버가 I/O 요청 관련 콜백 함수의 드라이버별 동기화를 프레임워크 제공 동기화에 대한 대체 기능으로 제공해야 하는 경우도 있습니다. 드라이버는 콜백 동기화 잠금, 스핀 잠금, 대기 잠금 및 인터럽트 잠금을 사용하여 드라이버 코드를 동기화할 수 있습니다.

콜백 동기화 잠금

프레임워크의 자동 동기화 기능을 사용하도록 드라이버를 설정한 경우 프레임워크는 드라이버의 I/O 요청 관련 이벤트 콜백 함수를 호출하기 전에 동기화 잠금을 획득합니다.

프레임워크 장치 개체와 큐 개체에 연결된 이러한 콜백 동기화 잠금은 드라이버에서 획득할 수도 있습니다. 동기화 잠금을 획득하기 위해 드라이버는 WdfObjectAcquireLock호출합니다. 잠금을 해제하기 위해 드라이버는 WdfObjectReleaseLock호출합니다.

드라이버가 프레임워크의 디바이스 수준 또는 큐 수준의 동기화를 사용하여 I/O 요청 관련 콜백 함수를 사용하는 경우, 그리고 IRQL = PASSIVE_LEVEL에서 실행되는 일부 코드와 IRQL = DISPATCH_LEVEL에서 실행되는 콜백 함수를 동기화해야 한다면, 드라이버에 콜백 동기화 잠금을 사용하도록 하는 것이 좋습니다. 드라이버가 동일한 IRQL에서 실행되는 콜백 함수에 대해서만 자동 동기화를 사용할 수 있기 때문입니다.

예를 들어 작업 항목 개체의 부모에 대한 실행 수준이 WdfExecutionLevelPassive 경우에만 드라이버가 작업 항목 개체에 대해 자동 동기화를 사용할 수 있습니다(작업 항목의 콜백 함수는 항상 IRQL= PASSIVE_LEVEL 실행되므로). 따라서 드라이버가 디바이스 개체의 WDF_OBJECT_ATTRIBUTES 구조의 ExecutionLevel 멤버에서 WdfExecutionLevelDispatch 지정하는 경우 드라이버는 자식 작업 항목 개체의 구성 구조에 AutomaticSerialization 멤버를 설정할 수 없습니다. 대신 드라이버는 콜백 동기화 잠금을 획득하여 EvtWorkItem 콜백 함수를 부모 디바이스 개체의 콜백 함수와 동기화해야 합니다.

프레임워크 대기 잠금

프레임워크 대기 잠금을 사용하여 IRQL = PASSIVE_LEVEL 실행되는 코드에서 드라이버 데이터에 대한 액세스를 동기화합니다. 드라이버가 프레임워크 대기 잠금을 사용하려면 먼저 WdfWaitLockCreate 호출하여 대기 잠금 개체를 만들어야 합니다. 그런 다음 드라이버는 WdfWaitLockAcquire 호출하여 잠금을 획득하고 WdfWaitLockRelease해제할 수 있습니다.

프레임워크 스핀 잠금

프레임워크 스핀 잠금을 사용하여 IRQL <= DISPATCH_LEVEL 실행되는 코드에서 드라이버 데이터에 대한 액세스를 동기화합니다. 드라이버 스레드가 스핀 잠금을 획득하면 시스템은 스레드의 IRQL을 DISPATCH_LEVEL 설정합니다. 스레드가 잠금을 해제하면 시스템은 스레드의 IRQL을 이전 수준으로 복원합니다.

자동 프레임워크 동기화를 사용하지 않는 드라이버는, 컨텍스트 공간이 쓰기 가능하고 드라이버의 여러 이벤트 콜백 함수가 해당 공간에 접근하는 경우, 스핀 잠금을 사용하여 디바이스 객체의 컨텍스트 공간에 대한 접근을 동기화할 수 있습니다.

드라이버가 프레임워크 스핀 잠금을 사용하려면 먼저 WdfSpinLockCreate 호출하여 스핀 잠금 개체를 만들어야 합니다. 그런 다음 드라이버는 WdfSpinLockAcquire 호출하여 잠금을 획득하고 WdfSpinLockRelease해제할 수 있습니다.

스핀 락의 사용 예제는 보낸 요청을 동기화하여 취소하는 것을 참조하세요.

프레임워크 인터럽트 잠금장치

DIRQL 인터럽트 처리를 지원하는 인터럽트 개체의 경우 프레임워크 인터럽트 잠금은 스핀 잠금입니다. 드라이버가 인터럽트 스핀 잠금을 획득하면 드라이버가 잠금을 해제할 때까지 디바이스의 DIRQL에서 실행됩니다. 인터럽트 잠금 사용에 대한 자세한 내용은 인터럽트 코드 동기화 참조하세요.

수동 수준 처리를 지원하는 인터럽트 개체의 경우 프레임워크 인터럽트 잠금은 대기 잠금입니다. 드라이버가 인터럽트 대기 잠금을 획득하면, 드라이버는 잠금을 해제할 때까지 IRQL = PASSIVE_LEVEL에서 실행됩니다. 수동 수준 처리에 대한 자세한 내용은 수동 수준 인터럽트 지원을 참조하세요.