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 |
另请参阅
IRP_MJ_DEVICE_CONTROL和IRP_MJ_INTERNAL_DEVICE_CONTROL的
IRP_MJ_DIRECTORY_CONTROL的
IRP_MJ_FILE_SYSTEM_CONTROL的
IRP_MJ_QUERY_EA
IRP_MJ_QUERY_QUOTA的
IRP_MJ_QUERY_SECURITY的
IRP_MJ_READ的
IRP_MJ_SET_EA的
IRP_MJ_SET_QUOTA的
IRP_MJ_WRITE的