Поделиться через


Функция 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 , это должно быть значение из элемента VirtualizationInstanceHandle callbackData, переданного поставщику в обратном вызове.

[in] dataStreamId

Идентификатор потока данных для записи.

Если поставщик обслуживает обратный вызов PRJ_GET_FILE_DATA_CB , это должно быть значение из элемента DataStreamId обратного вызоваData, переданное поставщику в обратном вызове.

[in] buffer

Указатель на буфер, содержащий данные для записи. Размер буфера должен быть не ниже значения параметра length в байтах. Поставщик должен использовать PrjAllocateAlignedBuffer , чтобы обеспечить соответствие буфера требованиям к выравниванию устройства хранения.

[in] byteOffset

Байтовая смещение от начала файла, в который записываются данные.

[in] length

Число байтов, записываемых в файл.

Возвращаемое значение

HRESULT_FROM_WIN32(ERROR_OFFSET_ALIGNMENT_VIOLATION) указывает, что дескриптор пользователя был открыт для небуферированных операций ввода-вывода, а byteOffset не соответствует размеру сектора запоминающего устройства.

Комментарии

Поставщик использует эту подпрограмму для предоставления данных, запрошенных при вызове PRJ_GET_FILE_DATA_CB обратного вызова.

Обратный вызов PRJ_GET_FILE_DATA_CB поставщика вызывается, когда системе необходимо убедиться, что файл содержит данные. Когда поставщик вызывает PrjWriteFileData для предоставления запрошенных данных, система использует FILE_OBJECT пользователя для записи данных в файл. Однако система не может контролировать, была ли эта FILE_OBJECT открыта для буферизованного или небуферированного ввода-вывода. Если FILE_OBJECT была открыта для небуферированных операций ввода-вывода, операции чтения и записи в файл должны соответствовать определенным требованиям к выравниванию. Поставщик может удовлетворить эти требования к выравниванию, выполнив два действия:

  • Используйте PrjAllocateAlignedBuffer , чтобы выделить буфер для передачи в буфер.
  • Убедитесь, что аргументы byteOffset и length являются целыми числами, кратными требованию к выравниванию устройства хранения (длина не обязательно должна соответствовать этому требованию, если значение byteOffset + length равно концу файла). Поставщик может использовать PrjGetVirtualizationInstanceInfo для получения требования к выравниванию устройства хранения.

Система оставляет поставщику возможность вычислить правильное выравнивание, так как при обработке обратного вызова PRJ_GET_FILE_DATA_CB поставщик может выбрать возврат запрошенных данных в нескольких вызовах PrjWriteFileData , каждый из которых возвращает часть общего объема запрошенных данных.

Обратите внимание, что если поставщик собирается записать весь файл в одном вызове PrjWriteFileData, т. е. от byteOffset = 0 до length = size файла, поставщику не нужно выполнять вычисления выравнивания. Однако он по-прежнему должен использовать PrjAllocateAlignedBuffer , чтобы обеспечить соответствие буфера требованиям к выравниванию устройства хранения. Дополнительные сведения о буферизованных и небуферированных ввода-выводах см. в разделе Буферизация файлов .

Требования

Требование Значение
Минимальная версия клиента Windows 10, версия 1809 [только классические приложения]
Минимальная версия сервера Windows Server [только классические приложения]
Целевая платформа Windows
Header projectedfslib.h