다음을 통해 공유


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
미니 필터 드라이버의 인스턴스가 철거되고 있습니다. 오류 코드입니다.
STATUS_INSUFFICIENT_RESOURCES
FltRequestOperationStatusCallback 풀 할당 오류가 발생했습니다. 오류 코드입니다.
STATUS_INVALID_PARAMETER
FltRequestOperationStatusCallback 사전 운용 콜백(PFLT_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 매개 변수에 지정된 루틴에 전달하는 콜백 데이터입니다. 복사된 데이터는 preoperation 콜백(PFLT_PRE_OPERATION_CALLBACK) 루틴이 FltRequestOperationStatusCallback 호출할 때 I/O 매개 변수 블록의 스냅샷을 나타냅니다. preoperation 콜백 루틴이 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