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 (包括 Ntifs.h) |
Library | NtosKrnl.lib |
DLL | NtosKrnl.exe |
IRQL | < DISPATCH_LEVEL |