다음을 통해 공유


사후 콜백 루틴 작성

파일 시스템 미니필터 드라이버는 하나 이상의 사후 콜백 루틴을 사용하여 I/O 작업을 필터링합니다.

사후 작업 콜백 루틴은 다음 작업 중 하나를 수행할 수 있습니다.

  • 사후 작업 루틴에서 직접 완료 작업을 수행합니다. 모든 완료 작업은 IRQL <= DISPATCH_LEVEL 수행할 수 있습니다.
  • 안전한 IRQL에서 완료 작업을 수행합니다. FLT_STATUS_MORE_PROCESSING_REQUIRED 반환하고 작업자 스레드를 큐에 대기하여 안전한 IRQL에서 처리를 허용합니다. 처리가 완료되면 작업자 스레드는 FltCompletePendedPostOperation 을 호출하여 사후 처리를 계속합니다.
  • 성공적인 CREATE 작업을 취소합니다.

사후 작업 콜백 루틴 은 레거시 파일 시스템 필터 드라이버에 사용되는 완료 루틴 과 유사합니다.

미니필터 드라이버는 미니필터 드라이버가 DriverEntry 루틴에서 FltRegisterFilter에 매개 변수로 전달하는 FLT_REGISTRATION 구조체의 OperationRegistration 멤버에 콜백 루틴의 진입점을 저장하여 사전 운용 콜백 루틴을 등록하는 것과 같은 방식으로 특정 유형의 I/O 작업에 대한 사후 콜백 루틴을 등록합니다.

미니필터 드라이버는 사전 작업 또는 사후 콜백 루틴을 등록한 이러한 유형의 I/O 작업만 받습니다. 미니필터 드라이버는 사후 콜백을 등록하지 않고 지정된 유형의 I/O 작업에 대한 사전 운용 콜백 루틴을 등록할 수 있으며 그 반대의 경우도 마찬가지입니다.

모든 사후 콜백 루틴은 다음과 같이 정의됩니다.

typedef FLT_POSTOP_CALLBACK_STATUS 
(*PFLT_POST_OPERATION_CALLBACK) ( 
    IN OUT PFLT_CALLBACK_DATA Data, 
    IN PCFLT_RELATED_OBJECTS FltObjects, 
    IN PVOID CompletionContext, 
    IN FLT_POST_OPERATION_FLAGS Flags 
    ); 

완료 루틴과 마찬가지로 사후 콜백 루틴은 임의 스레드 컨텍스트에서 IRQL <= DISPATCH_LEVEL 호출됩니다.

IRQL = DISPATCH_LEVEL 호출할 수 있으므로 사후 작업 콜백 루틴은 FltLockUserBuffer 또는 RtlCompareUnicodeString과 같은 하위 IRQL에서 호출해야 하는 커널 모드 루틴을 호출할 수 없습니다. 같은 이유로 사후 작업 콜백 루틴에 사용되는 모든 데이터 구조는 비페이지 풀에서 할당되어야 합니다.

다음 상황은 이전 규칙의 몇 가지 예외입니다.

  • 미니필터 드라이버의 사전 운용 콜백 루틴이 IRP 기반 I/O 작업에 대한 FLT_PREOP_SYNCHRONIZE 반환하는 경우 해당 사후 작업 콜백 루틴은 사전 운용 콜백 루틴과 동일한 스레드 컨텍스트에서 IRQL <= APC_LEVEL 호출됩니다.

  • 빠른 I/O 작업에 대한 사후 작업 콜백 루틴은 사전 운용 콜백 루틴과 동일한 스레드 컨텍스트에서 IRQL = PASSIVE_LEVEL 호출됩니다.

  • 생성 후 콜백 루틴은 IRP_MJ_CREATE 작업을 시작한 스레드의 컨텍스트에서 IRQL = PASSIVE_LEVEL 호출됩니다.

필터 관리자가 지정된 I/O 작업에 대해 미니필터 드라이버의 사후 콜백 루틴을 호출하면 미니필터 드라이버가 I/O 작업을 일시적으로 제어합니다. 미니필터 드라이버는 다음 중 하나를 수행할 때까지 이 컨트롤을 유지합니다.

  • 사후 콜백 루틴에서 FLT_POSTOP_FINISHED_PROCESSING 반환합니다.

  • 작업 후 콜백 루틴에서 보류된 IRP 기반 I/O 작업을 처리한 작업 루틴에서 FltCompletePendedPostOperation 을 호출합니다.

이 단원에는 다음이 포함됩니다.

I/O 작업에 대한 완료 처리 수행

작업 후 콜백 루틴에서 I/O 작업 보류 중

사후 콜백 루틴에서 I/O 작업 실패