FltLockUserBuffer 함수(fltkernel.h)

FltLockUserBuffer 루틴은 지정된 I/O 작업에 대한 사용자 버퍼를 잠글 수 있습니다.

구문

NTSTATUS FLTAPI FltLockUserBuffer(
  [in] PFLT_CALLBACK_DATA CallbackData
);

매개 변수

[in] CallbackData

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

반환 값

FltLockUserBuffer 는 사용자 버퍼를 성공적으로 잠그거나 FltLockUserBuffer에 대한 이전 호출로 버퍼가 이미 잠긴 경우 STATUS_SUCCESS 반환합니다. 그렇지 않으면 다음 중 하나와 같은 적절한 NTSTATUS 값을 반환합니다.

반환 코드 설명
STATUS_INSUFFICIENT_RESOURCES FltLockUserBuffer 에서 풀 할당 오류가 발생했습니다. 오류 코드입니다.
STATUS_INVALID_PARAMETER 잘못된 매개 변수가 발견되었습니다. 예를 들어 I/O 작업에 MDL 매개 변수가 없거나 IRP_MJ_READ 또는 IRP_MJ_WRITE I/O 작업에는 IRP_MN_MDL 부 코드가 있습니다. 오류 코드입니다.

설명

최상의 성능을 위해 필터 드라이버는 반드시 필요한 경우가 아니면 FltLockUserBuffer 를 호출하면 안 됩니다. 성능 저하는 FltLockUserBuffer 자체 때문이 아니라 MmGetSystemAddressForMdlSafe에 대한 후속 호출로 인해 발생하는 성능 저하 때문입니다. 자세한 내용은 이후 설명을 참조하세요.

미니필터 드라이버는 FltLockUserBuffer 를 호출하여 다음 I/O 작업 중 하나에 대한 사용자 버퍼를 잠글 수 있습니다.

  • IRP_MJ_DEVICE_CONTROL
  • IRP_MJ_DIRECTORY_CONTROL
  • IRP_MJ_FILE_SYSTEM_CONTROL
  • IRP_MJ_INTERNAL_DEVICE_CONTROL
  • IRP_MJ_QUERY_EA
  • IRP_MJ_QUERY_QUOTA
  • IRP_MJ_QUERY_SECURITY
  • IRP_MJ_READ(IRP_MN_MDL 제외)
  • IRP_MJ_SET_EA
  • IRP_MJ_SET_QUOTA
  • IRP_MJ_WRITE(IRP_MN_MDL 제외)

FltLockUserBuffer 는 I/O 작업 유형에 따라 잠긴 버퍼에 적용할 적절한 액세스 방법(IoReadAccess, IoWriteAccess 또는 IoModifyAccess)을 결정합니다.

FltLockUserBuffer는 콜백 데이터 매개 변수 구조(FLT_PARAMETERS)에서 MdlAddress(또는 OutputMdlAddress) 멤버를 설정하여 잠긴 페이지의 MDL을 가리킵니다. MDL이 없으면 FltLockUserBuffer 가 할당합니다. (FltMgr은 파일 시스템이 수행되기 전에 MDL을 생성할 수 없으므로 FltLockUserBuffer 는 IRP_MJ_READ 대한 STATUS_INVALID_PARAMETER 반환하거나 IRP_MN_MDL IRP_MJ_WRITE).

콜백 데이터 매개 변수 구조에 시스템 버퍼(Irp-AssociatedIrp.SystemBuffer>)가 포함되어 있고 사용자 버퍼(Irp-UserBuffer>)가 없는 경우 FltLockUserBuffer는 시스템 버퍼를 잠급니다. 시스템 버퍼에 대한 MDL이 없으면 FltLockUserBuffer 가 하나를 할당합니다.

콜백 데이터 매개 변수 구조에 사용자 버퍼가 포함된 경우 FltLockUserBuffer는 사용자 버퍼를 검색하고 잠글 수 있습니다.

호출자는 모든 프로세스 컨텍스트에서 실행할 수 있습니다. FltLockUserBuffer 는 버퍼를 올바른 프로세스 컨텍스트에서 자동으로 잠글 수 있습니다.

FltLockUserBufferPFLT_PRE_OPERATION_CALLBACK(사전 작업 콜백 루틴)에서 호출되고 MDL을 할당하는 경우 FltLockUserBuffer는 I/O 작업이 완료되면 I/O 시스템이 MDL을 해제하도록 콜백 데이터 구조(FLT_CALLBACK_DATA)에서 FLTFL_CALLBACK_DATA_DIRTY 플래그를 설정합니다.

시스템 PTE(페이지 테이블 항목)를 절약하기 위해 FltLockUserBuffer 는 잠긴 페이지를 매핑하지 않습니다. FltLockUserBuffer를 호출한 후 호출자는 MmGetSystemAddressForMdlSafe를 호출하여 콜백 데이터 매개 변수 구조의 MdlAddress(또는 OutputMdlAddress) 멤버를 Mdl 매개 변수 값으로 전달하여 이 메모리를 나타내는 시스템 버퍼를 가져와야 합니다.

콜백 데이터 구조가 해제되면 잠긴 버퍼가 자동으로 잠금 해제되고 MDL이 해제됩니다. 호출자는 MDL을 해제해서는 안 됩니다. I/O 시스템에서 이 작업을 자동으로 수행합니다.

빠른 I/O 및 IRP 기반 작업을 위해 FltLockUserBuffer를 호출할 수 있습니다.

요구 사항

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

추가 정보

FLT_CALLBACK_DATA

FLT_IS_FASTIO_OPERATION

FLT_IS_IRP_OPERATION

FLT_IS_SYSTEM_BUFFER

FLT_PARAMETERS

IRP_MJ_DEVICE_CONTROL 및 IRP_MJ_INTERNAL_DEVICE_CONTROL 대한 FLT_PARAMETERS

IRP_MJ_DIRECTORY_CONTROL 대한 FLT_PARAMETERS

IRP_MJ_FILE_SYSTEM_CONTROL 대한 FLT_PARAMETERS

IRP_MJ_QUERY_EA 대한 FLT_PARAMETERS

IRP_MJ_QUERY_QUOTA 대한 FLT_PARAMETERS

IRP_MJ_QUERY_SECURITY 대한 FLT_PARAMETERS

IRP_MJ_READ 대한 FLT_PARAMETERS

IRP_MJ_SET_EA 대한 FLT_PARAMETERS

IRP_MJ_SET_QUOTA 대한 FLT_PARAMETERS

IRP_MJ_WRITE 대한 FLT_PARAMETERS

FltDecodeParameters

MmGetSystemAddressForMdlSafe

MmProbeAndLockPages

PFLT_POST_OPERATION_CALLBACK

PFLT_PRE_OPERATION_CALLBACK