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