Обход драйверов для фильтров
Об обходе
Функция 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 не влияет на разгрузку операций чтения и записи.