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

另请参阅

FsRtlMdlWriteCompleteDev

FsRtlCopyWrite

MmGetSystemAddressForMdlSafe