Fonctions d’injection de paquets
Un pilote de légende peut appeler les fonctions PAM suivantes pour injecter des données de paquets suspendus ou modifiés dans la pile TCP/IP. Les couches applicables à partir desquelles les données peuvent être injectées, ainsi que les destinations possibles, sont répertoriées dans le tableau suivant.
Fonction d’injection | Couche applicable | Destination |
---|---|---|
couche réseau |
chemin de transfert des données |
|
couche réseau |
chemin de réception des données |
|
couche réseau |
chemin d’envoi de données |
|
données de paquet provenant des couches de transport, de datagramme, d’erreur ICMP ou d’ALE |
chemin de réception des données |
|
données de paquet provenant des couches de transport, de datagramme, d’erreur ICMP ou d’ALE |
chemin d’envoi de données |
|
Segments de données TCP |
un flux de données |
En outre, la fonction FwpsQueryPacketInjectionState0 est utilisée pour inspecter l’historique d’injection des données de paquets.
L’injection intercouche est activée si la légende peut fournir toutes les informations nécessaires requises par la fonction d’injection et si la liste de mémoires tampons net a le format attendu par la fonction d’injection. Par exemple, une légende peut capturer un paquet au niveau du chemin d’accès, modifier son adresse de destination sur celle de l’ordinateur local et appeler FwpsInjectTransportReceiveAsync0 pour rediriger le paquet vers la pile TCP/IP de l’ordinateur local.
À l’exception de l’injection de flux (données TCP), les paquets entrants injectés entrent à nouveau à partir du « bas » de la pile et des couches PAM, tandis que les paquets sortants injectés entrent à partir du « haut » de la pile et des couches PAM. Par exemple, un paquet UDP injecté à partir de la couche de données datagramme entrante entrera à nouveau dans la pile et traversera la couche réseau, la couche de transport, la couche réception ou acceptation ALE (facultatif) et revient dans la couche de données du datagramme. Un autre paquet UDP injecté à partir de la couche réseau sortante entrera à nouveau dans la pile et traversera les couches ALE (facultatif), les données de datagramme et les couches de transport, pour revenir à la couche réseau.
FwpsInjectTransportReceiveAsync0 contourne automatiquement le traitement IPsec pour le paquet réinjecté, car il avait déjà subi la vérification IPsec.
Un paquet injecté par un pilote de légende PAM sera réinscrit à la légende, sauf dans les cas où la modification du paquet l’amène à manquer les conditions de filtre d’origine. PAM fournit la fonction FwpsQueryPacketInjectionState0 pour les légendes afin de déterminer si le paquet a été injecté (ou injecté précédemment) par la légende. Pour empêcher la boucle infinie, les légendes doivent autoriser les paquets auto-injectés.
Les légendes doivent ajuster la somme de contrôle de l’adresse IP ou de la couche de transport, ou les deux, après avoir modifié un paquet IP. Une légende peut définir la somme de contrôle sur 0 pour UDP sur les paquets IPv4. Pour être compatible avec le déchargement de la somme de contrôle de la couche de transport et pour ajuster la somme de contrôle complète par rapport aux calculs de pseudo somme de contrôle en conséquence, une légende peut utiliser la logique suivante :
NDIS_TCP_IP_CHECKSUM_PACKET_INFO ChecksumInfo;
ChecksumInfo.Value =
(ULONG) (ULONG_PTR)NET_BUFFER_LIST_INFO(
NetBufferList,TcpIpChecksumNetBufferListInfo);
Si ChecksumInfo.Transmit.NdisPacketTcpChecksum a la valeur TRUE, l’opération d’envoi TCP est déchargée. Si ChecksumInfo.Transmit.NdisPacketUdpChecksum a la valeur TRUE, l’opération d’envoi UDP est déchargée.
Dans Windows Vista avec Service Pack 1 (SP1) et Windows Server 2008, si inMetaValues-headerIncludeHeaderLength est supérieur à 0, le paquet sortant est une réinjection d’envoi RAW qui inclut un en-tête> IP. Pour effectuer des réinjections d’envoi RAW qui incluent un en-tête IP pour Windows Vista avec SP1 et Windows Server 2008, vous devez retirer le paquet cloné de la quantité dans inMetaValues-headerIncludeHeaderLength> et copier inMetaValues-headerIncludeHeader> sur l’espace nouvellement étendu. Ensuite, utilisez FwpsInjectTransportSendAsync0 avec la liste de mémoires tampons net pour le paquet et laissez le paramètre FWPS_TRANSPORT_SEND_PARAMS0 défini sur NULL. Pour plus d’informations sur les opérations de retraitement pour les listes de mémoires tampons nettes, consultez Retrait et opérations avancées.
Note Pour les opérations d’envoi brutes, la liste de mémoires tampons net ne doit contenir qu’un seul tampon net. Si votre liste de mémoires tampons nettes contient plusieurs mémoires tampons nettes, vous devez convertir votre liste de mémoires tampons nettes en une série de listes de mémoires tampons nettes, et chacune d’elles doit contenir une seule mémoire tampon nette. Pour plus d’informations sur la gestion de la liste de mémoires tampons net, consultez architecture NET_BUFFER.