Функция 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 |