IOCTL_VOLSNAP_FLUSH_AND_HOLD_WRITES IOCTL (ntifs.h)
O código de controle IOCTL_VOLSNAP_FLUSH_AND_HOLD_WRITES é enviado para forçar uma liberação de um sistema de arquivos antes que ocorra uma cópia de sombra de volume. Esse IOCTL é emitido como uma solicitação de IRP_MJ_DEVICE_CONTROL que é enviada somente para o objeto de dispositivo de volume de um sistema de arquivos local e para drivers de filtro do sistema de arquivos que podem ter sido anexados a esse volume. Esse IOCTL é mais comumente enviado pelo Serviço de Cópias de Sombra de Volume, mas também pode ser emitido por outros aplicativos ou processos no modo de usuário. Também é possível, em circunstâncias especiais, que esse IOCTL seja enviado pelo Driver de Cópia de Sombra de Volume (volsnap.sys) durante uma solicitação de hibernação ou antes de um despejo de memória. Esse IOCTL é enviado para drivers de filtro do sistema de arquivos, drivers do sistema de arquivos e outros drivers de dispositivo (drivers de filtro de armazenamento e drivers de armazenamento, por exemplo) localizados abaixo dos sistemas de arquivos.
Quando um sistema de arquivos como o NTFS recebe IOCTL_VOLSNAP_FLUSH_AND_HOLD_WRITES, o sistema de arquivos deve liberar o volume para o disco, forçando as estruturas de disco do sistema de arquivos em um estado consistente e atualizado. O sistema de arquivos deve bloquear o sistema de arquivos em um estado montável somente leitura, bloqueando as novas alterações do sistema de arquivos para impedir que as páginas de disco armazenadas em cache se tornem sujo. Depois que o sistema de arquivos colocar o sistema de arquivos nesse estado, ele deverá passar o IRP com o IOCTL_VOLSNAP_FLUSH_AND_HOLD_WRITES IOCTL para baixo na pilha para o próximo driver, enquanto continua a manter o sistema de arquivos em um estado montável somente leitura até que os drivers abaixo concluam o IRP. Quando o IRP é concluído ou cancelado, o sistema de arquivos habilita novamente a E/S no volume e retorna.
Código principal
Buffer de entrada
IrpSp->Parameters.DeviceIoControl.IoControlCode é definido como IOCTL_VOLSNAP_FLUSH_AND_HOLD_WRITES.
Buffer de saída
Nenhum
Bloco de status
O membro Status é definido como STATUS_SUCCESS em caso de êxito ou um valor NTSTATUS apropriado, como um dos seguintes:
STATUS_FILE_LOCK_CONFLICT
Um conflito de bloqueio de arquivo foi encontrado. Esse erro pode ser retornado pelo gerenciador de filtros.
STATUS_VOLUME_DISMOUNTED
O volume foi desmontado.
Comentários
Uma cópia de sombra de um volume é uma cópia pontual desse volume. A cópia de sombra é usada principalmente por um aplicativo de backup para que ela possa fazer backup de arquivos de maneira consistente, mesmo que os arquivos possam realmente estar mudando durante o tempo para concluir a operação de backup. Uma cópia de sombra também pode ser usada para preparar um volume para uma hibernação resultante de uma solicitação PNP e para despejos de memória.
O Windows XP e versões posteriores do sistema operacional incluem uma estrutura para orquestrar o tempo de uma cópia de sombra, bem como um driver de filtro de armazenamento (não um driver de filtro do sistema de arquivos) que usa uma técnica de cópia na gravação para criar uma cópia de sombra. O VSS (Serviço de Cópias de Sombra de Volume) orquestra a cópia de sombra. O Driver de Cópia de Sombra de Volume, volsnap.sys, é um driver de filtro de armazenamento carregado sobre a pilha de armazenamento abaixo dos sistemas de arquivos.
Um IOCTL importante relacionado à instantâneo que afeta os sistemas de arquivos é IOCTL_VOLSNAP_FLUSH_AND_HOLD_WRITES. Na verdade, esse IOCTL destina-se à interpretação por sistemas de arquivos, mesmo que seja um IOCTL. Isso ocorre porque todos os sistemas de arquivos devem passar o IOCTL para um driver de nível inferior que está aguardando para processar o IOCTL após o sistema de arquivos.
IOCTL_VOLSNAP_FLUSH_AND_HOLD_WRITES é enviado somente para o objeto de dispositivo de volume de um sistema de arquivos local e para drivers de filtro do sistema de arquivos que podem ter sido anexados a esse volume. O objeto de dispositivo de armazenamento vinculado ao volume por meio do membro RealDevice da estrutura VPB (Bloco de Parâmetros de Volume) sempre terá um dos seguintes tipos de dispositivo:
FILE_DEVICE_DISK
FILE_DEVICE_VIRTUAL_DISK
Este IOCTL não é enviado para sistemas de arquivos remotos.
Quando um sistema de arquivos local recebe IOCTL_VOLSNAP_FLUSH_AND_HOLD_WRITES, o driver deve criar uma imagem consistente dos metadados do sistema de arquivos. O driver não deve ter páginas inconsistentes entre si. O driver deve liberar qualquer parte de seus metadados e buffers de cache mapeados que ele não liberou para o disco e manter gravações até que o IOCTL seja concluído por drivers de nível inferior.
Para drivers de sistema de arquivos de minifiltro, o gerenciador de filtros recebe esse IOCTL e emite um retorno de chamada para o driver de minifiltro se o driver tiver se registrado para receber esse IRP. Quando um driver de minifiltro ou um driver de filtro do sistema de arquivos herdado recebe esse IOCTL, o driver deve liberar qualquer parte de seus metadados que ele não tenha liberado para o disco. Se o driver de filtro estiver usando buffers de cache mapeados para gravar seus metadados, o sistema de arquivos cuidará de toda a liberação. O driver de filtro só precisa garantir que ele não escreva em nenhum de seus buffers de cache mapeados enquanto o sistema de arquivos está tentando liberar alterações para o disco. Um driver de filtro do sistema de arquivos herdado precisa passar o IRP para o próximo driver na pilha.
Um driver pode optar por liberar dados enquanto mantém esse IRP que contém o IOCTL_VOLSNAP_FLUSH_AND_HOLD_WRITES IOCTL antes de passá-los para drivers de nível inferior. Todos os dados liberados para o disco enquanto mantêm esse IOCTL antes de enviar o IRP para o próximo driver de nível inferior serão dados disponíveis na cópia de sombra resultante.
Se esse for um volume somente leitura, normalmente não há nada que um sistema de arquivos ou driver de filtro do sistema de arquivos precise fazer ao receber esse IOCTL, exceto enviá-lo para o próximo driver de nível inferior.
Requisitos
Requisito | Valor |
---|---|
Cabeçalho | ntifs.h (include Ntifs.h, Fltkernel.h) |