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 将回调数据参数结构中的 MdlAddress (或 OutputMdlAddress) 成员 (FLT_PARAMETERS) 设置为指向锁定页面的 MDL。 如果没有 MDL, 则 FltLockUserBuffer 会分配一个 MDL。 (请注意,FltMgr 在文件系统生成 MDL 之前无法生成 MDL,这就是 FltLockUserBuffer 使用 IRP_MN_MDL) 返回IRP_MJ_READ或IRP_MJ_WRITE STATUS_INVALID_PARAMETER的原因。

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

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

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

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

为了节省系统页表条目 (PTE ) ,FltLockUserBuffer 不会映射锁定的页面。 调用 FltLockUserBuffer 后,调用方必须调用 MmGetSystemAddressForMdlSafe,将回调数据参数结构中的 MdlAddress (或 OutputMdlAddress) 成员作为 Mdl 参数的值传递,以获取表示此内存的系统缓冲区。

释放回调数据结构时,会自动解锁锁定的缓冲区,并释放 MDL。 调用方永远不应释放 MDL;I/O 系统会自动执行此操作。

可以调用 FltLockUserBuffer 进行快速 I/O 和基于 IRP 的操作。

要求

要求
目标平台 通用
标头 fltkernel.h (包括 Fltkernel.h)
Library 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