BypassIO para drivers de filtro

Sobre BypassIO

A partir de Windows 11, BypassIO foi adicionado como 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 carregamento e execução de jogos de última geração no Windows. O BypassIO faz parte da infraestrutura para dar suporte ao DirectStorage no Windows.

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

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

BypassIO é um conceito por identificador. Quando BypassIO é solicitado, é para um identificador de arquivo explícito. BypassIO não tem nenhum impacto em outros identificadores para esse arquivo.

FSCTL_MANAGE_BYPASS_IO e um IOCTL_STORAGE_MANAGE_BYPASS_IO equivalente foram adicionados como parte dessa infraestrutura. Os minifiltros processam FSCTL_MANAGE_BYPASS_IO, enquanto 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 nas pilhas de armazenamento e filtro do sistema de arquivos 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, há suporte para BypassIO da seguinte maneira:

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

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

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

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

  • Há suporte apenas para arquivos (sem suporte em identificadores de diretório ou volume).

Como o BypassIO funciona

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), depois 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 os drivers de disco e StorNVMe são ignorados.

Em cenários em que a pilha de filtros do sistema de arquivos dá suporte ao BypassIO, mas o volume e/ou a pilha de armazenamento não, os IOs de leitura ignoram a pilha de filtros, mas ainda são enviados 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

Os seguintes DDIs relevantes para filtrar drivers foram adicionados para fornecer suporte ao BypassIO:

Além disso, os seguintes DDIs foram alterados 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 desse campo aumenta o tamanho da estrutura. A versão da estrutura a ser usada começando no Windows 11 é FSRTL_FCB_HEADER_V4.

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

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

  • Se você tiver o Identificador A aberto para 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 mapeada em cache ou 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 divididos, portanto, os filtros devem fechar o arquivo do identificador para que o BypassIO seja retomado.

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

  • Desabilitar um arquivo habilitado para BypassIO faz com que todas as operações bypassIO usem o caminho de E/S tradicional. Depois que a falha for concluída, o sistema alterna de volta para o caminho BypassIO nesse identificador.

Implementando o suporte ao BypassIO em minifiltros

Atualizar seus arquivos INF ou MANIFEST

A partir de Windows 11, os desenvolvedores de filtro 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 valores "SprtFtrs" para todos os filtros ativos.)

Observação

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

Os minifiltros são incentivados a minimizar o veto ao BypassIO tanto quanto 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 imediatamente bloqueadas, retornando ao caminho de E/S tradicional, resultando em desempenho degradado do jogo.

Os minifiltros que não filtram IRP_MJ_READ ou IRP_MJ_WRITE são automaticamente aceitos no suporte ao 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 tenha aceitado.

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.

Determinando se o BypassIO está funcionando

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

> fsutil bypassIo state /v <path>

Onde <o caminho> 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 por BypassIO. Executar o 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 do 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 não seja residente, o sistema alterna 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á em pausa.

O BypassIO não tem impacto nas operações de leitura/gravação de descarregamento.