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 值,例如以下值之一:

返回代码 描述
STATUS_INSUFFICIENT_RESOURCES
无法分配基于 IRP 的写入的 IRP。

言论

如果文件系统可以使用快速 I/O,FsRtlPrepareMdlWriteEx 例程将绕过通常的 IRP 写入机制,并返回调用方可用于将数据直接写入文件缓存的内存描述符列表(MDL)的链接列表。 调用方将覆盖的物理页锁定在内存中,并且可以直接写入到缓存中,而不是将数据缓冲数据复制到缓存中。 FsRtlPrepareMdlWriteEx 返回指向指定字节范围的一个或多个内存描述符列表(MDL)。

如果未启用快速 I/O,FsRtlPrepareMdlWriteEx 将生成基于 IRP 的同步 MDL 写入准备,并返回从请求分配的 MDL。

MDL 指向的页面锁定在内存中,但不在系统空间中映射。 调用方可以通过调用 MmGetSystemAddressForMdlSafe来执行此映射。

每次调用 FsRtlPrepareMdlWriteEx 后,都必须调用 CcMdlWriteComplete

要求

要求 价值
目标平台 普遍
标头 ntifs.h (include Ntifs.h)
NtosKrnl.lib
DLL NtosKrnl.exe
IRQL PASSIVE_LEVEL

另请参阅

CcMdlWriteComplete

CcPrepareMdlWrite

mmGetSystemAddressForMdlSafe