CcPrepareMdlWrite 函数 (ntifs.h)

CcPrepareMdlWrite 例程提供对缓存文件内存的直接访问,以便调用方可以将数据写入文件。

语法

void CcPrepareMdlWrite(
  [in]  PFILE_OBJECT     FileObject,
  [in]  PLARGE_INTEGER   FileOffset,
  [in]  ULONG            Length,
  [out] PMDL             *MdlChain,
  [out] PIO_STATUS_BLOCK IoStatus
);

参数

[in] FileObject

指向缓存文件的文件对象的指针。

[in] FileOffset

指向一个变量的指针,该变量指定要在其中写入数据的缓存文件中的起始字节偏移量。

[in] Length

要写入系统缓存的数据的长度(以字节为单位)。

[out] MdlChain

一个或多个内存描述符列表(MDL)的链,描述要将数据写入到的页面。

[out] IoStatus

指向IO_STATUS_BLOCK结构的指针。 如果调用 ccPrepareMdlWrite 成功,IoStatus.Status 设置为STATUS_SUCCESS。 否则,它设置为适当的 NTSTATUS 错误代码。 IoStatus.Information 设置为在 MDL 链中成功锁定的实际字节数。

返回值

没有

言论

CcPrepareMdlWrite 类似于 CcCopyWrite,但数据不会复制到缓存的文件。 相反,系统缓存中要覆盖的物理页锁定在内存中,CcPrepareMdlWrite 返回描述指定字节范围的一个或多个内存描述符列表(MDL)。 这些页面在 CcMdlWriteCompleteCcMdlWriteAbort 之前一直锁定在内存中。 因此,CcPrepareMdlWrite 的每个调用都必须后跟调用 CcMdlWriteCompleteCcMdlWriteAbort

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

请注意,即使调用 CcPrepareMdlWrite 失败,也可能分配了一个或多个 MDL。 调用方可以检查 IoStatus.Information 的值,以确定是否已发生这种情况。 如果有,调用方必须调用 CcMdlWriteComplete 以释放分配的 MDL。

如果发生任何故障,CcPrepareMdlWrite 将引发该特定故障的状态异常。 例如,如果池分配失败,CcPrepareMdlWrite 引发STATUS_INSUFFICIENT_RESOURCES异常;如果发生 I/O 错误,CcPrepareMdlWrite 将引发 I/O 错误的状态异常。 因此,若要控制故障是否发生,驱动程序应在 try-excepttry-finally 语句中包装对 CcPrepareMdlWrite 的调用。

若要缓存文件,请使用 CcInitializeCacheMap

要求

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

另请参阅

CcCopyWrite

CcInitializeCacheMap

CcMdlWriteAbort

CcMdlWriteComplete

IoAllocateMdl

IoBuildPartialMdl

mmGetmdlByteCount

mmGetmdlByteOffset

mmGetMdlPfnArray

mmGetMdlVirtualAddress

mmGetSystemAddressForMdl

mmGetSystemAddressForMdlSafe

mmInitializeMdl

mmMapLockedPages

mmPrepareMdlForReuse

mmProbeAndLockPages

mmUnlockPages

mmUnmapLockedPages