Поделиться через


Обход драйверов для фильтров

Об обходе

Функция BypassIO предлагает оптимизированный путь ввода-вывода для чтения из файлов. Цель этого пути заключается в сокращении нагрузки на ЦП операций чтения, что помогает удовлетворить требования ввода-вывода к загрузке и запуску игр следующего поколения в Windows. BypassIO является частью инфраструктуры для поддержки DirectStorage в Windows. Она доступна начиная с Windows 11.

Важно, чтобы минифильтры реализовали поддержку BypassIO, и что вы поддерживаете BypassIO как можно больше. Без поддержки фильтров производительность игры снижается, что приводит к плохому игровому интерфейсу для конечных пользователей.

В будущих выпусках Windows будет использоваться более широкое приложение.

BypassIO — это концепция для каждого дескриптора. При запросе BypassIO он предназначен для явного дескриптора файлов. BypassIO не влияет на другие дескрипторы для этого файла.

FSCTL_MANAGE_BYPASS_IO и эквивалентные IOCTL_STORAGE_MANAGE_BYPASS_IO были добавлены в рамках этой инфраструктуры. Минифильтры обрабатываются FSCTL_MANAGE_BYPASS_IO, а IOCTL_STORAGE_MANAGE_BYPASS_IO отправляются файловыми системами в стеки томов и хранилищ. Эти коды управления предназначены для диагностики: они возвращают удостоверение драйвера, завершившемся сбоем запроса BypassIO, и причиной вето на него.

Эта страница содержит сведения об архитектуре в фильтрах файловой системы и стеках хранилища, а также сведения о том, как реализовать BypassIO в мини-драйвере. См. раздел "Обходио" для драйверов хранилища для сведений Об Обходио, относящихся к драйверам хранилища.

Область поддержки BypassIO

Начиная с Windows 11, BypassIO поддерживается следующим образом:

  • Только в клиентских системах Windows. В будущем выпуске будет добавлена поддержка системы сервера.

  • Только на устройствах хранения NVMe. Поддержка других технологий хранения будет добавлена в будущий выпуск.

  • Только в файловой системе NTFS. Поддержка других файловой системы будет добавлена в будущий выпуск.

  • Поддерживаются только некшированные операции чтения. Поддержка некшированных записей будет добавлена в будущий выпуск.

  • Поддерживается только в файлах (не поддерживается в дескрипторах каталогов или томов).

Как работает BypassIO

При вызове NtReadFile в FileHandle с поддержкой BypassIO операция обычно не проходит через традиционный стек ввода-вывода, который проходит по всему стеку файловой системы, стеку томов и стеку хранилища. Вместо этого операция выполняется непосредственно из диспетчера операций ввода-вывода в файловую систему (NTFS), а затем на драйвер StorNVMe. С полной поддержкой BypassIO FileHandle:

  • Все фильтры файловой системы пропускаются.
  • Все фильтры стека томов пропускаются.
  • Все фильтры и драйверы стека хранилища над драйвером диска, а также между драйверами диска и StorNVMe пропускаются.

В сценариях, когда стек фильтров файловой системы поддерживает BypassIO, но стек тома и (или) хранилища не выполняет следующие действия.

  • Чтение операций ввода-вывода обходят стек фильтров.
  • Операции чтения iOs по-прежнему отправляются через стек тома и (или) хранилища.

Этот уровень поддержки называется частичным обходом.

Изображение, показывающее традиционный путь ввода-вывода для запроса на чтение.

Изображение, показывающее путь обхода операций ввода-вывода для запроса на чтение.

Изменения и дополнения DDI для BypassIO

Для предоставления поддержки BypassIO добавлены следующие DDIs, относящиеся к драйверам фильтров:

  • Функция FltVetoBypassIo
  • перечислитель FS_BPIO_INFLAGS
  • структура FS_BPIO_INFO
  • структура FS_BPIO_INPUT
  • перечислитель FS_BPIO_OPERATIONS
  • перечислитель FS_BPIO_OUTFLAGS
  • структура FS_BPIO_OUTPUT
  • структура FS_BPIO_RESULTS
  • код элемента управления FSCTL_MANAGE_BYPASS_IO
  • Функция FsRtlGetBypassIoOpenCount

Кроме того, следующие DDIs были изменены для поддержки BypassIO:

  • В структуру FSRTL_ADVANCED_FCB_HEADER добавлено поле BypassIoOpenCount. Файловая система использует это поле для поддержания количества уникальных fileObjects в потоке, включаемом в настоящее время с поддержкой BypassIO. Добавление этого поля увеличивает размер структуры. Версия структуры, используемая начиная с Windows 11, FSRTL_FCB_HEADER_V4.

Влияние других операций на дескриптор с поддержкой BypassIO

Включение BypassIO в дескрипторе не влияет на другие дескрипторы. Однако другие операции с дескриптором с поддержкой BypassIO влияют на использование BypassIO, например в следующих сценариях:

  • Если у вас есть дескриптор A, открытый для файла, на котором включено и работает обходное управление, и кто-то (например, другой поток или процесс) открывает дескриптор B для выполнения кэшированных операций ввода-вывода или памяти, то ОбходИО временно приостановлено на Handle A, пока дескриптор B не будет закрыт. Вместо этого система использует традиционный путь ввода-вывода, чтобы гарантировать, что устаревшие данные не происходят. Система продолжает использовать традиционный путь ввода-вывода для этого дескриптора до тех пор, пока не будут отключены все разделы данных и карты кэша. В результате фильтры должны закрыть файл дескриптора до возобновления обхода.

  • Если файл с поддержкой BypassIO помечается разреженным, все операции BypassIO начинаются с помощью традиционного пути ввода-вывода.

  • Дефрисовка файла с поддержкой BypassIO приводит ко всем операциям BypassIO использовать традиционный путь ввода-вывода. После завершения дефрикации система переключается обратно на путь BypassIO в этом дескрипторе.

Реализация поддержки BypassIO в мини-фильтрах

Обновление ФАЙЛОВ INF или MANIFEST

Начиная с Windows 11 разработчики фильтров должны добавить SUPPORTED_FS_FEATURES_BYPASS_IO в SupportedFeatures в INF-файлы драйвера или MANIFEST. (В командной строке с повышенными привилегиями можно fltmc instances просмотреть значения SprtFtrs для всех активных фильтров.)

Примечание.

Фильтр, который никогда не может поддерживать BypassIO, должен по-прежнему добавлять SUPPORTED_FS_FEATURES_BYPASS_IO в состояние SupportedFeatures , а затем вето соответствующим образом внутри фильтра, указав причину.

Минифильтры рекомендуется максимально сократить вето на обход обхода.

Если мини-фильтр подключается к тому, на котором включен Обходио, но этот минифильтр не обновил свой параметр SupportedFeatures , чтобы включить SUPPORTED_FS_FEATURES_BYPASS_IO, все операции BypassIO с этим томом немедленно блокируются, возвращаясь к традиционному пути ввода-вывода, что приводит к снижению производительности игры.

Минифильтры, которые не фильтруют IRP_MJ_READ или IRP_MJ_WRITE, автоматически выбираются в службу поддержки BypassIO, как если бы они добавили SUPPORTED_FS_FEATURES_BYPASS_IO в SupportedFeatures.

Операции FS_BPIO_OP_ENABLE и FS_BPIO_OP_QUERY завершаются сбоем в стеке, если есть подключенный мини-фильтр, который не выбирается.

Реализация поддержки запросов BypassIO

Минифильтры должны добавить поддержку запросов BypassIO, которые отправляются через код элемента управления FSCTL_MANAGE_BYPASS_IO . Дополнительные сведения см. в разделе "Поддержка операций обхода".

Определение того, работает ли Обходное обновление

Добавленная команда fsutil выдает FSCTL_MANAGE_BYPASS_IO указание операции FS_BPIO_OP_QUERY. Отображаемые результаты определяют первый драйвер, который предотвращает Обходио и причину.

> fsutil bypassIo state /v <path>

Где <путь> может быть томом, каталогом или определенным именем файла, а /v — необязательным флагом детализации.

В этом первом примере предположим, что минифильтр WOF не принял участие в BypassIO. Выполнение команды fsutil bypassIo state c:\ приводит к следующим выходным данным:

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.

Во втором примере выполнение fsutil bypassIO state /v c:\ в системе, в которой BitLocker включена, приводит к следующим выходным данным:

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

Поведение, зависят от NTFS

Обходной файл можно включить в резидентном файле NTFS; однако файл принимает традиционный путь ввода-вывода до тех пор, пока он является резидентом. Если запись возникает в файл, чтобы он не был неиспользован, система переключается на использование пути BypassIO.

Не удается включить сжатие NTFS в активном файле BypassIO.

Шифрование NTFS можно включить в активном файле BypassIO. Обход обхода приостановлен.

BypassIO не влияет на разгрузку операций чтения и записи.