PrjWriteFileData 函数 (projectedfslib.h)
提供调用 PRJ_GET_FILE_DATA_CB 回调时请求的数据。
语法
HRESULT PrjWriteFileData(
[in] PRJ_NAMESPACE_VIRTUALIZATION_CONTEXT namespaceVirtualizationContext,
[in] const GUID *dataStreamId,
[in] void *buffer,
[in] UINT64 byteOffset,
[in] UINT32 length
);
参数
[in] namespaceVirtualizationContext
虚拟化实例的不透明句柄。
如果提供程序正在为 PRJ_GET_FILE_DATA_CB 回调提供服务,则必须是回调中传递给提供程序的 callbackData 的 VirtualizationInstanceHandle 成员的值。
[in] dataStreamId
要写入的数据流的标识符。
如果提供程序正在为 PRJ_GET_FILE_DATA_CB 回调提供服务,则必须是传递给回调中提供程序的 callbackData 的 DataStreamId 成员的值。
[in] buffer
指向包含要写入的数据的缓冲区的指针。 缓冲区的大小必须至少与长度参数的值(以字节为单位) 一样大。 提供程序应使用 PrjAllocateAlignedBuffer 来确保缓冲区满足存储设备的对齐要求。
[in] byteOffset
从要写入数据的文件开头的字节偏移量。
[in] length
要写入文件的字节数。
返回值
HRESULT_FROM_WIN32 (ERROR_OFFSET_ALIGNMENT_VIOLATION) 指示用户句柄已针对未缓存的 I/O 打开,并且 byteOffset 与存储设备的扇区大小不一致。
注解
提供程序使用此例程提供在其 PRJ_GET_FILE_DATA_CB 回调的调用中请求的数据。
当系统需要确保文件包含数据时,将调用提供程序的 PRJ_GET_FILE_DATA_CB 回调。 当提供程序调用 PrjWriteFileData 来提供请求的数据时,系统会使用用户的FILE_OBJECT将数据写入文件。 但是,系统无法控制是否为缓冲 I/O 打开了该FILE_OBJECT。 如果为未缓冲区 I/O 打开了FILE_OBJECT,则对文件的读取和写入必须符合某些对齐要求。 提供程序可以通过执行两项操作来满足这些对齐要求:
- 使用 PrjAllocateAlignedBuffer 分配要传递到缓冲区的缓冲区。
- 确保 byteOffset 和 length 是存储设备对齐要求的整数倍, (如果 byteOffset + length 等于文件) 末尾,则长度不必满足此要求。 提供程序可以使用 PrjGetVirtualizationInstanceInfo 检索存储设备的对齐要求。
系统让提供程序计算正确的对齐方式,因为在处理 PRJ_GET_FILE_DATA_CB 回调时,提供程序可以选择在多个 PrjWriteFileData 调用中返回请求的数据,每个调用返回请求的数据总数的一部分。
请注意,如果提供程序要在 对 PrjWriteFileData 的单个调用中写入整个文件,即从 byteOffset = 0 到长度 = 文件大小,则提供程序不必执行任何对齐计算。 但是,它仍必须使用 PrjAllocateAlignedBuffer 来确保缓冲区满足存储设备的对齐要求。 有关 缓冲 I /O 与缓冲 I/O 的详细信息,请参阅文件缓冲主题。
要求
要求 | 值 |
---|---|
最低受支持的客户端 | Windows 10 版本 1809 [仅限桌面应用] |
最低受支持的服务器 | Windows Server [仅限桌面应用] |
目标平台 | Windows |
标头 | projectedfslib.h |