FLT_PREOP_SYNCHRONIZE 반환
참고
미니필터 드라이버는 FLT_PREOP_SYNCHRONIZE 사용하여 사전 및 사후 작업 호출에서 리소스를 보유해서는 안 됩니다(I/O 호출에서 리소스를 보유해서는 안 됨). 이렇게 하는 것은 교착 상태가 발생할 수 있으므로 안전하지 않습니다.
미니필터 드라이버의 사전 작업 콜백 루틴 이 FLT_PREOP_SYNCHRONIZE 반환하여 I/O 작업을 동기화하는 경우 필터 관리자는 I/O 완료 중에 해당 필터의 작업 후 콜백 루틴 을 호출합니다.
- 필터가 드레이닝되지 않는 경우 필터 관리자는 IRQL <= APC_LEVEL 사전 작업 콜백과 동일한 스레드 컨텍스트에서 해당 필터의 작업 후 콜백 루틴을 호출합니다. (이 스레드 컨텍스트가 반드시 원래 스레드의 컨텍스트는 아닙니다.)
- 필터가 드레이닝되는 경우 필터 관리자는 원래 스레드로 다시 동기화되지 않습니다.
참고
필터의 사전 작업 콜백 루틴이 FLT_PREOP_SYNCHRONIZE 반환하는 경우 작업에 대한 사후 작업 콜백 루틴을 구현해야 합니다.
필터의 사전 작업 콜백 루틴이 FLT_PREOP_SYNCHRONIZE 반환하는 경우 CompletionContext 출력 매개 변수에 NULL이 아닌 값을 반환할 수 있습니다. 이 매개 변수는 해당 작업 후 콜백 루틴에 전달되는 선택적 컨텍스트 포인터입니다. 사후 작업 콜백 루틴은 CompletionContext 입력 매개 변수에서 이 포인터를 받습니다.
미니필터 드라이버의 사전 작업 콜백 루틴은 IRP 기반 I/O 작업에 대해서만 FLT_PREOP_SYNCHRONIZE 반환해야 합니다. 그러나 이 상태 값은 다른 작업 유형에 대해 반환될 수 있습니다. IRP 기반 I/O 작업이 아닌 I/O 작업에 대해 반환되는 경우 필터 관리자는 이 반환 값을 FLT_PREOP_SUCCESS_WITH_CALLBACK 것처럼 처리합니다. 작업이 IRP 기반 I/O 작업인지 확인하려면 FLT_IS_IRP_OPERATION 매크로를 사용합니다.
필터는 필터 관리자에 의해 이미 동기화되어 있으므로 만들기 작업에 대한 FLT_PREOP_SYNCHRONIZE 반환해서는 안 됩니다. 미니필터 드라이버가 IRP_MJ_CREATE 작업에 대한 사전 작업 및 사후 작업 콜백 루틴을 등록한 경우 사전 만들기 콜백 루틴과 동일한 스레드 컨텍스트에서 IRQL = PASSIVE_LEVEL 사후 생성 콜백 루틴이 호출됩니다.
미니필터 드라이버는 비동기 읽기 또는 쓰기 작업에 대한 FLT_PREOP_SYNCHRONIZE 반환해서는 안 됩니다. 이렇게 하면 미니필터 드라이버와 시스템 성능이 심각하게 저하될 수 있으며 수정된 페이지 기록기 스레드가 차단되는 경우 교착 상태가 발생할 수도 있습니다. IRP 기반 읽기 또는 쓰기 작업에 대한 FLT_PREOP_SYNCHRONIZE 반환하기 전에 미니필터 드라이버는 FltIsOperationSynchronous를 호출하여 작업이 동기인지 확인해야 합니다.
다음 유형의 I/O 작업을 동기화할 수 없습니다.
FSCTL(Oplock 파일 시스템 제어) 작업(MajorFunction 은 IRP_MJ_FILE_SYSTEM_CONTROL; FsControlCode 는 FSCTL_REQUEST_FILTER_OPLOCK, FSCTL_REQUEST_BATCH_OPLOCK, FSCTL_REQUEST_OPLOCK_LEVEL_1 또는 FSCTL_REQUEST_OPLOCK_LEVEL_2.)
변경 디렉터리 작업 알림(MajorFunction 은 IRP_MJ_DIRECTORY_CONTROL. MinorFunction 은 IRP_MN_NOTIFY_CHANGE_DIRECTORY.)
바이트 범위 잠금 요청(MajorFunction 은 IRP_MJ_LOCK_CONTROL. MinorFunction 은 IRP_MN_LOCK.)
FLT_PREOP_SYNCHRONIZE 이러한 작업에 대해 반환할 수 없습니다.