다음을 통해 공유


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 올바른 프로세스 컨텍스트에서 버퍼를 자동으로 잠깁니다.

FltLockUserBuffer 사전 작업 콜백 루틴(PFLT_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 시스템은 이 작업을 자동으로 수행합니다.

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

요구 사항

요구
대상 플랫폼 보편적
헤더 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