Função FsRtlCopyWrite (ntifs.h)
A rotina FsRtlCopyWrite copia dados de um buffer de usuário para um arquivo armazenado em cache.
Sintaxe
BOOLEAN FsRtlCopyWrite(
[in] PFILE_OBJECT FileObject,
[in] PLARGE_INTEGER FileOffset,
[in] ULONG Length,
[in] BOOLEAN Wait,
[in] ULONG LockKey,
[in] PVOID Buffer,
[out] PIO_STATUS_BLOCK IoStatus,
[in] PDEVICE_OBJECT DeviceObject
);
Parâmetros
[in] FileObject
Um ponteiro para um objeto de arquivo para o arquivo armazenado em cache no qual os dados devem ser gravados.
[in] FileOffset
Um ponteiro para uma variável que especifica o deslocamento de bytes inicial dentro do arquivo armazenado em cache.
[in] Length
O comprimento em bytes dos dados a serem gravados.
[in] Wait
Defina como TRUE se o chamador puder ser colocado em um estado de espera até que todos os dados sejam copiados, FALSE caso contrário.
[in] LockKey
Um valor associado ao intervalo de bytes a ser bloqueado. Se o intervalo a ser bloqueado se sobrepor a outro intervalo que já está bloqueado com um bloqueio nãoclusivo ou se o intervalo a ser lido for um subconjunto de outro intervalo que já está bloqueado de forma inexistente, o valor nesse parâmetro deve ser a chave para esse bloqueio nãoclusivo O bloqueio deve ser mantido pelo processo pai do thread de chamada. Caso contrário, esse parâmetro não terá efeito.
[in] Buffer
Um ponteiro para o buffer do qual os dados devem ser copiados.
[out] IoStatus
Um ponteiro para uma estrutura alocada por chamador que recebe o status de conclusão final e informações sobre a operação. Se os dados forem copiados com êxito, IoStatus.Status conterá STATUS_SUCCESS. Se nem todos os dados forem copiados com êxito, IoStatus.Information contém o número real de bytes que foram copiados.
[in] DeviceObject
Um ponteiro para o objeto do dispositivo para o volume montado que contém os dados do arquivo.
Valor de retorno
FsRtlCopyWrite retornará TRUE se a solicitação de cópia tiver sido concluída, FALSE caso contrário. Observe que um valor retornado de TRUE não significa necessariamente que a operação de cópia foi bem-sucedida.
Se FsRtlCopyWrite retornar FALSE ou se o conteúdo de IoStatus indicar que a operação de cópia falhou, o chamador deverá alocar um IRP de gravação em vez de chamar FsRtlCopyWrite.
Observações
Em vez de implementar uma rotina de gravação rápida de E/S específica do sistema de arquivos, os desenvolvedores de sistemas de arquivos que dão suporte ao cache de arquivos devem considerar usar FsRtlCopyWrite como o ponto de entrada do sistema de arquivos para processar solicitações de gravação de E/S rápidas. Isso requer que a rotina DriverEntry do sistema de arquivos defina o ponto de entrada FastIoWrite como FsRtlCopyWrite na estrutura FAST_IO_DISPATCH do objeto de driver do sistema de arquivos. Além disso, o sistema de arquivos deve fazer o seguinte:
Para cada arquivo no qual a E/S rápida pode ser executada, o sistema de arquivos deve alocar e inicializar uma estrutura de FSRTL_COMMON_FCB_HEADER.
Na maioria dos sistemas de arquivos, isso é feito incluindo a estrutura FSRTL_COMMON_FCB_HEADER em um FCB (bloco de controle de arquivo) ou estrutura comparável que é usada para manter o estado de um arquivo aberto.
O armazenamento para a estrutura de FSRTL_COMMON_FCB_HEADER normalmente é alocado do pool de páginas.
Para cada arquivo no qual a E/S rápida pode ser executada, o sistema de arquivos deve vincular quaisquer objetos de arquivo para o arquivo à estrutura FSRTL_COMMON_FCB_HEADER. Isso é feito definindo o membro FsContext de cada objeto de arquivo para apontar para essa estrutura (ou para o FCB ou outra estrutura que contém a estrutura FSRTL_COMMON_FCB_HEADER).
Ao armazenar em cache um arquivo, o sistema de arquivos deve definir o isFastIoPossible membro da estrutura FSRTL_COMMON_FCB_HEADER do arquivo como um valor apropriado. Esse valor deve ser atualizado conforme necessário, desde que o arquivo permaneça armazenado em cache.
Em particular, os sistemas de arquivos devem definir o membro IsFastIoPossible da estrutura FSRTL_COMMON_FCB_HEADER para FastIoIsQuestionable assim que houver qualquer bloqueio de intervalo de bytes exclusivo no arquivo armazenado em cache.
Se de espera for TRUE, FsRtlCopyWrite será garantido para copiar os dados e retornar TRUE. Se as páginas necessárias do arquivo armazenado em cache já estiverem residentes na memória, os dados serão copiados imediatamente e nenhum bloqueio ocorrerá. Se as páginas necessárias não forem residentes, o chamador será colocado em um estado de espera até que todas as páginas necessárias sejam residentes e os dados possam ser copiados.
Se de Espera for FALSE, FsRtlCopyWrite se recusará a bloquear e retornará FALSE se não puder adquirir o recurso principal do arquivo ou se as páginas necessárias do arquivo armazenado em cache ainda não estiverem residentes na memória.
A rotina de FastIoCheckIfPossible do sistema de arquivos é responsável por garantir que o intervalo de bytes definido por FileOffset e Length não inclua nenhum intervalo de bytes bloqueado exclusivamente para o qual o chamador não passa o valor de do LockKey apropriado. Se o sistema de arquivos usar as rotinas de suporte
Para armazenar em cache um arquivo, use a rotina de ccInitializeCacheMap
Requisitos
Requisito | Valor |
---|---|
da Plataforma de Destino |
Universal |
cabeçalho | ntifs.h (inclua Ntifs.h) |
biblioteca | NtosKrnl.lib |
de DLL |
NtosKrnl.exe |
IRQL | PASSIVE_LEVEL |
regras de conformidade de DDI | HwStorPortProhibitedDIs(storport), PowerIrpDDis(wdm) |