다음을 통해 공유


PFLT_POST_OPERATION_CALLBACK 콜백 함수(fltkernel.h)

미니필터 드라이버는 하나 이상의 형식 PFLT_POST_OPERATION_CALLBACK 루틴을 등록하여 I/O 작업에 대한 완료 처리를 수행할 수 있습니다.

구문

PFLT_POST_OPERATION_CALLBACK PfltPostOperationCallback;

FLT_POSTOP_CALLBACK_STATUS PfltPostOperationCallback(
  [in, out]      PFLT_CALLBACK_DATA Data,
  [in]           PCFLT_RELATED_OBJECTS FltObjects,
  [in, optional] PVOID CompletionContext,
  [in]           FLT_POST_OPERATION_FLAGS Flags
)
{...}

매개 변수

[in, out] Data

I/O 작업에 대한 콜백 데이터 FLT_CALLBACK_DATA 구조체에 대한 포인터입니다.

[in] FltObjects

필터 관리자에 대한 포인터는 현재 I /O 요청과 관련된 개체에 대한 불투명 포인터를 포함하는 FLT_RELATED_OBJECTS 구조체를 유지 관리합니다.

[in, optional] CompletionContext

미니필터 드라이버의 사전 작업 콜백 PFLT_PRE_OPERATION_CALLBACK 루틴에서 반환된 컨텍스트 포인터입니다. CompletionContext 포인터는 사전 작업 콜백 루틴에서 사후 작업 콜백 루틴으로 정보를 전달하는 방법을 제공합니다.

[in] Flags

작업 후 콜백을 수행하는 방법을 지정하는 플래그의 비트 마스크입니다.

플래그 의미
FLTFL_POST_OPERATION_DRAINING 필터 관리자는 미니필터 드라이버 instance 분리 중이며 미니필터 드라이버의 완료 컨텍스트를 클린 위해 이 사후 작업 콜백 루틴이 호출되고 있음을 나타내도록 이 플래그를 설정합니다. 작업 후 콜백은 FLT_POSTOP_FINISHED_PROCESSING 반환해야 합니다. 이 플래그를 설정하면 데이터 매개 변수는 원래 콜백 데이터 구조가 아닌 작업에 대한 원래 콜백 데이터 구조의 복사본을 가리킵니다. 또한 이 플래그가 설정되면 IRQL <= APC_LEVEL 사후 작업 콜백 루틴이 호출됩니다.

반환 값

이 콜백 루틴은 다음 상태 값 중 하나를 반환합니다.

반환 코드 설명
FLT_POSTOP_FINISHED_PROCESSING
미니필터 드라이버는 I/O 작업에 대한 완료 처리를 완료했으며 작업의 제어를 필터 관리자에 반환합니다.

작업 후 콜백이 이 상태 값을 반환한 후 필터 관리자는 I/O 작업의 완료 처리를 계속합니다.

FLT_POSTOP_MORE_PROCESSING_REQUIRED
미니필터 드라이버가 I/O 작업에 대한 완료 처리를 중단했지만 필터 관리자에 작업 제어를 반환하지는 않습니다.

미니필터 드라이버의 작업 후 콜백은 미니필터 드라이버의 작업 후 콜백이 I/O 작업을 작업 큐에 게시한 경우에만 이 상태 값을 반환할 수 있습니다. 미니필터 드라이버는 결국 I/O 작업의 완료 처리를 다시 시작해야 합니다.

작업 후 콜백이 FLT_POSTOP_MORE_PROCESSING_REQUIRED 반환한 후 필터 관리자는 다음 조건이 모두 충족되지 않는 한 I/O 작업의 추가 완료 처리를 수행하지 않습니다.

  • 작업 후 콜백이 작업 큐에 I/O 작업을 게시했습니다.
  • 작업 루틴이 작업에 대한 완료 처리를 수행한 후 FltCompletePendedPostOperation 을 호출하여 작업 제어를 필터 관리자에 반환합니다.
이 상태 값은 IRP 기반 I/O 작업에 대해서만 반환할 수 있습니다. 지정된 콜백 데이터 구조가 IRP 기반 I/O 작업을 나타내는지 여부를 확인하려면 FLT_IS_IRP_OPERATION 매크로를 사용합니다.
FLT_POSTOP_DISALLOW_FSFILTER_IO
미니필터 드라이버는 빠른 QueryOpen 작업을 허용하지 않고 작업을 느린 경로로 강제 적용합니다. 이렇게 하면 I/O 관리자가 파일의 열기/쿼리/닫기를 수행하여 요청을 서비스합니다. 미니필터 드라이버는 QueryOpen에 대해서만 이 상태 반환해야 합니다.

설명

미니필터 드라이버의 작업 후 콜백 루틴은 하나 이상의 I/O 작업에 대한 완료 처리를 수행합니다.

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

사후 작업 콜백 루틴은 IRQL <= DISPATCH_LEVEL 임의 스레드 컨텍스트에서 호출됩니다. 이 콜백 루틴은 IRQL DISPATCH_LEVEL 호출할 수 있으므로 다음 제약 조건이 적용됩니다.

  • 더 낮은 IRQL에서 실행해야 하는 커널 모드 루틴을 안전하게 호출할 수 없습니다.
  • 이 루틴에 사용되는 모든 데이터 구조는 비페이지 풀에서 할당되어야 합니다.
  • 그것은 페이지 할 수 없습니다.
  • 리소스, 뮤텍스 또는 빠른 뮤텍스를 가져올 수 없습니다. 그러나 스핀 잠금을 획득할 수 있습니다.
  • 컨텍스트를 가져오기, 설정 또는 삭제할 수는 없지만 컨텍스트를 해제할 수 있습니다.

IRQL < DISPATCH_LEVEL 수행해야 하는 I/O 완료 처리는 사후 작업 콜백 루틴에서 직접 수행할 수 없습니다. 대신 FltDoCompletionProcessingWhenSafe 또는 FltQueueDeferredIoWorkItem과 같은 루틴을 호출하여 작업 큐에 게시해야 합니다.

작업 후 콜백의 Flags 매개 변수에 FLTFL_POST_OPERATION_DRAINING 비트 집합이 있는 경우 FltDoCompletionProcessingWhenSafe를 호출해서는 안 됩니다. 이 규칙에 대한 예외는 다음과 같습니다.

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

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

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

요구 사항

요구 사항
지원되는 최소 클라이언트 SP4, Windows XP SP2, Windows Server 2003 SP1 이상 Windows 운영 체제용 Microsoft Windows 2000 업데이트 롤업 1에서 사용할 수 있습니다.
대상 플랫폼 데스크톱
머리글 fltkernel.h(FltKernel.h 포함)
IRQL 설명 섹션을 참조하세요.

추가 정보

FLT_CALLBACK_DATA

FLT_IO_PARAMETER_BLOCK

FLT_IS_FASTIO_OPERATION

FLT_IS_IRP_OPERATION

FLT_IS_REISSUED_IO

FLT_IS_SYSTEM_BUFFER

FLT_REGISTRATION

FLT_RELATED_OBJECTS

FltCancelFileOpen

FltCompletePendedPostOperation

FltDoCompletionProcessingWhenSafe

FltQueueDeferredIoWorkItem

FltRegisterFilter

FltSetCallbackDataDirty

PFLT_PRE_OPERATION_CALLBACK