提供在呼叫 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 Data的 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將該數據寫入檔案。 不過,系統無法控制該FILE_OBJECT是否針對緩衝或未緩衝的 I/O 開啟。 如果FILE_OBJECT已針對未緩衝的 I/O 開啟,則檔案的讀取和寫入必須遵守特定對齊需求。 提供者可以透過執行兩件事來滿足這些對齊要求:
- 使用 PrjAllocateAlignedBuffer 配置要傳遞至緩衝區的緩衝區。
- 請確定 byteOffset 和 length 是儲存裝置對齊需求的整數倍 (如果 byteOffset + length 等於檔案結尾,則長度不必符合此需求)。 提供者可以使用 PrjGetVirtualizationInstanceInfo 來擷取儲存體裝置的對齊需求。
系統會讓提供者來計算適當的對齊方式,因為在處理 PRJ_GET_FILE_DATA_CB 回呼時,提供者可能會選擇跨多個 PrjWriteFileData 呼叫傳回要求的數據,每個呼叫都會傳回要求數據總計的一部分。
請注意,如果提供者要在 PrjWriteFileData 的單一呼叫中寫入整個檔案,也就是從 byteOffset = 0 到 length = 檔案大小,提供者不需要執行任何對齊計算。 不過,它仍必須使用 PrjAllocateAlignedBuffer 來確保緩衝區符合儲存體裝置的對齊需求。 如需緩衝與未緩衝 I/O 的相關資訊,請參閱 檔案緩衝 主題。
需求
| Requirement | 價值觀 |
|---|---|
| 最低支援的用戶端 | Windows 10 版本 1809 [僅限傳統型應用程式] |
| 支援的最低伺服器 | Windows Server [僅限傳統型應用程式] |
| 目標平臺 | 窗戶 |
| Header | 投影fslib.h |
| Library | 投影FSLib.lib |