Relations entre NET_BUFFER_LIST générations
Les auteurs de pilotes doivent comprendre et maintenir la relation entre les structures NET_BUFFER_LIST parentes (d’origine) et les structures enfants (dérivées) qui résultent des opérations de clone, de fragment et de réassemble.
L’appelant d’une fonction clone/fragment/réassemble conserve la relation parent/enfant, y compris le pointeur parent dans la structure NET_BUFFER_LIST enfant et un nombre d’enfants. Le nombre d’enfants garantit que l’appelant libère le parent une fois que tous les enfants ont été libérés. Les règles suivantes s’appliquent :
Une fois qu’un pilote a créé des structures enfants à partir d’une structure NET_BUFFER_LIST , il doit conserver la propriété de la structure parente et doit passer les structures enfants à d’autres pilotes. Le pilote ne doit jamais passer la structure NET_BUFFER_LIST parente à un autre pilote.
Un pilote doit uniquement mettre à jour le nombre d’enfants dans la structure NET_BUFFER_LIST parente. Étant donné que la structure parente n’est jamais passée à un autre pilote, il n’existe aucun risque que la valeur du nombre d’enfants soit remplacée. Le pilote doit définir le pointeur parent dans les structures enfants pour qu’il pointe vers la structure parente.
Lorsqu’un pilote reçoit un NET_BUFFER_LIST d’un autre pilote, il ne doit pas remplacer le pointeur parent. Si la structure NET_BUFFER_LIST reçue est un enfant, son pointeur parent doit déjà être défini. Le pilote peut utiliser les NET_BUFFER_LIST reçues d’un autre pilote comme structure parente.
NDIS n’applique pas les règles précédentes. Le propriétaire actuel d’une structure NET_BUFFER_LIST doit gérer le nombre d’enfants et le pointeur parent. Par exemple, si le propriétaire actuel clone et fragmente une structure NET_BUFFER_LIST, il doit gérer le pointeur parent et le compteur enfant.
NDIS définit le nombre d’enfants sur zéro et le pointeur parent sur NULL lorsqu’il alloue une structure NET_BUFFER_LIST. NDIS ne modifie pas ces champs chaque fois qu’un pilote transmet une structure NET_BUFFER_LIST à un autre pilote.