Partager via


Considérations relatives à la programmation des pilotes d'extension

Tenez compte des points suivants lorsque vous programmez un pilote de rappel de la Plateforme de filtrage Windows.

Mode utilisateur et mode noyau

Si le filtrage souhaité peut être effectué à l’aide de la fonctionnalité de filtrage standard intégrée à la plateforme de filtrage Windows, les éditeurs de logiciels indépendants (ISV) doivent écrire des applications de gestion en mode utilisateur pour configurer le moteur de filtre au lieu d’écrire des pilotes de légende en mode noyau. Un pilote de renvoi en mode noyau ne doit être écrit que lorsque vous devez traiter les données réseau d'une manière qui ne peut pas être gérée par la fonctionnalité standard de filtrage intégrée. Pour plus d’informations sur l’écriture d’une application de gestion de la plateforme de filtrage Windows en mode utilisateur, consultez la documentation de la plateforme de filtrage Windows dans le Kit de développement logiciel (SDK) Microsoft Windows.

Choix de la couche de filtrage

Un pilote de rappel doit filtrer les données réseau à la couche de filtrage la plus élevée possible dans la pile réseau. Par exemple, si la tâche de filtrage souhaitée peut être gérée au niveau de la couche de flux, elle ne doit pas être implémentée au niveau de la couche réseau. Pour plus d’informations sur les recommandations des couches de filtrage que votre pilote devrait utiliser pour garantir la compatibilité avec IPsec dans Windows, consultez Conception de pilotes de point d'appel IPsec-Compatible.

Blocage à l'Enforcement de la couche d'application (ALE) - Flux de couches établies

En règle générale, si une légende a été ajoutée au moteur de filtre à l’une des couches de filtrage établies par l’ALE (FWPM_LAYER_ALE_FLOW_ESTABLISHED_V4 ou FWPM_LAYER_ALE_FLOW_ESTABLISHED_V6), sa fonction de légende classifieFn ne doit jamais retourner FWP_ACTION_BLOCK pour l’action. Une décision d’autoriser ou de rejeter une connexion ne doit pas être prise à l’une des couches de filtrage établies par le flux ALE. Une telle décision doit toujours être prise à l’une des autres couches de filtrage ALE.

La seule raison valable pour qu'une telle fonction de rappel classifyFn retourne FWP_ACTION_BLOCK en tant qu'action est si une erreur se produit et pourrait poser un risque potentiel pour la sécurité si la connexion établie n'est pas terminée. Dans ce cas, en retournant FWP_ACTION_BLOCK pour l'action, la connexion est fermée afin de protéger contre l'exploitation d'un risque potentiel de sécurité.

Temps d’exécution de la fonction de rappel

Étant donné que le moteur de filtre appelle généralement les fonctions de callout à IRQL = DISPATCH_LEVEL, assurez-vous que ces fonctions terminent leur exécution le plus rapidement possible pour que le système fonctionne efficacement. L’exécution étendue à IRQL = DISPATCH_LEVEL peut affecter négativement les performances globales du système.

Injection dans le chemin de données de réception

Les légendes doivent recalculer les sommes de contrôle IP avant d’appeler des fonctions d’injection de paquets qui injectent dans le chemin de données de réception, car la somme de contrôle dans le paquet d’origine peut ne pas être correcte lorsque le paquet est réassembté à partir de fragments de paquets IP. Il n’existe aucun mécanisme fiable qui indique si une liste de tampons réseau est réassemblée à partir de fragments.

Injection en ligne du paquet TCP à partir des couches de transport

En raison du comportement de verrouillage de la pile TCP, un callout au niveau de la couche de transport ne peut pas injecter un paquet TCP nouveau ou cloné à partir de la fonction classifyFn . Si l’injection inline est souhaitée, la fonction d'appel doit enfile un DPC pour effectuer l’injection.

Alignement de l’en-tête IP sortant

Le MDL qui décrit l’en-tête IP d’une liste de mémoires tampons net (NET_BUFFER_CURRENT_MDL(NET_BUFFER_LIST_FIRST_NB(netBufferList))) doit être aligné sur le pointeur lorsqu’une des fonctions d’injection de paquets est utilisée pour injecter des données de paquets dans un chemin sortant. Étant donné qu’un MDL d’en-tête IP d’un paquet entrant peut être aligné sur le pointeur, un appel de service doit reconstruire l’en-tête IP (s’il n’est pas déjà aligné) lorsqu'un paquet entrant est injecté dans un chemin sortant.

Pilotes de légende de la plateforme de filtrage Windows