Ссылки на контексты

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

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

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

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

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

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

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

Обратный вызов фильтра API Flt вызывается Число ссылок на контекст Описание
PreCreate 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* должен быть уравновешен с FltReleaseContext.
PreCleanup FltGetStreamContext 2 Фильтр запрашивает и получает его контекст, который увеличивает число ссылок.
PreCleanup FltReleaseContext 1 Фильтр выполняется с помощью контекста и освобождает его, что приводит к уменьшению количества ссылок.
Обратный вызов очистки контекста 0 Файловая система разрушает базовый объект потока. (В конкретном случае объекта потока разрыв активируется IRP_MJ_CLOSE). FltMgr уменьшает число ссылок до 0, а затем вызывает обратный вызов для очистки контекста фильтра. Теперь фильтр имеет возможность очистить его контекст.