PFLT_PRE_OPERATION_CALLBACK 콜백 함수(fltkernel.h)
미니필터 드라이버의 PFLT_PRE_OPERATION_CALLBACK 루틴은 I/O 작업에 대한 사전 작업 처리를 수행합니다.
구문
PFLT_PRE_OPERATION_CALLBACK PfltPreOperationCallback;
FLT_PREOP_CALLBACK_STATUS PfltPreOperationCallback(
[in, out] PFLT_CALLBACK_DATA Data,
[in] PCFLT_RELATED_OBJECTS FltObjects,
[out] PVOID *CompletionContext
)
{...}
매개 변수
[in, out] Data
I/O 작업에 대한 콜백 데이터(FLT_CALLBACK_DATA) 구조체에 대한 포인터입니다.
[in] FltObjects
현재 I/O 요청과 관련된 개체에 대한 불투명 포인터를 포함하는 FLT_RELATED_OBJECTS 구조체에 대한 포인터입니다.
[out] CompletionContext
이 콜백 루틴이 FLT_PREOP_SUCCESS_WITH_CALLBACK 또는 FLT_PREOP_SYNCHRONIZE 반환하는 경우 이 매개 변수는 해당 작업 후 콜백 루틴에 전달할 선택적 컨텍스트 포인터입니다. 그렇지 않으면 NULL이어야 합니다.
반환 값
이 콜백 루틴은 다음 FLT_PREOP_CALLBACK_STATUS 값 중 하나를 반환합니다.
반환 코드 | 설명 |
---|---|
FLT_PREOP_COMPLETE | 미니필터가 I/O 작업을 완료하고 있습니다. 자세한 내용은 설명을 참조하세요. |
FLT_PREOP_DISALLOW_FASTIO | 작업은 빠른 I/O 작업이며 미니필터는 이 작업에 빠른 I/O 경로를 사용할 수 없습니다. 자세한 내용은 설명을 참조하세요. |
FLT_PREOP_PENDING | 미니필터가 I/O 작업을 보류했으며 작업이 보류 중입니다. 자세한 내용은 설명을 참조하세요. |
FLT_PREOP_SUCCESS_NO_CALLBACK | 미니필터는 추가 처리를 위해 I/O 작업을 FltMgr 로 반환합니다. 이 경우 FltMgr 은 I/O 완료 중에 미니필터 드라이버의 작업 후 콜백(있는 경우)을 호출하지 않습니다. |
FLT_PREOP_SUCCESS_WITH_CALLBACK | 미니필터는 추가 처리를 위해 I/O 작업을 FltMgr 로 반환합니다. 이 경우 FltMgr 은 I/O를 완료하는 동안 미니필터의 작업 후 콜백을 호출합니다. |
FLT_PREOP_SYNCHRONIZE | 미니필터는 추가 처리를 위해 I/O 작업을 FltMgr 로 반환하지만 작업을 완료하지 않습니다. 자세한 내용은 설명을 참조하세요. |
FLT_PREOP_DISALLOW_FSFILTER_IO | 미니필터는 빠른 QueryOpen 작업을 허용하지 않고 작업을 느린 경로 아래로 강제합니다. 이렇게 하면 I/O 관리자가 파일의 열기/쿼리/닫기를 수행하여 요청을 서비스합니다. 미니필터 드라이버는 QueryOpen에 대한 이 상태 반환해야 합니다. |
설명
자세한 내용은 사전 작업 콜백 루틴 작성 을 참조하세요.
미니필터의 사전 작업 콜백 루틴은 하나 이상의 I/O 작업을 처리합니다. (이 콜백 루틴은 레거시 필터 모델의 디스패치 루틴과 유사합니다.)
미니필터는 콜백 루틴의 진입점을 FLT_REGISTRATION 구조체의 OperationRegistration 배열에 저장하여 특정 유형의 I/O 작업에 대한 사전 작업 콜백 루틴을 등록합니다. 미니필터는 DriverEntry 루틴에서 이 구조를 FltRegisterFilter에 매개 변수로 전달합니다. 미니필터는 작업 후 콜백(PFLT_POST_OPERATION_CALLBACK) 루틴을 등록하지 않고 지정된 유형의 I/O 작업에 대한 사전 작업 콜백 루틴을 등록할 수 있으며 그 반대의 경우도 마찬가지입니다.
미니필터 드라이버의 사전 작업 또는 사후 작업 콜백 루틴은 작업에 대한 콜백 데이터 구조의 내용을 수정할 수 있습니다. 이 경우 콜백 데이터 구조의 IoStatus 필드의 내용을 변경하지 않는 한 FltSetCallbackDataDirty를 호출해야 합니다.
이 일반 콜백 루틴에 대한 IRQL은 특정 IO 경로에 따라 달라집니다. 현재 IRQL을 알아야 하는 경우 KeGetCurrentIRQL 을 빠르고 저렴하게 호출할 수 있습니다. IRQL에 대한 추가 정보는 사전 작업 콜백 루틴 작성 을 참조하세요.
파일 시스템은 파일 끝에 쓰기 및 읽기 작업을 기본 파일 스토리지 디바이스의 섹터 크기의 배수로 반올림합니다. 사전 읽기 또는 사전 쓰기 작업을 처리할 때 할당 및 스왑 버퍼를 사용하는 필터는 할당된 버퍼의 크기를 연결된 디바이스의 섹터 크기의 배수까지 반올림해야 합니다. 그렇지 않은 경우 기본 파일 시스템에서 전송되는 데이터의 길이가 버퍼의 할당된 길이를 초과합니다. 버퍼 교환에 대한 자세한 내용은 SwapBuffers Minifilter 샘플을 참조하세요.
Windows 8 시작해서 CompletionContext는 작업 결과에 따라 유효한 컨텍스트 값을 정의하는 Flt_CompletionContext_Outptr 주석을 사용합니다. 다음은 CompletionContext에 대한 주석이 있는 콜백에 대한 사용 예제입니다.
FLT_PREOP_CALLBACK_STATUS
SwapPreReadBuffers(
_Inout_ PFLT_CALLBACK_DATA Data,
_In_ PCFLT_RELATED_OBJECTS FltObjects,
_Flt_CompletionContext_Outptr_ PVOID *CompletionContext
);
FLT_PREOP_COMPLETE 반환
이 루틴이 FLT_PREOP_COMPLETE 반환하는 경우 콜백 데이터 구조의 IoStatus.Status 필드를 I/O 작업의 최종 NTSTATUS 값으로 설정해야 합니다. 이 NTSTATUS 값은 STATUS_PENDING 수 없습니다. 정리 또는 닫기 작업의 경우 정리 및 닫기 작업이 실패할 수 없으므로 STATUS_PENDING 이외의 성공 NTSTATUS 값이어야 합니다.
이 루틴이 FLT_PREOP_COMPLETE 반환하는 경우 FltMgr 은 드라이버 스택의 호출자 아래의 미니필터 드라이버나 파일 시스템에 I/O 작업을 보내지 않습니다. 이 경우 FltMgr 은 드라이버 스택의 호출자 위에 있는 미니필터 드라이버의 사후 작업 콜백 루틴만 호출합니다.
FLT_PREOP_DISALLOW_FASTIO 반환
이 루틴이 FLT_PREOP_DISALLOW_FASTIO 반환하는 경우 FltMgr이 이 필드를 자동으로 STATUS_FLT_DISALLOW_FAST_IO 설정하므로 콜백 데이터 구조의 IoStatus.Status 필드를 설정해서는 안 됩니다.
FLT_PREOP_DISALLOW_FASTIO 빠른 I/O 작업에 대해서만 반환할 수 있습니다. 지정된 콜백 데이터 구조가 빠른 I/O 작업을 나타내는지 여부를 확인하려면 FLT_IS_FASTIO_OPERATION 매크로를 사용합니다.
이 루틴이 FLT_PREOP_DISALLOW_FASTIO 반환하는 경우 FltMgr 은 드라이버 스택의 호출자 아래 또는 파일 시스템에 빠른 I/O 작업을 모든 미니필터 드라이버에 보내지 않습니다. 이 경우 FltMgr 은 드라이버 스택의 호출자 위에 있는 미니필터 드라이버의 사후 작업 콜백 루틴만 호출합니다.
FLT_PREOP_PENDING 반환
IRP 기반 I/O 작업만 보류할 수 있으므로 IRP 기반 I/O 작업에 대해서만 FLT_PREOP_PENDING 반환할 수 있습니다. 지정된 콜백 데이터 구조가 IRP 기반 I/O 작업을 나타내는지 여부를 확인하려면 FLT_IS_IRP_OPERATION 매크로를 사용합니다.
이 루틴이 FLT_PREOP_PENDING 반환하면 FltMgr은 미니필터 드라이버가 FltCompletePendedPreOperation을 호출할 때까지 I/O 작업을 더 이상 처리하지 않습니다.
FLT_PREOP_SYNCHRONIZE 반환
미니필터의 사전 작업 콜백 루틴이 FLT_PREOP_SYNCHRONIZE 반환하는 경우 미니필터는 작업에 해당하는 작업 후 콜백을 등록해야 합니다. 이 루틴이 FLT_PREOP_SYNCHRONIZE 반환하면 FltMgr 은 IRQL <= APC_LEVEL 현재 스레드의 컨텍스트에서 미니필터의 사후 작업 콜백을 호출합니다.
FLT_PREOP_SYNCHRONIZE IRP 기반 I/O 작업에 대해서만 반환되어야 합니다. IRP 기반 작업이 아닌 I/O 작업에 대해 반환되는 경우 FltMgr 은 이 반환 값을 FLT_PREOP_SUCCESS_WITH_CALLBACK 것처럼 처리합니다.
이러한 작업은 FltMgr에 의해 이미 동기화되어 있으므로 미니필터 드라이버는 만들기 작업에 대한 FLT_PREOP_SYNCHRONIZE 반환해서는 안 됩니다.
미니필터는 비동기 읽기 및 쓰기 작업에 대한 FLT_PREOP_SYNCHRONIZE 반환해서는 안 됩니다. 이렇게 하면 미니필터 드라이버와 시스템 성능이 크게 저하됩니다.
요구 사항
요구 사항 | 값 |
---|---|
지원되는 최소 클라이언트 | SP4, Windows XP SP2, Windows Server 2003 SP1 이상 Windows 운영 체제용 Microsoft Windows 2000 업데이트 롤업 1 |
대상 플랫폼 | 데스크톱 |
머리글 | fltkernel.h(FltKernel.h 포함) |
IRQL | 설명 섹션을 참조하세요. |