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 시스템에서 이 작업을 자동으로 수행합니다.
빠른 I/O 및 IRP 기반 작업을 위해 FltLockUserBuffer를 호출할 수 있습니다.
요구 사항
요구 사항 | 값 |
---|---|
대상 플랫폼 | 유니버설 |
헤더 | fltkernel.h(Fltkernel.h 포함) |
라이브러리 | FltMgr.lib |
DLL | Fltmgr.sys |
IRQL | <= APC_LEVEL |
추가 정보
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_SET_EA 대한 FLT_PARAMETERS
IRP_MJ_SET_QUOTA 대한 FLT_PARAMETERS
피드백
https://aka.ms/ContentUserFeedback
출시 예정: 2024년 내내 콘텐츠에 대한 피드백 메커니즘으로 GitHub 문제를 단계적으로 폐지하고 이를 새로운 피드백 시스템으로 바꿀 예정입니다. 자세한 내용은 다음을 참조하세요.다음에 대한 사용자 의견 제출 및 보기