다음을 통해 공유


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 작업을 동기화할 수 없습니다.

FLT_PREOP_SYNCHRONIZE 이러한 작업에 대해 반환할 수 없습니다.