FsRtlPrepareMdlWriteDev 函数 (ntifs.h)
FsRtlPrepareMdlWriteDev 例程返回内存描述符列表的链接列表, (MDL) 指向指定范围的缓存文件数据,将数据直接写入缓存。
语法
BOOLEAN FsRtlPrepareMdlWriteDev(
[in] PFILE_OBJECT FileObject,
[in] PLARGE_INTEGER FileOffset,
[in] ULONG Length,
[in] ULONG LockKey,
[out] PMDL *MdlChain,
[out] PIO_STATUS_BLOCK IoStatus,
[ in, optional ] PDEVICE_OBJECT DeviceObject
);
参数
[in] FileObject
指向文件对象的指针。
[in] FileOffset
指向值的指针,该值指定保存数据的缓存中的起始字节偏移量。
[in] Length
要从缓存中读取的数据的长度(以字节为单位)。
[in] LockKey
一个值,该值与要锁定的字节范围相关联。 如果要锁定的范围与已使用非排他锁锁定的另一个区域重叠,或者要读取的范围是已非独占锁定的另一个范围的子范围,则此参数中的值必须是该非独占锁的键。 锁必须由调用线程的父进程持有。 否则,此参数无效。
[out] MdlChain
输出时,指向内存描述符链接列表的指针会列出指向缓存数据中字节范围的 (MDL) 。
[out] IoStatus
指向 IO_STATUS_BLOCK 结构的指针,该结构在输出中包含传输状态。 如果操作成功, 则 IoStatus.Status 设置为 STATUS_SUCCESS。 否则,它将设置为相应的 NTSTATUS 错误代码。 IoStatus.Information 设置为例程成功锁定的实际字节数。
[ in, optional ] DeviceObject
指向打开文件的设备对象的指针。
返回值
如果操作成功, FsRtlPrepareMdlWriteDev 例程返回 TRUE ;如果操作失败,则返回 FALSE 。
注解
FsRtlPrepareMdlWriteDev 类似于 FsRtlCopyWrite,只不过 FsRtlPrepareMdlWriteDev 不会将数据复制到缓存。 相反,调用方将覆盖的物理页面在内存中锁定, FsRtlPrepareMdlWriteDev 返回一个或多个内存描述符列表, (MDL) 指向指定的字节范围。 在调用方调用 FsRtlMdlWriteCompleteDev 之前,锁定的页面将保持锁定状态。
MDL 指向的页在内存中锁定,但不在系统空间中映射。 调用方可以通过调用 MmGetSystemAddressForMdlSafe 来执行此映射。
即使对 FsRtlPrepareMdlWriteDev 的调用失败,也可能已分配一个或多个 MDL。 调用方可以检查 IoStatus.Information 的值,以确定是否已发生这种情况。 如果有,则调用方必须调用 FsRtlMdlWriteCompleteDev 以释放分配的 MDL。
要求
要求 | 值 |
---|---|
目标平台 | 通用 |
标头 | ntifs.h (包括 Ntifs.h) |
Library | NtosKrnl.lib |
DLL | NtosKrnl.exe |
IRQL | <= APC_LEVEL |
另请参阅
反馈
https://aka.ms/ContentUserFeedback。
即将发布:在整个 2024 年,我们将逐步淘汰作为内容反馈机制的“GitHub 问题”,并将其取代为新的反馈系统。 有关详细信息,请参阅:提交和查看相关反馈