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


Рекомендации по программированию драйвера выносок

При программировании драйвера выноски платформы фильтрации Windows учитывайте следующие разделы.

Пользовательский режим и режим ядра

Если необходимую фильтрацию можно выполнить с помощью стандартной функции фильтрации, встроенной в платформу фильтрации Windows, независимые поставщики программного обеспечения (ISV) должны написать приложения для управления пользовательским режимом, чтобы настроить подсистему фильтрации, а не создавать драйверы выносок в режиме ядра. Драйвер выноски в режиме ядра следует записывать только в том случае, если необходимо обрабатывать сетевые данные способами, которые не могут быть обработаны стандартными встроенными функциями фильтрации. Сведения о создании приложения управления платформой фильтрации Windows в пользовательском режиме см. в документации по платформе фильтрации Windows в Microsoft Windows SDK.

Выбор слоя фильтрации

Драйвер выноски должен фильтровать сетевые данные на максимально возможном уровне фильтрации в сетевом стеке. Например, если требуемая задача фильтрации может быть обработана на уровне потока, она не должна быть реализована на сетевом уровне. Дополнительные сведения о рекомендациях уровней фильтрации, которые драйвер должен использовать для обеспечения совместимости с IPsec в Windows, см. в статье Разработка драйверов выносок IPsec-Compatible.

Блокировка на установленных уровнях потока применения прикладного уровня (ALE)

Как правило, если выноска была добавлена в подсистему фильтрации на одном из установленных уровней фильтрации потока ALE (FWPM_LAYER_ALE_FLOW_ESTABLISHED_V4 или FWPM_LAYER_ALE_FLOW_ESTABLISHED_V6), ее функция выноски classifyFn никогда не должна возвращать FWP_ACTION_BLOCK для действия. Решение о авторизации или отклонении подключения не должно приниматься на одном из установленных уровней фильтрации потока ALE. Такое решение всегда следует принимать на одном из других уровней фильтрации ALE.

Единственной веской причиной, по которой функция выноски classifyFn возвращает FWP_ACTION_BLOCK для действия, является ошибка, которая может представлять потенциальную угрозу безопасности, если установленное подключение не будет завершено. В этом случае возврат FWP_ACTION_BLOCK для действия закрывает подключение, чтобы предотвратить использование потенциального риска безопасности.

Время выполнения функции выноски

Так как подсистема фильтрации обычно вызывает функции выноски в IRQL = DISPATCH_LEVEL, убедитесь, что эти функции выполняются как можно быстрее, чтобы обеспечить эффективную работу системы. Расширенное выполнение в IRQL = DISPATCH_LEVEL может негативно повлиять на общую производительность системы.

Внедрение в путь получения данных

Выноски должны пересчитывать контрольные суммы IP-адресов перед вызовом функций внедрения пакетов , которые внедряются в путь получения данных, так как контрольная сумма в исходном пакете может быть неправильной при повторном сборе пакета из фрагментов IP-пакетов. Нет надежного механизма, который указывает, выполняется ли повторное извлечение списка чистого буфера из фрагментов.

Встроенное внедрение TCP-пакета из транспортных слоев

Из-за поведения блокировки стека TCP выноска на транспортном уровне не может внедрить новый или клонированные ПАКЕТЫ TCP из функции выноски classifyFn . Если требуется встроенное внедрение, выноска должна ставить DPC в очередь для выполнения внедрения.

Выравнивание заголовка исходящего IP-адреса

MDL, описывающий заголовок IP-адреса в списке чистого буфера (NET_BUFFER_CURRENT_MDL(NET_BUFFER_LIST_FIRST_NB(netBufferList))) должен быть выровнен по указателю, если одна из функций внедрения пакетов используется для внедрения данных пакетов в исходящий путь. Поскольку MDL IP-заголовка входящего пакета может быть выровнен по указателю, выноска должна перестроить заголовок IP(если он еще не выровнен) при внедрении входящего пакета в исходящий путь.

Драйверы выносок платформы фильтрации Windows