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 (包括 Ntifs.h)
Library 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