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 값을 반환합니다.
반환 코드 | 설명 |
---|---|
|
미니필터 드라이버의 instance 철거되고 있습니다. 오류 코드입니다. |
|
FltRequestOperationStatusCallback 에서 풀 할당 오류가 발생했습니다. 오류 코드입니다. |
|
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 매개 변수에 지정된 루틴에 전달하는 콜백 데이터입니다. 복사된 데이터는 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 |