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 确定适当的访问方法(IoReadAccess、IoWriteAccess 或 IoModifyAccess),以便根据 I/O 操作的类型为锁定缓冲区应用。

FltLockUserBuffer 设置回调数据参数结构(FLT_PARAMETERS)中的 MdlAddress(或 OutputMdlAddress) 成员,以指向锁定页的 MDL。 如果没有 MDL,FltLockUserBuffer 分配一个。 (请注意,FltMgr 在文件系统之前无法生成 MDL,这就是为什么 FltLockUserBuffer 返回IRP_MJ_READ或具有IRP_MN_MDL的IRP_MJ_WRITE STATUS_INVALID_PARAMETER的原因)。

如果回调数据参数结构包含系统缓冲区(Irp->AssociatedIrp.SystemBuffer),并且不包含用户缓冲区(Irp->UserBuffer),FltLockUserBuffer 锁定系统缓冲区。 如果系统缓冲区没有 MDL,FltLockUserBuffer 分配一个。

如果回调数据参数结构包含用户缓冲区,FltLockUserBuffer探测和锁定 用户缓冲区。

调用方可以在任何进程上下文中运行。 FltLockUserBuffer 自动锁定正确的进程上下文中的缓冲区。

如果从操作前回调例程(PFLT_PRE_OPERATION_CALLBACK)调用 FltLockUserBuffer,并且它分配 MDL,FltLockUserBuffer 设置回调数据结构(FLT_CALLBACK_DATA)中的FLTFL_CALLBACK_DATA_DIRTY标志,以便 I/O 系统在 I/O 操作完成后释放 MDL。

为了节省系统页表条目(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