Considérations relatives à la programmation du pilote de légende
Tenez compte des rubriques suivantes lorsque vous programmez un pilote de légende 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 légende 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é de filtrage intégrée standard. 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 Microsoft Windows SDK.
Choix de la couche de filtrage
Un pilote de légende doit filtrer les données réseau au niveau de 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 relatives aux couches de filtrage que votre pilote doit utiliser pour garantir la compatibilité avec IPsec dans Windows, consultez Développement de pilotes de légende IPsec-Compatible.
Blocage au niveau des couches établies du flux Application Layer Enforcement (ALE)
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 le flux ALE (FWPM_LAYER_ALE_FLOW_ESTABLISHED_V4 ou FWPM_LAYER_ALE_FLOW_ESTABLISHED_V6), sa fonction de légende classifyFn ne doit jamais retourner FWP_ACTION_BLOCK pour l’action. La décision d’autoriser ou de rejeter une connexion ne doit pas être prise au niveau de l’une des couches de filtrage établies par le flux ALE. Une telle décision doit toujours être prise au niveau de l’une des autres couches de filtrage ALE.
La seule raison valable pour laquelle une telle fonction de légende classifyFn retourne FWP_ACTION_BLOCK pour l’action est si une erreur qui se produit peut présenter un risque de sécurité potentiel si la connexion établie n’est pas terminée. Dans ce cas, le retour d’FWP_ACTION_BLOCK pour l’action ferme la connexion pour empêcher l’exploitation du risque potentiel de sécurité.
Temps d’exécution de la fonction de légende
Étant donné que le moteur de filtre appelle généralement les fonctions de légende d’une légende à l’adresse IRQL = DISPATCH_LEVEL, assurez-vous que ces fonctions terminent leur exécution aussi rapidement que possible pour que le système fonctionne efficacement. L’exécution étendue à IRQL = DISPATCH_LEVEL peut nuire aux performances globales du système.
Injection dans le chemin d’accès aux 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éassemblage à partir de fragments de paquets IP. Il n’existe aucun mécanisme fiable qui indique si une liste de mémoires tampons nettes est réassemblage à partir de fragments.
Injection inline de paquet TCP à partir de couches de transport
En raison du comportement de verrouillage de la pile TCP, une légende au niveau de la couche de transport ne peut pas injecter un paquet TCP nouveau ou cloné à partir de la fonction de légende classifyFn . Si l’injection inline est souhaitée, la légende doit mettre en file d’attente un DPC pour effectuer l’injection.
Alignement de l’en-tête d’adresse IP sortante
La MDL qui décrit l’en-tête IP dans une liste de mémoires tampons réseau (NET_BUFFER_CURRENT_MDL(NET_BUFFER_LIST_FIRST_NB(netBufferList))) doit être alignée sur le pointeur lorsque l’une des fonctions d’injection de paquets est utilisée pour injecter des données de paquets dans un chemin sortant. Étant donné que la MDL d’en-tête IP d’un paquet entrant peut être alignée sur les pointeurs, une légende doit reconstruire l’en-tête IP (si elle n’est pas déjà alignée) lors de l’injection d’un paquet entrant dans un chemin sortant.