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


Контексты ссылок

Диспетчер фильтров использует подсчет ссылок для управления временем существования контекста минифильтра. Число ссылок — это число, указывающее состояние контекста.

При каждом успешном создании контекста FltMgr инициализирует число ссылок контекста в один. Это называется начальной ссылкой на контекст.

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

Если контекст больше не нужен, его количество ссылок должно быть уменьшено. Положительное число ссылок означает, что контекст можно использовать. Когда число ссылок становится нулевым, контекст становится непригодным для использования, и FltMgr в конечном итоге освобождает его.

FltMgr освобождает начальную ссылку на контекст (уменьшает число ссылок до нуля) при сносе объекта, а затем вызывает необязательный вызов очистки контекста фильтра. Хотя это происходит редко, если мини-фильтр должен удалить контекст из объекта перед удалением, минифильтр должен безопасно освободить начальную ссылку на контекст, вызвав FltDeleteContext.

Минифильтр может добавлять собственную ссылку на контекст, вызывая Метод FltReferenceContext для увеличения числа ссылок контекста. Мини-фильтр должен в конечном итоге удалить эту добавленную ссылку, вызвав FltReleaseContext.

Ниже приведен краткий пример журнала подсчета ссылок для типичного объекта. Предположим, что все вызовы FLT API успешно выполнены.

Обратный вызов фильтра Вызов API Flt Количество ссылок на контекст Описание
Предварительное создание FltAllocateContext 1 Фильтр обрабатывает предварительное создание и решает, что он может захотеть отслеживать файл. Он выделяет контекст потока, что приводит к тому, что FltMgr инициализирует число ссылок 1. Фильтр передает контекст обратному вызову PostCreate с помощью параметра CompletionContext .
PostCreate FltSetStreamContext 2 Фильтр передал контекст, выделенный во время preCreate , в обратный вызов PostCreate . Создание выполнено успешно, поэтому фильтр присоединяет контекст, что приводит к тому, что FltMgr увеличивает количество ссылок.
PostCreate FltReleaseContext 1 Так как FltSetStreamContext увеличивает количество ссылок, фильтр должен удалить дополнительное число. Число ссылок равно 1 после того, как фильтр освобождает контекст, поэтому контекст остается активным. Если бы фильтр решил, что этот файл не волнует, он мог бы пропустить вызов FltSetStreamContext и просто вызвать FltReleaseContext. В этом случае счетчик пошел бы до 0, а контекст был бы освобожден.
Предварительное прочтение FltGetStreamContext 2 Фильтр видит операции ввода-вывода для чтения и хочет узнать, отслеживает ли он этот файл. Он запрашивает контекст потока и получает его, поэтому он знает, что хочет отслеживать этот файл. FltMgr увеличивает число ссылок.
Предварительное прочтение FltReleaseContext 1 Фильтр выполняется с использованием контекста, поэтому он освобождает его, что приводит к уменьшению количества ссылок. Каждый FltGet*Context должен быть сбалансирован с помощью FltReleaseContext.
Предварительное очистка FltGetStreamContext 2 Фильтр запрашивает и получает свой контекст, который увеличивает число ссылок.
Предварительное очистка FltReleaseContext 1 Фильтр выполняется с помощью контекста, поэтому освобождает его, что уменьшает количество ссылок.
Обратный вызов очистки контекста 0 Файловая система разрывает базовый объект потока. (В конкретном случае объекта потока очистка активируется IRP_MJ_CLOSE. FltMgr уменьшает количество ссылок до 0, а затем вызывает обратный вызов очистки контекста фильтра. Теперь фильтр имеет возможность очистить свой контекст.