FsRtlMdlReadEx 函数 (ntifs.h)

FsRtlMdlReadEx 例程执行快速缓存的 MDL 读取。 如果未缓存请求的数据,则例程将还原为基于 IRP 的 MDL 读取操作。

语法

NTSTATUS FsRtlMdlReadEx(
  [in]  PFILE_OBJECT     FileObject,
  [in]  PLARGE_INTEGER   FileOffset,
  [in]  ULONG            Length,
  [in]  ULONG            LockKey,
  [out] PMDL             *MdlChain,
  [out] PIO_STATUS_BLOCK IoStatus
);

参数

[in] FileObject

指向文件对象的指针。

[in] FileOffset

指向变量的指针,该变量指定保存数据的缓存文件中的起始字节偏移量。

[in] Length

要从缓存中读取的数据的长度(以字节为单位)。

[in] LockKey

一个值,该值与要锁定的字节范围相关联。 如果要锁定的范围与已用非排他性锁锁定的另一个范围重叠,或者要读取的范围是已以非独占方式锁定的另一个范围的子范围,则此参数中的值必须是该非独占锁的键。该锁必须由调用线程的父进程持有。 否则,此参数无效。

[out] MdlChain

变量的地址,该变量接收指向内存描述符列表的链接列表的指针, (MDL) 。 在调用 FsRtlMdlReadEx 之前,MdlChain 必须初始化为 NULL

[out] IoStatus

指向 IO_STATUS_BLOCK 结构的指针,该结构在输出中包含传输状态。 如果操作成功, 则 IoStatus.Status 设置为 STATUS_SUCCESS。 否则,它将设置为相应的 NTSTATUS 错误代码。 IoStatus.Information 设置为例程成功锁定的实际字节数。

返回值

FsRtlMdlReadEx 返回 STATUS_SUCCESS 或适当的 NTSTATUS 值,如以下值之一:

返回代码 说明
STATUS_INSUFFICIENT_RESOURCES 无法分配基于 IRP 的读取的 IRP。

注解

如果文件系统提供快速 I/ O,FsRtlMdlReadEx 例程将绕过常用的 IRP 读取机制,并返回内存描述符列表的链接列表 (MDL) ,调用方可以使用该列表直接访问缓存的文件数据。 此操作不会复制或缓冲数据,因此比正常读取要快得多。 如果未启用快速 I/ O,FsRtlMdlReadEx 将生成基于 IRP 的同步 MDL 读取,并从请求返回 MDL。

MDL 描述的页面在内存中锁定,但不在系统空间中映射。 调用方可以通过调用 MmGetSystemAddressForMdlSafe 来执行此映射。

CcMdlRead 类似, FsRtlMdlReadEx 例程锁定包含缓存文件数据的页面,以防止系统将这些页交换到页面文件。 在调用方调用 CcMdlReadComplete 例程之前,页面在内存中保持锁定状态。

要求

要求
最低受支持的客户端 Windows 8
目标平台 通用
标头 ntifs.h (包括 Ntifs.h)
Library NtosKrnl.lib
DLL NtosKrnl.exe
IRQL PASSIVE_LEVEL

另请参阅

CcMdlRead

CcMdlReadComplete

IO_STATUS_BLOCK

MmGetSystemAddressForMdlSafe