Инициализация драйвера фильтра

Инициализация драйвера фильтра происходит сразу после загрузки драйвера системой. Драйверы фильтров загружают как системные службы. Система может загружать драйверы фильтров в любое время до, во время или после загрузки драйверов мини-порта. NDIS может подключить модуль фильтра к адаптеру мини-порта после того, как станет доступен адаптер минипорта типа, поддерживаемый драйвером фильтра, и инициализация драйвера фильтра будет завершена.

Во время запуска стека драйверов система загружает драйверы фильтров, если они еще не загружены. Дополнительные сведения о запуске стека драйверов, включающего модули фильтров, см. в разделе Запуск стека драйверов.

После загрузки драйвера фильтра система вызывает подпрограмму DriverEntry драйвера.

Система передает в DriverEntry два аргумента:

  • Указатель на объект драйвера, созданный системой ввода-вывода.

  • Указатель на путь к реестру, который указывает, где хранятся параметры драйвера.

DriverEntry возвращает STATUS_SUCCESS или эквивалентное ей NDIS_STATUS_SUCCESS, если драйвер успешно зарегистрирован в качестве драйвера фильтра NDIS. Если DriverEntry не удается инициалировать, распространяя состояние ошибки, возвращаемое функцией NdisXxx или подпрограммой поддержки режима ядра, драйвер не останется загруженным. DriverEntry должен выполняться синхронно; то есть он не может возвращать STATUS_PENDING или эквивалентные ему NDIS_STATUS_PENDING.

Драйвер фильтра передает объект драйвера в функцию NdisFRegisterFilterDriver при регистрации с помощью NDIS в качестве драйвера фильтра. Драйвер может использовать путь к реестру для получения сведений о конфигурации. Дополнительные сведения о доступе к сведениям о конфигурации драйвера фильтра см. в разделе Доступ к сведениям о конфигурации для драйвера фильтра.

Драйвер фильтра вызывает NdisFRegisterFilterDriver из подпрограммы DriverEntry . Драйверы фильтров экспортируют набор функций FilterXxx, передав структуру NDIS_FILTER_DRIVER_CHARACTERISTICS в NdisFRegisterFilterDriver с параметром FilterCharacteristics .

Структура NDIS_FILTER_DRIVER_CHARACTERISTICS указывает точки входа для обязательных и необязательных функций FilterXxx . Некоторые необязательные функции можно обойти. Дополнительные сведения об обходе функций см. в разделе Режим обхода данных.

Драйверы, вызывающие NdisFRegisterFilterDriver, должны быть подготовлены к немедленному вызову любой из своих функций FilterXxx .

Структура NDIS_FILTER_DRIVER_CHARACTERISTICS определяет точки входа для этих обязательных функций FilterXxx :

FilterAttach

FilterDetach

FilterRestart

FilterPause

Структура NDIS_FILTER_DRIVER_CHARACTERISTICS определяет точки входа для этих необязательных и не изменяемых во время выполнения функций FilterXxx :

FilterSetOptions

FilterSetModuleOptions

FilterOidRequest

FilterOidRequestComplete

FilterStatus

FilterNetPnPEvent

FilterDevicePnPEventNotify

FilterCancelSendNetBufferLists

Структура NDIS_FILTER_DRIVER_CHARACTERISTICS определяет точки входа по умолчанию для этих необязательных и изменяемых во время выполнения функций FilterXxx :

FilterSendNetBufferLists

FilterSendNetBufferListsComplete

FilterReturnNetBufferLists

FilterReceiveNetBufferLists

Предыдущие четыре функции также определены в структуре NDIS_FILTER_PARTIAL_CHARACTERISTICS . Эта структура определяет функции, которые можно изменить во время выполнения путем вызова функции NdisSetOptionalHandlers из функции FilterSetModuleOptions . Если драйвер фильтра изменит эти частичные характеристики во время выполнения, он должен предоставить точку входа для FilterSetModuleOptions. Частичные характеристики могут быть разными для каждого модуля фильтра. Дополнительные сведения см. в разделе Запуск модуля фильтра.

NDIS вызывает функцию FilterSetOptions в контексте вызова NdisFRegisterFilterDriver. FilterSetOptions регистрирует необязательные службы в NDIS. Дополнительные сведения см. в разделе Настройка дополнительных служб драйверов фильтров.

Если вызов NdisFRegisterFilterDriver завершается успешно, NDIS заполняет переменную в NdisFilterDriverHandle дескриптором драйвера фильтра. Драйвер фильтра сохраняет этот дескриптор, а затем передает его в функции NDIS, такие как NdisFDeregisterFilterDriver, которым требуется дескриптор драйвера фильтра в качестве входного параметра. Когда драйвер выгружается, он должен вызвать функцию NdisFDeregisterFilterDriver , чтобы освободить ресурсы драйвера, выделенные NdisFRegisterFilterDriver.

После возврата FilterSetOptions модули фильтров находятся в состоянии Отсоединенный . NDIS может вызывать функцию FilterAttach драйвера фильтра в любое время после возврата вызова FilterSetOptions . Драйвер выполняет инициализацию модуля фильтра в функции FilterAttach . Дополнительные сведения о присоединении модуля фильтра к стеку драйверов см. в разделе Присоединение модуля фильтра.

Драйвер фильтра также выполняет любую другую инициализацию, необходимую для конкретного драйвера, в DriverEntry. Драйвер фильтра должен освободить ресурсы, относящиеся к конкретному драйверу, которые он выделяет в своей подпрограмме FilterDriverUnload . Дополнительные сведения см. в разделе Выгрузка драйвера фильтра.