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)。 这些页面在 CcMdlWriteComplete 或 CcMdlWriteAbort 之前一直锁定在内存中。 因此,CcPrepareMdlWrite 的每个调用都必须后跟调用 CcMdlWriteComplete 或 CcMdlWriteAbort。
请注意,MDL 描述的页面锁定在内存中,但不在系统空间中映射。 调用方可以通过调用 MmGetSystemAddressForMdlSafe来执行此映射。
请注意,即使调用 CcPrepareMdlWrite 失败,也可能分配了一个或多个 MDL。 调用方可以检查 IoStatus.Information 的值,以确定是否已发生这种情况。 如果有,调用方必须调用 CcMdlWriteComplete 以释放分配的 MDL。
如果发生任何故障,CcPrepareMdlWrite 将引发该特定故障的状态异常。 例如,如果池分配失败,CcPrepareMdlWrite 引发STATUS_INSUFFICIENT_RESOURCES异常;如果发生 I/O 错误,CcPrepareMdlWrite 将引发 I/O 错误的状态异常。 因此,若要控制故障是否发生,驱动程序应在 try-except 或 try-finally 语句中包装对 CcPrepareMdlWrite 的调用。
若要缓存文件,请使用 CcInitializeCacheMap。
要求
要求 | 价值 |
---|---|
目标平台 | 普遍 |
标头 | ntifs.h (include Ntifs.h) |
库 | NtosKrnl.lib |
DLL | NtosKrnl.exe |
IRQL | < DISPATCH_LEVEL |