FsRtlPrepareMdlWriteEx 函数 (ntifs.h)
FsRtlPrepareMdlWriteEx 例程返回内存描述符列表的链接列表, (MDL) 指向指定范围的缓存文件数据,将数据直接写入缓存。 如果缓存对写入的支持不可用,则例程将还原为基于 IRP 的 MDL 写入操作。
语法
NTSTATUS FsRtlPrepareMdlWriteEx(
[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) 。
[out] IoStatus
指向 IO_STATUS_BLOCK 结构的指针,该结构在输出中包含传输状态。 如果操作成功, 则 IoStatus.Status 设置为 STATUS_SUCCESS。 否则,它将设置为相应的 NTSTATUS 错误代码。 IoStatus.Information 设置为例程成功锁定的实际字节数。
返回值
FsRtlPrepareMdlWriteEx 返回 STATUS_SUCCESS 或相应的 NTSTATUS 值,如以下值之一:
返回代码 | 说明 |
---|---|
|
无法分配基于 IRP 的写入的 IRP。 |
注解
如果文件系统可以使用快速 I/ O,FsRtlPrepareMdlWriteEx 例程将绕过常规的 IRP 写入机制,并返回内存描述符列表的链接列表 (MDL) ,调用方可以使用该列表将数据直接写入文件缓存。 调用方将覆盖的物理页面锁定在内存中并可以直接写入,而不是将数据缓冲的数据复制到缓存中。 FsRtlPrepareMdlWriteEx 返回指向指定字节范围的一个或多个内存描述符列表 (MDL) 。
如果未启用快速 I/ O,FsRtlPrepareMdlWriteEx 将生成基于 IRP 的同步 MDL 写入准备,并返回从请求分配的 MDL。
MDL 指向的页在内存中锁定,但不在系统空间中映射。 调用方可以通过调用 MmGetSystemAddressForMdlSafe 来执行此映射。
每次调用 FsRtlPrepareMdlWriteEx 后,都必须调用 CcMdlWriteComplete。
要求
要求 | 值 |
---|---|
目标平台 | 通用 |
标头 | ntifs.h (包括 Ntifs.h) |
Library | NtosKrnl.lib |
DLL | NtosKrnl.exe |
IRQL | PASSIVE_LEVEL |