BypassIO para drivers de filtro

Sobre o BypassIO

O recurso BypassIO oferece um caminho de E/S otimizado para leitura de arquivos. O objetivo desse caminho é reduzir a sobrecarga da CPU de fazer leituras, o que ajuda a atender às demandas de E/S de carregar e executar jogos de última geração no Windows. BypassIO faz parte da infraestrutura para dar suporte ao DirectStorage no Windows. Está disponível a partir do Windows 11.

É importante que os minifiltros de armazenamento implementem o suporte para BypassIO e que você mantenha o BypassIO habilitado o máximo possível. Sem suporte ao filtro, o desempenho do jogo é degradado, resultando em uma experiência de jogo ruim para os usuários finais.

Haverá usos de aplicativos mais amplos além dos jogos em versões futuras do Windows.

BypassIO é um conceito por identificador. Normalmente, o BypassIO é solicitado para um identificador de arquivo explícito. BypassIO não tem efeito em outros identificadores desse arquivo.

FSCTL_MANAGE_BYPASS_IO e IOCTL_STORAGE_MANAGE_BYPASS_IO equivalente foram adicionados como parte desta infraestrutura. Os minifiltros processam FSCTL_MANAGE_BYPASS_IO, e IOCTL_STORAGE_MANAGE_BYPASS_IO é enviado por sistemas de arquivos para as pilhas de volume/armazenamento. Esses códigos de controle são projetados para serem diagnosticáveis: ambos retornam a identidade do driver que falhou na solicitação BypassIO e o motivo para vetá-la.

Esta página fornece detalhes de arquitetura entre o filtro do sistema de arquivos e as pilhas de armazenamento e informações sobre como implementar o BypassIO em um driver de minifiltro. Consulte BypassIO para drivers de armazenamento para obter informações de BypassIO específicas para drivers de armazenamento.

Escopo do suporte ao BypassIO

A partir do Windows 11, o BypassIO tem suporte da seguinte maneira:

  • Somente em sistemas cliente Windows. O suporte ao sistema de servidor será adicionado em uma versão futura.

  • Somente em dispositivos de armazenamento NVMe. Suporte para outras tecnologias de armazenamento será adicionado em uma versão futura.

  • Somente no sistema de arquivos NTFS. Suporte para outros sistemas de arquivos será adicionado em uma versão futura.

  • Somente leituras não armazenadas em cache são suportadas. O suporte para gravações não armazenadas em cache será adicionado em uma versão futura.

  • Suportado apenas em arquivos (não suportado em identificadores de diretório ou volume).

Como funciona o BypassIO

Quando NtReadFile é chamado em um FileHandle habilitado para BypassIO, a operação normalmente não flui pela pilha de E/S tradicional, que atravessa toda a pilha do sistema de arquivos, a pilha de volumes e a pilha de armazenamento. Em vez disso, a operação flui diretamente do gerenciador de E/S para o sistema de arquivos (NTFS) e, em seguida, para o driver de disco (classpnp) e, em seguida, para o driver StorNVMe. Com um FileHandle totalmente habilitado para BypassIO:

  • Todos os filtros do sistema de arquivos são ignorados.
  • Todos os filtros de pilha de volume são ignorados.
  • Todos os filtros e drivers de pilha de armazenamento acima do driver de disco e entre o disco e os drivers StorNVMe são ignorados.

Em cenários em que a pilha de filtros do sistema de arquivos dá suporte a BypassIO, mas o volume e/ou a pilha de armazenamento não:

  • E/S de leitura ignoram a pilha de filtros.
  • As E/S de leitura ainda são enviadas por meio do volume e/ou da pilha de armazenamento.

Esse nível de suporte é conhecido como BypassIO parcial.

Imagem que mostra o caminho de E/S tradicional para uma solicitação de leitura.

Imagem que mostra o caminho de E/S de bypass para uma solicitação de leitura.

Alterações e adições de DDIs para BypassIO

As seguintes DDIs relevantes para drivers de filtro foram adicionadas para fornecer suporte ao BypassIO:

Além disso, as seguintes DDIs foram alteradas para dar suporte ao BypassIO:

  • Um campo BypassIoOpenCount foi adicionado à estrutura FSRTL_ADVANCED_FCB_HEADER. O sistema de arquivos usa esse campo para manter uma contagem de FileObjects exclusivos em um fluxo que atualmente tem BypassIO habilitado. A adição deste campo aumenta o tamanho da estrutura. A versão da estrutura a ser usada a partir do Windows 11 é FSRTL_FCB_HEADER_V4.

Efeito de outras operações em identificadores habilitados para BypassIO

Habilitar BypassIO em um identificador não afeta outros identificadores. No entanto, outras operações em um identificador habilitado para BypassIO afetam o uso de BypassIO, como nos seguintes cenários:

  • Se você tiver o identificador A aberto em um arquivo no qual o BypassIO está habilitado e funcionando e alguém (por exemplo, outro thread ou processo) abrir o identificador B para executar E/S armazenada em cache ou mapeada na memória, o BypassIO será temporariamente suspenso no identificador A até que o identificador B seja fechado. Em vez disso, o sistema usa o caminho de E/S tradicional para garantir que os dados obsoletos não ocorram. O sistema continua a usar o caminho de E/S tradicional nesse identificador até que todas as seções de dados e mapas de cache sejam desativados. Como resultado, os filtros devem fechar o arquivo do identificador antes que o BypassIO possa ser retomado.

  • Se um arquivo habilitado para BypassIO for marcado como esparso, todas as operações BypassIO começarão a usar o caminho de E/S tradicional.

  • A desfragmentação de um arquivo habilitado para BypassIO faz com que todas as operações BypassIO usem o caminho de E/S tradicional. Depois que a desfragmentação for concluída, o sistema voltará para o caminho BypassIO nesse identificador.

Implementar o suporte a BypassIO em minifiltros

Atualizar seus arquivos INF ou MANIFEST

A partir de Windows 11, os desenvolvedores de filtros devem adicionar SUPPORTED_FS_FEATURES_BYPASS_IO a SupportedFeatures nos arquivos INF ou MANIFEST do driver. (Você pode digitar fltmc instances um prompt de comando com privilégios elevados para ver os valores "SprtFtrs" para todos os filtros ativos.)

Observação

Um filtro que nunca pode dar suporte a BypassIO ainda deve adicionar SUPPORTED_FS_FEATURES_BYPASS_IO ao seu estado SupportedFeatures e, em seguida, vetar adequadamente dentro do filtro, especificando o motivo.

Os minifiltros são incentivados a minimizar o veto ao BypassIO o máximo possível.

Se um minifiltro for anexado a um volume no qual o BypassIO está habilitado, mas esse minifiltro não tiver atualizado sua configuração SupportedFeatures para incluir SUPPORTED_FS_FEATURES_BYPASS_IO, todas as operações BypassIO nesse volume serão bloqueadas imediatamente, voltando ao caminho de E/S tradicional, resultando em desempenho de jogo degradado.

Os minifiltros que não filtram IRP_MJ_READ ou IRP_MJ_WRITE são automaticamente aceitos no suporte a BypassIO, como se tivessem adicionado SUPPORTED_FS_FEATURES_BYPASS_IO em SupportedFeatures.

As operações FS_BPIO_OP_ENABLE e FS_BPIO_OP_QUERY falharão em uma pilha se houver um minifiltro anexado que não aceita.

Implementar suporte para solicitações BypassIO

Os minifiltros devem adicionar suporte para solicitações BypassIO, que são enviadas por meio do código de controle FSCTL_MANAGE_BYPASS_IO. Consulte Suporte a operações BypassIO para obter detalhes.

Determinar se o BypassIO está funcionando

Um comando fsutil adicionado emite um FSCTL_MANAGE_BYPASS_IO especificando a operação FS_BPIO_OP_QUERY. Os resultados exibidos identificam o primeiro driver que está impedindo o BypassIO e o motivo,

> fsutil bypassIo state /v <path>

em que <path> pode ser um volume, um diretório ou um nome de arquivo específico e /v é um sinalizador detalhado opcional.

Neste primeiro exemplo, digamos que o minifiltro WOF não tenha optado pelo BypassIO. A execução do comando fsutil bypassIo state c:\ resulta na seguinte saída:

BypassIo on "c:\" is not currently supported.
Status: 506 (At least one minifilter does not support bypass IO)
Driver: wof.sys
Reason: The specified minifilter does not support bypass IO.

Neste segundo exemplo, a execução fsutil bypassIO state /v c:\ em um sistema em que o BitLocker está habilitado resulta na seguinte saída:

BypassIo on "c:\" is partially supported
    Volume stack bypass is disabled (fvevol.sys)
      Status:  495 (The specified operation is not supported while encryption is enabled on the target object)
      Reason:  BitLocker Drive Encryption is enabled.
    Storage Type:   NVMe
    Storage Driver: BypassIo compatible
    Driver Name:    stornvme.sys

Comportamento específico de NTFS

O BypassIO pode ser habilitado em um arquivo residente do NTFS. No entanto, o arquivo usa o caminho de E/S tradicional, desde que seja residente. Se ocorrer uma gravação no arquivo de modo que ele se torne não residente, o sistema alternará para usar o caminho BypassIO.

A compactação NTFS não pode ser habilitada em um arquivo ativo BypassIO.

A criptografia NTFS pode ser habilitada em um arquivo ativo BypassIO. BypassIO está pausado.

BypassIO não afeta as operações de leitura/gravação de descarregamento.