다음을 통해 공유


프레임워크 잠금 사용

경우에 따라 드라이버는 프레임워크 제공 동기화를 대신하거나 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 실행됩니다. 수동 수준 처리에 대한 자세한 내용은 수동 수준 인터럽트 지원을 참조하세요.