Compartilhar via


Função PrjWriteFileData (projectedfslib.h)

Fornece os dados solicitados em uma invocação do retorno de chamada PRJ_GET_FILE_DATA_CB .

Sintaxe

HRESULT PrjWriteFileData(
  [in] PRJ_NAMESPACE_VIRTUALIZATION_CONTEXT namespaceVirtualizationContext,
  [in] const GUID                           *dataStreamId,
  [in] void                                 *buffer,
  [in] UINT64                               byteOffset,
  [in] UINT32                               length
);

Parâmetros

[in] namespaceVirtualizationContext

Identificador opaco para a instância de virtualização.

Se o provedor estiver atendendo a um retorno de chamada PRJ_GET_FILE_DATA_CB, esse deverá ser o valor do membro VirtualizationInstanceHandle do callbackData passado para o provedor no retorno de chamada.

[in] dataStreamId

Identificador para o fluxo de dados no qual gravar.

Se o provedor estiver atendendo um PRJ_GET_FILE_DATA_CB retorno de chamada, esse deverá ser o valor do membro DataStreamId do callbackData passado para o provedor no retorno de chamada.

[in] buffer

Ponteiro para um buffer que contém os dados a serem gravados. O buffer deve ser pelo menos tão grande quanto o valor do parâmetro de comprimento em bytes. O provedor deve usar PrjAllocateAlignedBuffer para garantir que o buffer atenda aos requisitos de alinhamento do dispositivo de armazenamento.

[in] byteOffset

Deslocamento de bytes do início do arquivo no qual gravar os dados.

[in] length

O número de bytes a serem gravados no arquivo.

Valor de retorno

HRESULT_FROM_WIN32(ERROR_OFFSET_ALIGNMENT_VIOLATION) indica que o identificador do usuário foi aberto para E/S não permitido e byteOffset não está alinhado ao tamanho do setor do dispositivo de armazenamento.

Observações

O provedor usa essa rotina para fornecer os dados solicitados em uma invocação de seu retorno de chamada PRJ_GET_FILE_DATA_CB .

O retorno de chamada PRJ_GET_FILE_DATA_CB do provedor é invocado quando o sistema precisa garantir que um arquivo contenha dados. Quando o provedor chama PrjWriteFileData para fornecer os dados solicitados, o sistema usa o FILE_OBJECT do usuário para gravar esses dados no arquivo. No entanto, o sistema não pode controlar se esse FILE_OBJECT foi aberto para E/S em buffer ou não. Se a FILE_OBJECT tiver sido aberta para E/S não armazenada, as leituras e gravações no arquivo deverão seguir determinados requisitos de alinhamento. O provedor pode atender a esses requisitos de alinhamento fazendo duas coisas:

  • Use PrjAllocateAlignedBuffer para alocar o buffer a ser passado para o buffer.
  • Verifique se byteOffset e comprimento são múltiplos inteiros do requisito de alinhamento do dispositivo de armazenamento (o comprimento não precisa atender a esse requisito se byteOffset + length for igual ao final do arquivo). O provedor pode usar PrjGetVirtualizationInstanceInstanceInfo para recuperar o requisito de alinhamento do dispositivo de armazenamento.

O sistema deixa o provedor para calcular o alinhamento adequado porque, ao processar um retorno de chamada PRJ_GET_FILE_DATA_CB , o provedor pode optar por retornar os dados solicitados em várias chamadas PrjWriteFileData , cada uma retornando parte do total de dados solicitados.

Observe que, se o provedor vai gravar o arquivo inteiro em uma única chamada para PrjWriteFileData, ou seja, de byteOffset = 0 a length = tamanho do arquivo, o provedor não precisa fazer nenhum cálculo de alinhamento. No entanto, ele ainda deve usar PrjAllocateAlignedBuffer para garantir que o buffer atenda aos requisitos de alinhamento do dispositivo de armazenamento. Consulte o tópico buffer de arquivos para obter mais informações sobre E/S em buffer versus E/S não armazenada em buffer.

Requirements

Requirement Value
Cliente mínimo suportado Windows 10, versão 1809 [somente aplicativos da área de trabalho]
Servidor mínimo compatível Windows Server [somente aplicativos da área de trabalho]
da Plataforma de Destino Windows
Header projectedfslib.h
Library ProjectedFSLib.lib