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 사후 작업 콜백 루틴이 호출됩니다. |
반환 값
이 콜백 루틴은 다음 상태 값 중 하나를 반환합니다.
반환 코드 | 설명 |
---|---|
|
미니필터 드라이버는 I/O 작업에 대한 완료 처리를 완료했으며 작업의 제어를 필터 관리자에 반환합니다.
작업 후 콜백이 이 상태 값을 반환한 후 필터 관리자는 I/O 작업의 완료 처리를 계속합니다. |
|
미니필터 드라이버가 I/O 작업에 대한 완료 처리를 중단했지만 필터 관리자에 작업 제어를 반환하지는 않습니다.
미니필터 드라이버의 작업 후 콜백은 미니필터 드라이버의 작업 후 콜백이 I/O 작업을 작업 큐에 게시한 경우에만 이 상태 값을 반환할 수 있습니다. 미니필터 드라이버는 결국 I/O 작업의 완료 처리를 다시 시작해야 합니다. 작업 후 콜백이 FLT_POSTOP_MORE_PROCESSING_REQUIRED 반환한 후 필터 관리자는 다음 조건이 모두 충족되지 않는 한 I/O 작업의 추가 완료 처리를 수행하지 않습니다.
|
|
미니필터 드라이버는 빠른 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 | 설명 섹션을 참조하세요. |
추가 정보
FltCompletePendedPostOperation