다음을 통해 공유


FltCheckOplock 함수(fltkernel.h)

미니필터 드라이버는 FltCheckOplock 을 호출하여 IRP 기반 파일 I/O 작업의 콜백 데이터 구조를 파일의 현재 oplock(기회 잠금) 상태와 동기화합니다.

구문

FLT_PREOP_CALLBACK_STATUS FLTAPI FltCheckOplock(
  [in]           POPLOCK                                 Oplock,
  [in]           PFLT_CALLBACK_DATA                      CallbackData,
  [in, optional] PVOID                                   Context,
  [in, optional] PFLTOPLOCK_WAIT_COMPLETE_ROUTINE        WaitCompletionRoutine,
  [in, optional] PFLTOPLOCK_PREPOST_CALLBACKDATA_ROUTINE PrePostCallbackDataRoutine
);

매개 변수

[in] Oplock

파일에 대한 불투명 불투명 포인터입니다. 이 포인터는 FltInitializeOplock에 대한 이전 호출에 의해 초기화되어야 합니다.

[in] CallbackData

I/O 작업에 대한 콜백 데이터(FLT_CALLBACK_DATA) 구조체에 대한 포인터입니다.

[in, optional] Context

WaitCompletionRoutinePrePostCallbackDataRoutine이 가리키는 콜백 루틴에 전달될 호출자 정의 컨텍스트 정보에 대한 포인터입니다. 필터 관리자는 이 정보를 불투명으로 처리합니다.

[in, optional] WaitCompletionRoutine

호출자가 제공한 콜백 루틴에 대한 포인터입니다. oplock 중단이 진행 중인 경우 필터 관리자는 oplock 중단이 완료되면 이 루틴을 호출합니다. 이 매개 변수는 선택 사항이며 NULL일 수 있습니다. NULL인 경우 호출자는 oplock 중단이 완료될 때까지 대기 상태로 전환됩니다.

이 루틴은 다음과 같이 선언됩니다.

typedef VOID
(*PFLTOPLOCK_WAIT_COMPLETE_ROUTINE) (
      IN PFLT_CALLBACK_DATA CallbackData,
      IN PVOID Context
      );

이 루틴에는 다음과 같은 매개 변수가 있습니다.

CallbackData

I/O 작업에 대한 콜백 데이터 구조에 대한 포인터입니다.

Context

Context 매개 변수에서 FltCheckOplock에 전달된 컨텍스트 정보 포인터입니다.

[in, optional] PrePostCallbackDataRoutine

I/O 작업이 작업 큐에 게시되는 경우 호출자가 제공한 콜백 루틴에 대한 포인터입니다. 이 매개 변수는 선택 사항이며 NULL일 수 있습니다.

이 루틴은 다음과 같이 선언됩니다.

typedef VOID
(*PFLTOPLOCK_PREPOST_CALLBACKDATA_ROUTINE) (
      IN PFLT_CALLBACK_DATA CallbackData,
      IN PVOID Context
      );

CallbackData

I/O 작업의 콜백 데이터 구조에 대한 포인터입니다.

Context

Context 매개 변수에서 FltCheckOplock에 전달된 컨텍스트 정보 포인터입니다.

반환 값

FltCheckOplock 은 다음 FLT_PREOP_CALLBACK_STATUS 코드 중 하나를 반환합니다.

반환 코드 설명
FLT_PREOP_COMPLETE
FltCheckOplock 에서 풀 할당 오류가 발생했거나 FsRtlCheckOplock 함수 호출에서 오류가 반환되었습니다. FltCheckOplock은 FLT_CALLBACK_DATA 콜백 데이터 구조의 IoStatus 멤버에 대한 IO_STATUS_BLOCK 구조의 Status 멤버에 오류 코드를 설정합니다. CallbackData 매개 변수는 이 FLT_CALLBACK_DATA 가리킵니다.
FLT_PREOP_PENDING
Oplock 중단이 시작되어 필터 관리자가 I/O 작업을 작업 큐에 게시했습니다. I/O 작업은 CallbackData 매개 변수가 가리키는 콜백 데이터로 표시됩니다.
FLT_PREOP_SUCCESS_WITH_CALLBACK
I/O 작업이 즉시 수행되었습니다. 이 작업이 create-options 매개 변수에서 FILE_COMPLETE_IF_OPLOCKED 지정한 만들기 작업인 경우 작업이 즉시 수행되더라도 실제로 oplock 중단이 진행 중일 수 있습니다. 이것이 상황인지 확인하려면 호출자는 FLT_CALLBACK_DATA 콜백 데이터 구조의 IoStatus 멤버에 대한 IO_STATUS_BLOCK 구조의 Status 멤버에 상태 검사 합니다.

설명

미니필터 드라이버는 FltCheckOplock 을 호출하여 다음 조건에 따라 IRP 기반 I/O 작업을 파일의 현재 oplock 상태와 동기화합니다.

  • I/O 작업으로 인해 oplock이 중단되면 oplock 중단이 시작됩니다.
  • oplock 중단이 완료될 때까지 I/O 작업을 계속할 수 없는 경우 FltCheckOplock 은 FLT_PREOP_PENDING 반환하고 PrePostCallbackDataRoutine 매개 변수가 가리키는 콜백 루틴을 호출합니다.
미니필터 드라이버가 oplock을 사용하는 경우 oplock 중단을 일으킬 수 있는 I/O 작업에 대한 모든 PFLT_PRE_OPERATION_CALLBACK(사전 운용 콜백) 루틴에서 FltCheckOplock을 호출해야 합니다. 이 규칙은 다음과 같은 유형의 I/O 작업에 적용됩니다. 이러한 작업으로 인해 oplock 중단이 발생할 수 있기 때문입니다.

IRP_MJ_CLEANUP

IRP_MJ_CREATE

IRP_MJ_FILE_SYSTEM_CONTROL

IRP_MJ_FLUSH_BUFFERS

IRP_MJ_LOCK_CONTROL

IRP_MJ_READ

IRP_MJ_SET_INFORMATION

IRP_MJ_WRITE

I/O 작업은 IRP 기반 I/O 작업이어야 합니다. 지정된 콜백 데이터 구조가 IRP 기반 I/O 작업을 나타내는지 여부를 확인하려면 FLT_IS_IRP_OPERATION 매크로를 사용합니다.

미니필터는 WaitCompletionRoutine에 지정된 콜백 내에서 FltCheckOplock을 다시 호출해서는 안 됩니다. 이렇게 하면 FltCheckOplock 이 반환되기 전에 oplock 패키지가 완료 콜백을 호출하는 경우 교착 상태가 발생할 수 있습니다.

기회 잠금에 대한 자세한 내용은 Microsoft Windows SDK 설명서를 참조하세요.

요구 사항

요구 사항
대상 플랫폼 유니버설
헤더 fltkernel.h(Fltkernel.h 포함)
IRQL <= APC_LEVEL

추가 정보

FLT_CALLBACK_DATA

FLT_IS_IRP_OPERATION

FSCTL_OPBATCH_ACK_CLOSE_PENDING

FSCTL_OPLOCK_BREAK_ACKNOWLEDGE

FSCTL_OPLOCK_BREAK_ACK_NO_2

FSCTL_OPLOCK_BREAK_NOTIFY

FSCTL_REQUEST_BATCH_OPLOCK

FSCTL_REQUEST_FILTER_OPLOCK

FSCTL_REQUEST_OPLOCK_LEVEL_1

FSCTL_REQUEST_OPLOCK_LEVEL_2

FltCheckOplockEx

FltCurrentBatchOplock

FltInitializeOplock

FltOplockFsctrl

FltOplockIsFastIoPossible

FltUninitializeOplock

FsRtlCheckOplock

PFLT_PRE_OPERATION_CALLBACK