FsRtlPrepareMdlWriteDev 函数 (ntifs.h)

FsRtlPrepareMdlWriteDev 例程返回一个指向指定范围的缓存文件数据的链接列表,以将数据直接写入缓存。

语法

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 (include Ntifs.h)
NtosKrnl.lib
DLL NtosKrnl.exe
IRQL <= APC_LEVEL

另请参阅

FsRtlMdlWriteCompleteDev

FsRtlCopyWrite

mmGetSystemAddressForMdlSafe