Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
В этой статье объясняется, как драйверы мини-фильтра файловой системы (минифильтры) можно динамически загружать и выгружать в среде Windows. В ней рассматриваются процедуры инициализации и регистрации, управления экземплярами и процедуры отработки отказа для обеспечения правильной очистки и управления ресурсами во время выгрузки драйвера.
Загрузка
Минифильтр загружается в соответствии с существующими определениями группы заказов нагрузки, если INF-файл минифильтра указывает тип запуска драйвера SERVICE_BOOT_START, SERVICE_SYSTEM_START или SERVICE_AUTO_START. Этот порядок загрузки поддерживает взаимодействие с устаревшими драйверами фильтров. Она может быть загружена в любое время во время работы системы.
Мини-фильтр можно загрузить следующими способами во время работы системы:
С помощью запроса на запуск службы (sc start, net start или API службы).
С помощью явного запроса на загрузку (fltmc load, FltLoadFilter или FilterLoad).
Диспетчер фильтров (FltMgr) вызывает подпрограмму DriverEntry минифильтра после загрузки драйвера. В настоящее время минифильтр может выполнять инициализацию, которая будет применяться ко всем экземплярам минифильтра. В рамках подпрограммы DriverEntry минифильтр вызывает FltRegisterFilter для регистрации процедур обратного вызова с помощью FltMgr и FltStartFiltering, чтобы уведомить FltMgr о том, что минифильтр готов начать присоединение к томам и фильтрации запросов ввода-вывода.
Экземпляры драйверов мини-фильтра определяются в INF-файле , используемом для установки минифильтра. INF-файл минифильтра должен определить экземпляр по умолчанию, и он может определять дополнительные экземпляры. Эти определения применяются ко всем томам. Каждое определение экземпляра включает имя экземпляра, высоту и флаги, указывающие, может ли экземпляр быть подключен автоматически, вручную или оба. Экземпляр по умолчанию используется для упорядочивания минифильтров, чтобы FltMgr вызывала подпрограммы обратного вызова минифильтратора и экземпляра настройки обратного вызова в правильном порядке. Экземпляр по умолчанию также используется с явными запросами вложения, если вызывающий объект не указывает имя экземпляра.
FltMgr автоматически уведомляет минифильтр о доступном томе, вызвав подпрограмму InstanceSetupCallback при первой операции создания после подключения тома. Этот вызов может произойти:
Перед возвратом FltStartFiltering , когда FltMgr перечисляет существующие тома при запуске системы.
Во время выполнения при подключении тома или в результате явного запроса на вложение (fltmc attach, FltAttachVolume или FilterAttach).
Выгрузка
Экземпляр мини-фильтра отключается, когда:
Мини-фильтр выгружается.
Том, к которому подключен экземпляр минифильтра.
Выполняется явный запрос отсоединения (отсоединение fltmc, FltDetachVolume или FilterDetach). Если минифильтр регистрирует подпрограмму InstanceQueryTeardownCallback , он может завершить явный запрос отсоединения путем вызова FilterDetach или FltDetachVolume.
Разрыв продолжается следующим образом:
Если минифильтр зарегистрировал подпрограмму обратного вызова InstanceTeardownStartCallback , FltMgr вызывает его в начале процесса слезотеления. В этой подпрограмме мини-фильтр должен:
- Завершите все ожидающие операции.
- Отмена или завершение других работ, таких как запросы ввода-вывода, созданные мини-фильтром.
- Остановите очередь новых рабочих элементов.
Во время разрыва экземпляра:
- Все выполняемые в настоящее время подпрограммы обратного вызова предоперперации или после операции продолжают обычную обработку.
- Любой запрос ввода-вывода, ожидающий обратного вызова после операции, может быть "сливлен" или отменен.
- Все запросы ввода-вывода, созданные мини-фильтром, продолжают обычную обработку до тех пор, пока они не будут завершены.
Если минифильтр зарегистрировал подпрограмму InstanceTeardownCompleteCallback , FltMgr вызывает эту подпрограмму после завершения всех невыполненных операций ввода-вывода. В этой подпрограмме мини-фильтр закрывает все файлы, которые по-прежнему открыты.
После освобождения всех невыполненных ссылок на экземпляр FltMgr удаляет оставшиеся контексты и экземпляр полностью удаляется.
Мини-фильтр можно выгрузить следующим образом во время работы системы:
Через запрос остановки службы (sc stop, net stop или API службы).
С помощью явного запроса на выгрузку (fltmc выгрузка, FltUnloadFilter или FilterUnload). Минифильтр будет выгружен независимо от любых зависимостей, зарегистрированных в диспетчере управления службами (SCM).
Подпрограмма FilterUnloadCallback минифильтра вызывается при выгрузке минифильтра. Эта подпрограмма закрывает все открытые порты сервера коммуникации, вызывает FltUnregisterFilter и выполняет любую необходимую очистку. Регистрация этой подпрограммы является необязательной. Однако если минифильтр не регистрирует подпрограмму FilterUnloadCallback , минифильтр не может быть выгружен. Дополнительные сведения об этой подпрограмме см. в статье "Написание подпрограммы FilterUnloadCallback".
Подпрограммы диспетчера фильтров для загрузки и выгрузки мини-фильтров
FltMgr предоставляет следующие подпрограммы поддержки для явных запросов на загрузку и выгрузку, которые можно выдавать из пользовательского режима или режима ядра:
Следующие подпрограммы используются для регистрации и отмены регистрации процедур обратного вызова для установки экземпляра и отмены очистки.
Подпрограммы обратного вызова драйвера минифильтра для установки экземпляра, слезотчета и выгрузки
Следующие подпрограммы обратного вызова драйвера минифильтра хранятся как члены структуры FLT_REGISTRATION, передаваемой в качестве параметра в FltRegisterFilter:
| Имя участника подпрограммы обратного вызова | Тип подпрограммы обратного вызова |
|---|---|
| ЭкземплярSetupCallback | PFLT_INSTANCE_SETUP_CALLBACK |
| InstanceQueryTeardownCallback | PFLT_INSTANCE_QUERY_TEARDOWN_CALLBACK |
| InstanceTeardownStartCallback | PFLT_INSTANCE_TEARDOWN_CALLBACK |
| InstanceTeardownCompleteCallback | PFLT_INSTANCE_TEARDOWN_CALLBACK |
| FilterUnloadCallback | PFLT_FILTER_UNLOAD_CALLBACK |