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)的链接列表的指针。 MdlChain 必须在调用 FsRtlMdlReadEx之前初始化为 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 (include Ntifs.h) |
库 | NtosKrnl.lib |
DLL | NtosKrnl.exe |
IRQL | PASSIVE_LEVEL |