Глубины ввода-вывода Windows (часть 6, финал) — фильтры и минифильтры: почему Procmon и антивирусное сканирование могут перехватывать I/O

· Обновлено: · · Windows, Win32, I/O, Минифильтр, Ядро, Драйвер устройства, Безопасность, Расследование ошибок

История изменений (1 обновлений, последнее 31 Aug 2026)

Журнал изменений этой статьи. Там, где версия до правки была заархивирована, она остаётся доступной для чтения по постоянной ссылке с DOI.

Русский текст переписан по текущему навыку технического перевода как полный перевод японского оригинала.
Первая публикация
Цитирование статьи(DOI (зарегистрированный архив): 10.5281/zenodo.22175404)

Приведённые ниже DOI относятся к ранее зарегистрированным архивным версиям, которые могут отличаться от текущего текста. Для ссылки на текущий текст используйте URL этой страницы.

Го Комура (2026). Глубины ввода-вывода Windows (часть 6, финал) — фильтры и минифильтры: почему Procmon и антивирусное сканирование могут перехватывать I/O. KomuraSoft LLC. https://comcomponent.com/ru/blog/windows-minifilter-filter-drivers/

DOI (зарегистрированный архив)
10.5281/zenodo.22175404
DOI (последняя зарегистрированная версия)
10.5281/zenodo.22175405

Финал серии «Глубины ввода-вывода Windows».

Ещё в части 1 на схеме стека устройств появился блок «фильтры файловой системы (антивирус, шифрование, Procmon и другие)». С тех пор компоненты, которые встают на пути запроса, не раз возвращались в текст: почему Procmon записывает весь I/O (часть 1); «доступ к файлам медленный только в этой среде» (часть 2); точка повторной обработки (reparse point), из‑за которой OneDrive начинает скачивание в момент открытия файла (часть 5). В этой части разберём сам механизм перехвата — драйверы фильтров файловой системы и минифильтры — и закроем вопросы, которые серия оставляла открытыми.

1. Сначала выводы

  • Перехват I/O — официальная точка расширения ОС. Фильтр файловой системы может просматривать, изменять, отклонять запросы к файловой системе и обрабатывать их вместо неё (глава 2).1
  • Нынешний стандарт — минифильтр. Чтобы закрыть проблемы устаревшего способа — прямой вставки в стек устройств (неопределённый порядок, нельзя выгрузить) — модель сменилась на регистрацию обратных вызовов в диспетчере фильтров (FltMgr), который входит в состав Windows (глава 2).23
  • Работают через обратные вызовы pre/post. До и после каждой операции их вызывают в порядке регистрации, то есть в порядке высот. Пропустить дальше, завершить самому, отклонить, изменить — «выбор драйвера» из части 1 работает как есть (глава 3).2
  • Высота (altitude) задаёт порядок. По типу назначения выделены диапазоны номеров (Activity Monitor 360000–389999, Anti-Virus 320000–329999 и т. п.); у каждого экземпляра, присоединённого к тому, уникальный номер (глава 4).45
  • Какие фильтры стоят на вашем ПК, видно через fltmc. Procmon (только пока запущен), антивирус, облачный фильтр OneDrive — все есть в этом списке (глава 5).
  • Исключение в антивирусе — это пропуск сканирования только у этого продукта; на другие минифильтры оно не влияет. Исключение — компромисс: защита слабеет. Для томов разработки есть более безопасный вариант — Dev Drive (асинхронное сканирование) (глава 6).67
  • Расследование «медленно только в этой среде» начинают со столбца Duration в Procmon и сравнения конфигурации fltmc (глава 7).

На схеме сплошная линия обозначает отношение, которое выполняется всегда, а пунктирная — условное отношение (условия указаны в пояснении к каждому отношению на странице сведений). Полный список отношений (всего 34, с доказательствами и степенью уверенности) и определения основных понятий собраны на странице сведений карты знаний (на японском). Данные: JSON-LD / Turtle

2. Как фильтры встали на путь I/O — от устаревшего фильтра к FltMgr

Драйвер фильтра файловой системы — драйвер, который может перехватить запросы, идущие к файловой системе (или к тому под ней). Записывать, наблюдать, менять содержимое, вплоть до отклонения и подмены обработки — на этом стоят антивирус, шифрование, резервное копирование, иерархическое управление хранилищем.1

Старый способ реализации (устаревший фильтр) напрямую вставлял свой объект устройства в стек устройств из части 1. По устройству прямолинейно, на практике проблем полно: порядок в стеке зависит от порядка загрузки и его трудно гарантировать; после загрузки фильтр нельзя безопасно снять (выгрузить); это источник взаимных сбоев и несовместимостей между фильтрами.

Поэтому Windows ввела диспетчер фильтров (FltMgr). Сам FltMgr как штатный фильтр ОС стоит на стеке, а отдельные функции фильтра как минифильтры регистрируют обратные вызовы в FltMgr.2

Способ минифильтра (нынешний стандарт)регистрация обратного вызоварегистрация обратного вызоваДиспетчер фильтров (FltMgr)входит в состав ОС. На стеке стоит только онМинифильтр A (высота больше)Минифильтр B (высота меньше)Файловая системаПорядок однозначно задаёт высотазагрузка в любой момент(поддерживающие фильтры можно и выгрузить)Устаревший способУстаревший фильтр AУстаревший фильтр BФайловая системаПорядок — как загрузилисьбезопасной выгрузки нет

Рис. 1: Смена модели. Не «вставлять» в стек, а «регистрировать» в FltMgr.

Плюсы модели минифильтра официально перечислены: загружать когда угодно, управлять порядком, а фильтр с обратным вызовом выгрузки можно снять и на работающей системе (не реализовавший или отказавший — снять нельзя).3 Чтобы сосуществовать с устаревшими фильтрами, FltMgr может стоять в нескольких местах стека как несколько «кадров» (frames); минифильтр после выгрузки и повторной загрузки возвращается на то же место (ту же высоту).2 Современные антивирус, наблюдение, синхронизация — почти все такие минифильтры.

3. Как работает минифильтр — обратные вызовы pre/post

Минифильтр объявляет FltMgr, какими операциями интересуется. Например, только IRP_MJ_CREATE (открыть) и IRP_MJ_WRITE (писать). Тогда каждый раз, когда такая операция проходит по стеку, вызываются обработчик до операции (обратный вызов pre) и обработчик после операции (обратный вызов post).

NTFSМинифильтр B(высота меньше)Минифильтр A(высота больше)FltMgrДиспетчер I/ONTFSМинифильтр B(высота меньше)Минифильтр A(высота больше)FltMgrДиспетчер I/OЗапрос (IRP_MJ_CREATE и т. п. Мир части 1)Обратный вызов preОбратный вызов preК файловой системеРезультат обработкиОбратный вызов postОбратный вызов postЗавершение (к потоку завершения части 1)

Рис. 2: Обратные вызовы pre/post. Туда — по убыванию высоты, обратно — в обратном порядке.

Что можно сделать в каждом обратном вызове. Та же схема, что «три выбора драйвера» в п. 4.3 части 1, только более безопасным API.

Вызван обратный вызов preЧто делать с этой операциейПропустить дальше(если post не нужен — объявить и это)Отклонитьсразу вернуть отказ в доступе и т. п.пример: вирус найден, запись запрещенаЗавершить самомупример: облачный фильтрдостаёт содержимое и подставляетПоправить параметры или содержимое и пустить дальшепример: фильтр шифрования

Рис. 3: Выбор в обратном вызове pre. «Смотреть, остановить, взять на себя, изменить» — всё это официально можно.

И здесь закрывается вопрос, отложенный в части 4: минифильтр присутствует и на Fast I/O (короткий путь без IRP). FltMgr проводит механизм обратных вызовов и по пути Fast I/O, поэтому ситуации «ушли коротким путём — и не видно», как в эпоху устаревших фильтров, не бывает. Строки FASTIO_ в журнале Procmon — следствие этой позиции.

4. Высота — «отметка» задаёт порядок

Когда нескольким фильтрам интересна одна операция, кто смотрит первым — серьёзный вопрос. Если антивирус смотрит после шифрования, придётся сканировать шифротекст; средство наблюдения должно быть выше всех, иначе целиком поток не увидит.

Этот порядок задаёт высота (altitude). По типу фильтра определены группы порядка загрузки и диапазоны номеров. Точнее, единица, которой дают высоту, — не драйвер целиком, а экземпляр минифильтра, присоединяемый к тому. Номер уникален; чем больше, тем выше на стеке (ближе к приложению).4 Один драйвер может иметь несколько определений экземпляров и появляться на разных высотах — поэтому список fltmc instances идёт по экземплярам.

Ближе к приложению (число больше)FSFilter Activity Monitor: 360000–389999наблюдение и запись I/O (Procmon здесь)FSFilter Undelete: 340000–349999восстановление удалённых файловFSFilter Anti-Virus: 320000–329999обнаружение и удаление вирусовFSFilter Replication: 300000–309999репликация на удалённую сторонуFSFilter Continuous Backup: 280000–289999непрерывное резервное копированиеЕщё ниже: Content Screener /Quota Management / System Recovery /диапазоны шифрования, сжатия и др.Ближе к файловой системе (число меньше)

Рис. 4: Диапазоны высот (выдержка). У каждого назначения своя «отметка, на которой стоять».

Важно: эти номера назначает и ведёт Microsoft.5 Вендор не выбирает число сам — подаёт заявку и получает. Поэтому на любом ПК держится порядок «наблюдение выше антивируса, антивирус выше шифрования». Это и был ответ на «лотерею порядка загрузки» эпохи устаревших фильтров.

Куда подавать заявку, если минифильтр пишете сами. Для разработчика — только следующий шаг. Высоту запрашивают по процедуре Request a Filter Altitude Identifier: письмо на английском на fsfcomm@microsoft.com с темой «Filter altitude request». Нужно заполнить всё: название компании, контакт (не личный, а долгоживущий корпоративный псевдоним), имя продукта, URL продукта, описание фильтра, имя файла драйвера, тип фильтра, тип запуска, желаемую группу порядка загрузки и желаемую высоту. Явно сказано: закладывать 30 рабочих дней, отдельного «срочного» окна нет, назначенный номер может отличаться от желаемого.8 Если у компании уже есть целочисленная высота в той же группе порядка загрузки, дробное значение от этого номера (например 325000.3) можно выбрать самим и достаточно сообщить письмом после факта.8

5. Кто стоит на вашей машине — свой ПК глазами fltmc

Хватит теории, посмотрим на живую систему. В командной строке с правами администратора:

:: Список зарегистрированных минифильтров (с высотой)
fltmc

:: Какой фильтр на каком томе
fltmc instances

:: Со стороны томов
fltmc volumes

fltmc без аргументов даёт тот же список, что fltmc filters. Вывод — четыре столбца; тот же формат есть в документации Microsoft.9

C:\Windows\system32>fltmc

Filter Name                     Num Instances    Altitude    Frame
------------------------------  -------------  ------------  -----
bindflt                                 1        409800         0
cldflt                                  1        409500         0
WdFilter                                4        328010         0
luafv                                   1        135000         0
FileInfo                                4         45000         0

Выше — выдержка для объяснения. Набор фильтров и число экземпляров зависят от среды, но числа высот — фиксированные значения, назначенные Microsoft, их можно сверить с открытым списком из главы 4.

Смысл столбцов.

Столбец Смысл
Filter Name Имя фильтра (драйвера)
Num Instances К скольким томам присоединён (число экземпляров из главы 4)
Altitude Высота. Чем больше, тем ближе к приложению
Frame Номер кадра FltMgr. Если здесь <Legacy> — на стеке живёт устаревший фильтр, который FltMgr не использует.9

Уже по этим пяти строкам видно: bindflt и cldflt в самом верхнем диапазоне FSFilter Top (400000–409999), WdFilter в Anti-Virus (320000–329999), FileInfo в самом нижнем FSFilter Bottom (40000–49999). Картина главы 4 «у каждого назначения своя отметка» читается прямо по числам. И если запустить Procmon и снова выполнить fltmc, в диапазоне Activity Monitor (360000–389999) появится ещё одна строка, начинающаяся с PROCMON.

Набор фильтров зависит от среды, но типичные имена — постоянные герои этой серии.

  • WdFilter — минифильтр Microsoft Defender. Стоит в диапазоне Anti-Virus. На многих ПК — точка, через которую проходит каждый файловый I/O.
  • cldflt — фильтр облачных файлов. Тот компонент, который реализует Files On-Demand OneDrive: когда открывают точку повторной обработки (заполнитель) из части 5, готовит содержимое.10
  • PROCMON24 (и т. п.) — временный минифильтр диапазона Activity Monitor, который появляется только пока запущен Process Monitor. Вот почему Procmon видит весь I/O.11 Сравните fltmc до и после запуска.
  • Прочее: ПО резервного копирования, продукты шифрования (защита от утечек), EDR, виртуализованное хранилище — чем ближе машина к рабочей, тем список длиннее.

Инструмент Procmon, которым пользовались с части 1, в финале видно с другой стороны: наблюдатель сам оказывается частью того же механизма, который наблюдает.

6. Где антивирус тратит время

Самое заметное практическое следствие фильтров — стоимость антивирусного сканирования. Где возникает задержка — на схеме (детали зависят от продукта; ниже типичная форма).

NTFSМинифильтр AVПриложениеNTFSМинифильтр AVПриложениеpre-create: предварительное решение по пути и политикеЕсли файл ещё не сканировали,здесь сканируют содержимоеи при проблеме отменяют открытие── главная причина медленного открытияИзменённый файл сноваидёт в сканирование, например при закрытииНа массе мелких файлов (промежуточные файлы сборки и т. п.)этот цикл складывается на число файловОткрыть файлПропустить (выполнить открытие)Открытие удалось (post-create)Если проблем нет — возвращается дескрипторЗапись / закрытие

Рис. 5: Где возникает стоимость сканирования. На один файл мало, на десятки тысяч — становится доминирующим.

Отсюда точно понимаются две практические темы.

Технический смысл исключения. На I/O по пути из списка исключений сканирование фильтра пропускается. Фильтр со стека не исчезает; ближе к действительности: решение «не проверять» принимается раньше. И ещё одно важное ограничение: исключение действует только на фильтр того продукта, в котором его настроили. Исключение Microsoft Defender меняет сканирование WdFilter и никак не влияет на соседние минифильтры (чужой антивирус, EDR, резервное копирование, шифрование). «Поставил исключение — всё равно медленно» — подозревайте, что время ест другой фильтр (сравнение fltmc в главе 7). Эффект большой, но исключение гарантированно ослабляет защиту в этом месте. Документация Microsoft многократно предупреждает: исключение снижает защиту, определять минимально и вместе с оценкой риска.6 Практика ложных срабатываний и влияния на производительность — в «Если ваше Windows-приложение приняли за вирус».

Новый ответ — Dev Drive. Том, рассчитанный на нагрузку разработки (масса мелких файлов); Microsoft Defender работает в режиме производительности (асинхронное сканирование). Позиционируется как более безопасная альтернатива исключению папки: по умолчанию дополнительные фильтры не присоединяются, но есть и жёсткое предупреждение не эксплуатировать том совсем без фильтров.7 Нынешняя рекомендация Microsoft на случай «хочу быстрее собирать, но исключение страшно».

7. Порядок расследования «медленно только в этой среде»

Инструменты, накопленные серией, в конце складываем в одну процедуру.

даданетнет (спорадически)Симптом: то же приложение,файловый доступ медленный только в одной средеСмотреть столбец Duration в Procmonна какую операцию (IRP_MJ_CREATE? WRITE?)уходит времяОдна операция равномерно медленная?Сравнить fltmc instances с быстрой средойразница конфигурации фильтровВиноват фильтр из разницы?Исключение (с оценкой риска),Dev Drive, разговор с вендоромПодозревать не фильтры:кэш (часть 4), фрагментация и MFT (часть 5),сетевая цель (UNC), само устройство

Рис. 6: Как отличить медленный I/O из‑за фильтров. Ключ — «время на операцию» и «разница конфигурации фильтров между средами».

Два пункта. Первое: у Procmon есть длительность каждой операции (Duration). Разложить «медленно» на «какая операция медленная» — половина поиска виновного. Второе: разница сред часто есть разница конфигурации фильтров. Машина разработки и боевая, свой ПК и ПК заказчика — положить рядом вывод fltmc, и кандидаты уже видны.

Первые три шага, если Procmon ещё не трогали. Столбец Duration по умолчанию не показан — чтобы здесь не остановиться, только операции.

  1. Запустить Procmon.exe от имени администратора.
  2. Options > Select Columns…, в списке столбцов отметить Duration.
  3. Filter > Filter… (Ctrl+L): Process Name / is / имя целевого exe / Include, нажать Add и затем OK (без Add условие не попадёт).

После этого щелчок по Duration сортирует, операции, которые едят время, собираются сверху. Для сводки по процессу и файлу есть ещё Tools > File Summary. Операции ProcMon в целом — в «Практическое руководство по Process Monitor (ProcMon)».

8. Финал серии — карта шести частей

Все блоки карты части 1 открыты. Целое — на одном листе.

завершение возвращается сюдаI/O с кэшем — связка(файловая система вызывает функции кэша)прерывание → завершение (часть 1)ПриложениеReadFile / WriteFile / async-awaitЧасть 2: синхронный и асинхронный I/Oрежим дескриптора и OVERLAPPEDЧасть 3: IOCP и пул потоков .NETприём завершения и выполнение продолженияЧасть 1: диспетчер I/O и IRPразрешение имён, три объекта, стек устройствЧасть 6: фильтры и минифильтрыFltMgr, высота, pre/postЧасть 4: диспетчер кэшапредставление 256 КБ, lazy writer, Fast I/O(работает в связке с NTFS)Часть 5: NTFSMFT, потоки, связи, два журналаСтек хранилища и устройство

Рис. 7: Карта всей серии. Диспетчер кэша — не «слой, через который проходят», а напарник файловой системы; при промахе кэша NTFS шлёт запрос в хранилище.

9. Итог — к финалу серии

Итог последней части.

  • Перехват I/O — официальная точка расширения ОС, нынешний стандарт — регистрация обратных вызовов в FltMgr (минифильтр). Порядок однозначно задаёт высота, номера назначает и ведёт Microsoft.245
  • Работают через обратные вызовы pre/post. Можно пропустить дальше, отклонить, взять на себя, изменить; присутствуют и на Fast I/O. Procmon, Defender, OneDrive работают на том же механизме.11110
  • Исключение = пропуск сканирования, компромисс с защитой. Для томов разработки есть более безопасный вариант — Dev Drive (асинхронное сканирование).67
  • «Медленно только в этой среде» отделяют по Duration в Procmon и по разнице конфигурации fltmc — инструменты серии сами становятся процедурой расследования.

А вывод всей серии одной строкой такой: подсистема I/O Windows устроена единообразно — назначение выбирается в пространстве имён, запрос становится пакетом (IRP) и идёт между слоями, каждый слой может смотреть, удерживать (pending) или брать обработку на себя. Под одной строкой File.ReadAllText каждый раз работает эта конструкция из шести частей. Вместо того чтобы заучивать поведение API, из этой карты можно вывести: «так и должно быть». Именно эту способность серия и должна была дать. Спасибо, что прошли этот длинный путь.

Похожие статьи

Смежные области консультирования

KomuraSoft LLC занимается расследованием проблем производительности и сбоев бизнес-приложений Windows, где задействованы фильтры: «медленно только в одной среде», «средство безопасности мешает своему приложению».

Справочные ссылки

  1. Microsoft Learn, About file system filter drivers. О том, что драйвер фильтра файловой системы — необязательный драйвер, который может перехватывать (intercept) запросы к файловой системе или другому драйверу фильтра; о том, что перехват позволяет расширить или подменить функцию до передачи исходному адресату и даёт запись, наблюдение, изменение данных, предотвращение поведения; о том, что примеры фильтров — антивирусные утилиты, программы шифрования, системы иерархического управления хранилищем. ↩ ↩2 ↩3

  2. Microsoft Learn, Filter Manager Concepts. О том, что диспетчер фильтров (FltMgr) — драйвер режима ядра в составе Windows, который открывает функции, упрощающие разработку минифильтров; о том, что минифильтр может зарегистрировать обработку до и после операций I/O (обратные вызовы pre/post); о том, что ради сосуществования с устаревшими фильтрами FltMgr присоединяется в нескольких местах стека I/O как кадры; о том, что после выгрузки и повторной загрузки минифильтр возвращается на ту же высоту того же кадра. ↩ ↩2 ↩3 ↩4 ↩5

  3. Microsoft Learn, Advantages of the Filter Manager Model. О преимуществах модели минифильтра относительно модели устаревшего фильтра: лучший контроль порядка загрузки фильтров; в отличие от устаревшего фильтра минифильтр можно загрузить в любой момент; возможность выгрузки; подключение к томам DAX и др. ↩ ↩2

  4. Microsoft Learn, Load order groups and altitudes for minifilter drivers. О том, что для фильтров файловой системы определены группы порядка загрузки по назначению и каждой группе выделен диапазон высот; о том, что у каждого драйвера фильтра уникальный идентификатор высоты, задающий положение относительно других фильтров в стеке I/O; о примерах групп: FSFilter Activity Monitor (360000–389999, наблюдение и отчёт об I/O), FSFilter Undelete (340000–349999), FSFilter Anti-Virus (320000–329999, обнаружение и удаление вирусов во время файлового I/O), FSFilter Replication (300000–309999), FSFilter Continuous Backup (280000–289999). ↩ ↩2 ↩3

  5. Microsoft Learn, Allocated altitudes. О том, что высоты минифильтров назначает и ведёт Microsoft и поддерживается открытый список уже назначенных высот; о том, что в списке WdFilter.sys указан как 328010 группы FSFilter Anti-Virus, cldflt.sys — как 409500 группы FSFilter Top. ↩ ↩2 ↩3

  6. Microsoft Learn, Configure and validate exclusions for Microsoft Defender Antivirus. О том, что исключение Microsoft Defender выводит целевые файлы, папки и процессы из сканирования; о многократном предупреждении, что исключение снижает уровень защиты и его следует определять осторожно после оценки необходимости. ↩ ↩2 ↩3

  7. Microsoft Learn, Set up a Dev Drive on Windows 11. О том, что Dev Drive — том, рассчитанный на нагрузку разработки, и Microsoft Defender работает в режиме производительности (асинхронное сканирование); о позиционировании как безопасной альтернативы исключениям папок (secure alternative to folder exclusions) с учётом скорости и производительности; о том, что дополнительные фильтры по умолчанию к Dev Drive не присоединяются; о предупреждении, что эксплуатация без антивирусного фильтра — серьёзный риск безопасности. ↩ ↩2 ↩3

  8. Microsoft Learn, Request a Filter Altitude Identifier. О том, что заявку на новую высоту фильтра подают письмом ASCII с темой «Filter altitude request» на fsfcomm@microsoft.com; о необходимости заполнить все поля: название компании, контактная почта (не личная, а долгоживущий корпоративный псевдоним), имя продукта, URL продукта, описание фильтра, имя файла фильтра, тип фильтра, тип запуска, желаемая группа порядка загрузки, желаемая высота; о том, что закладывать 30 рабочих дней и иного окна заявки нет; о том, что Microsoft может назначить высоту, отличную от желаемой; о том, что при уже имеющейся целочисленной высоте можно самим сделать дробную в той же группе и достаточно сообщить после факта. ↩ ↩2

  9. Microsoft Learn, Blocking legacy file system filter drivers. О том, что fltmc filters из командной строки с правами администратора выводит фильтры четырьмя столбцами «Filter Name / Num Instances / Altitude / Frame»; о том, что Frame <Legacy> — устаревший драйвер фильтра файловой системы без FltMgr, а у минифильтра в Frame стоит число (0 и т. п.). ↩ ↩2

  10. Microsoft Learn, Cloud Files API. О том, что Cloud Files API (облачный фильтр) — основание движка синхронизации, который показывает облачные файлы локально как заполнители и при доступе достаёт содержимое (Files On-Demand OneDrive и т. п.). ↩ ↩2

  11. Microsoft Learn, Process Monitor - Sysinternals. О том, что Process Monitor — продвинутый инструмент наблюдения, который в реальном времени показывает активность файловой системы, реестра и процессов/потоков (как в тексте, во время работы он наблюдается в списке fltmc как минифильтр). ↩ ↩2

Недавние статьи с теми же тегами помогут подробнее изучить близкие темы.

Эти страницы показывают тему статьи в более широком контексте услуг и решений.

Статья напрямую связана со следующими услугами.

Частые вопросы

Вопросы, которые часто возникают при консультациях по теме статьи.

Чем драйвер фильтра файловой системы отличается от минифильтра?
И то и другое — драйверы, которые перехватывают запросы I/O к файловой системе, но поколения механизма перехвата разные. Устаревший (legacy) фильтр напрямую вставлял свой объект устройства в стек устройств файловой системы: положение зависело от порядка загрузки, его трудно гарантировать, а после загрузки фильтр нельзя было безопасно выгрузить. Нынешний стандарт — минифильтр: в диспетчере фильтров (FltMgr), который входит в состав Windows, регистрируют обратные вызовы вида «вызови меня до и после этой операции». Положение однозначно задаёт число — высота (altitude). Загружать фильтр можно в любой момент, а если реализован обратный вызов выгрузки, его можно снять и на работающей системе. Почти все современные фильтры — антивирус, шифрование, средства наблюдения, облачная синхронизация — сделаны как минифильтры.
Почему антивирус может проверять каждое обращение к файлу?
Потому что ОС официально даёт точку расширения именно для этого. Минифильтр регистрирует в диспетчере фильтров код, который вызывается до операции (обратный вызов pre) и после неё (обратный вызов post) — при открытии, чтении, записи файла и так далее. Антивирусный фильтр стоит в диапазоне высот Anti-Virus (320000–329999) и может, например, сразу после успешного открытия (post-create) просканировать содержимое и при проблеме отменить это открытие, чтобы доступ не удался. Как показано в части 1 серии, каждый файловый I/O идёт по стеку устройств: встать в фиксированной точке на этом пути — и можно проверить каждое обращение. Это не хак, а механизм, заложенный в архитектуру ОС.
Что технически делает исключение антивируса (исключение папки)?
Для I/O по пути, который совпал со списком исключений, фильтр этого продукта пропускает сканирование, которое иначе выполнил бы. Сам фильтр со стека не исчезает; ближе к действительности так: решение «этот путь не проверять» принимается раньше. Важное ограничение: исключение действует только у продукта, в котором его настроили. Например, исключение Microsoft Defender меняет сканирование фильтра Defender (WdFilter) и не влияет на соседние минифильтры — чужой антивирус, EDR, резервное копирование и т. п. Каждому продукту нужно своё исключение; если «добавил исключение, а всё равно медленно», причиной может быть другой фильтр. И как многократно предупреждает документация Microsoft, исключение ослабляет защиту в этом месте, поэтому его держат минимальным и только после оценки риска. Для разработки стоит рассмотреть и Dev Drive (режим производительности, то есть асинхронное сканирование) — более безопасную альтернативу исключениям папок.
Как Process Monitor записывает каждый I/O?
Потому что сам Procmon при запуске регистрируется в диспетчере фильтров как минифильтр диапазона высот Activity Monitor. Если из командной строки с правами администратора выполнить fltmc, пока Procmon запущен, в списке появится фильтр с именем, которое начинается с PROCMON. Как минифильтр он присутствует на pre и post операций I/O всех томов и без пропусков записывает, какой процесс какую операцию над каким файлом сделал. Термины IRP и Fast I/O, которые шли через всю серию, прямо видны в окне Procmon именно потому, что он наблюдает с позиции на самом пути I/O.
Когда сборка на машине разработки медленная, стоит ли подозревать фильтры?
Подозревать очень стоит. Сборка — это масса создания, чтения, записи и удаления мелких файлов, и каждый из них становится объектом проверки фильтров (особенно антивирусного сканирования). На такой нагрузке стоимость фильтров проявляется сильнее всего. Базовый порядок расследования: по столбцу Duration в Procmon понять, на какую операцию уходит время, и сравнить конфигурацию фильтров между средами через fltmc instances. Как мера — исключение после оценки риска, плюс Dev Drive, рассчитанный специально на тома разработки. На Dev Drive антивирус работает в режиме производительности (асинхронное сканирование), и Microsoft ставит это как более безопасную альтернативу исключению.

Об авторе

Страница с профилем автора статьи.

Го Комура

Представитель KomuraSoft LLC

Специализируется на разработке программного обеспечения для Windows, техническом консалтинге и расследовании сбоев, особенно в проектах с унаследованными системами и трудно воспроизводимыми ошибками.

Публичные ссылки

Вернуться в блог