FltRequestOperationStatusCallback 함수(fltkernel.h)

FltRequestOperationStatusCallback은 지정된 I/O 작업에 대한 상태 정보를 반환합니다.

구문

NTSTATUS FLTAPI FltRequestOperationStatusCallback(
  [in]           PFLT_CALLBACK_DATA                 Data,
  [in]           PFLT_GET_OPERATION_STATUS_CALLBACK CallbackRoutine,
  [in, optional] PVOID                              RequesterContext
);

매개 변수

[in] Data

I/O 작업에 대한 콜백 데이터(FLT_CALLBACK_DATA) 구조체에 대한 포인터입니다. 이 매개 변수는 필수이며 NULL일 수 없습니다.

[in] CallbackRoutine

IoCallDriver가 반환된 후 필터 관리자가 호출하는 콜백 루틴에 대한 포인터입니다. 이 매개 변수는 필수이며 NULL일 수 없습니다.

[in, optional] RequesterContext

CallbackRoutine에 전달할 컨텍스트 포인터입니다. 이 매개 변수는 선택 사항이며 NULL일 수 있습니다.

반환 값

FltRequestOperationStatusCallback 은 STATUS_SUCCESS 또는 다음 중 하나와 같은 적절한 NTSTATUS 값을 반환합니다.

반환 코드 설명
STATUS_FLT_DELETING_OBJECT
미니필터 드라이버의 instance 철거되고 있습니다. 오류 코드입니다.
STATUS_INSUFFICIENT_RESOURCES
FltRequestOperationStatusCallback 에서 풀 할당 오류가 발생했습니다. 오류 코드입니다.
STATUS_INVALID_PARAMETER
FltRequestOperationStatusCallbackPFLT_PRE_OPERATION_CALLBACK(사전 작업 콜백) 루틴이 아닌 루틴에서 호출되었거나 I/O 작업이 IRP_MJ_CLOSE 요청이었습니다. 오류 코드입니다.

설명

미니필터 드라이버는 IRP 기반 I/O 작업에 대해 FltRequestOperationStatusCallback을 호출하여 IoCallDriver가 작업에 대해 반환한 상태 값을 가져올 수 있습니다.

대부분의 미니필터 드라이버는 FltRequestOperationStatusCallback을 호출할 필요가 없습니다. 일반적으로 미니필터 드라이버는 요청된 oplock이 부여되었는지 여부를 확인하기 위해 이 루틴만 호출합니다.

FltRequestOperationStatusCallback 은 미니필터 드라이버의 PFLT_PRE_OPERATION_CALLBACK(사전 작동 콜백) 루틴에서만 호출할 수 있습니다.

FltRequestOperationStatusCallback 은 IRP_MJ_CLOSE IRP 기반이 아닌 작업에 대해서만 호출할 수 있습니다. 작업이 IRP 기반 작업인지 확인하려면 FLT_IS_IRP_OPERATION 매크로를 사용합니다.

IRP 기반 작업이 IRP_MJ_CLOSE 요청인 경우 STATUS_INVALID_PARAMETER 반환됩니다.

FltRequestOperationStatusCallback 은 I/O 매개 변수 블록(FLT_IO_PARAMETER_BLOCK)의 내용을 콜백 데이터(FLT_CALLBACK_DATA)의 Iopb 멤버에 복사하며, 이는 필터 관리자가 CallbackRoutine 매개 변수에 지정된 루틴에 전달하는 콜백 데이터입니다. 복사된 데이터는 PFLT_PRE_OPERATION_CALLBACK(사전 운용 콜백) 루틴이 FltRequestOperationStatusCallback을 호출할 때 I/O 매개 변수 블록의 스냅샷 나타냅니다. FltRequestOperationStatusCallback을 호출한 후 사전 운용 콜백 루틴이 I/O 매개 변수 블록을 변경하는 경우 필터 관리자가 CallbackRoutine에 전달하는 I/O 매개 변수 블록은 필터 드라이버가 IoCallDriver를 호출할 때 드라이버 스택을 전달하는 I/O 매개 변수 블록과 다릅니다.

사전 운용 콜백 루틴의 다음 예제 코드는 이런 일이 발생하는 방법을 보여 줍니다.

PFLT_CALLBACK_DATA Data;
PFLT_GET_OPERATION_STATUS_CALLBACK CallbackRoutine;
PVOID RequesterContext;
...
if (iopb->MajorFunction == IRP_MJ_READ) {
    FltRequestOperationStatusCallback (Data, CallbackRoutine, RequesterContext);
 Data->Iopb->Parameters.Read.ReadBuffer = newBuffer;
    ...
}

이 예제에서 읽기 버퍼는 FltRequestOperationStatusCallback 호출 후 변경되므로 필터 관리자가 CallbackRoutine을 호출하면 새 버퍼 대신 이전 버퍼에 대한 포인터를 전달합니다.

필터 관리자는 IRQL <= APC_LEVEL 원래 스레드의 컨텍스트에서 지정된 CallbackRoutine을 호출합니다.

요구 사항

요구 사항
대상 플랫폼 유니버설
헤더 fltkernel.h(Fltkernel.h 포함)
라이브러리 Fltmgr.lib
DLL Fltmgr.sys
IRQL <= APC_LEVEL

추가 정보

FLT_CALLBACK_DATA

FLT_IO_PARAMETER_BLOCK

FLT_IS_IRP_OPERATION

FLT_RELATED_OBJECTS

IoCallDriver

PFLT_GET_OPERATION_STATUS_CALLBACK

PFLT_PRE_OPERATION_CALLBACK