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


Загрузка и выгрузка минифильтра

В этой статье объясняется, как драйверы мини-фильтра файловой системы (минифильтры) можно динамически загружать и выгружать в среде 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