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