Structures de NET_BUFFER_LIST fragmentées
Un pilote NDIS peut créer une structure de NET_BUFFER_LIST fragmentée à partir d’une structure de NET_BUFFER_LIST existante. La structure fragmentée fait référence à un ensemble de structures NET_BUFFER qui référencent les données d’origine ; toutefois, les données sont divisées en unités qui ne dépassent pas une taille maximale. Les pilotes peuvent utiliser ce type de structure pour décomposer efficacement les mémoires tampons volumineuses en mémoires tampons plus petites.
La figure suivante montre la relation entre une structure de NET_BUFFER_LIST parent et un enfant fragmenté.
La figure précédente contient une structure parente NET_BUFFER_LIST et une structure enfant dérivée de ce parent. La structure parente a une structure NET_BUFFER_LIST_CONTEXT et une structure NET_BUFFER avec des dll MDL attachées. Le pointeur parent de la structure parente a la valeur NULL , ce qui indique qu’il ne s’agit pas d’une structure dérivée.
La structure NET_BUFFER_LIST enfant a trois structures NET_BUFFER avec des DLL attachées. La structure NET_BUFFER_LIST enfant a un pointeur vers la structure parente. La valeur NULL dans laquelle un pointeur de structure NET_BUFFER_LIST_CONTEXT serait indique que l’enfant n’a pas de structure NET_BUFFER_LIST_CONTEXT.
Les pilotes NDIS appellent la fonction NdisAllocateFragmentNetBufferList pour créer une structure de NET_BUFFER_LIST fragmentée basée sur les données d’une structure de NET_BUFFER_LIST existante. NDIS alloue de nouvelles structures NET_BUFFER et mdL pour la structure NET_BUFFER_LIST fragmentée. NDIS n’alloue pas de structure NET_BUFFER_LIST_CONTEXT pour la structure fragmentée. Le fragment NET_BUFFER structures et mdL décrivent les mêmes données que la structure parente. Les données ne sont pas copiées.
NdisAllocateFragmentNetBufferList crée les fragments, à partir du début de l’espace de données utilisé dans chaque structure NET_BUFFER parente et décalé par la valeur spécifiée dans le paramètre StartOffset .
NdisAllocateFragmentNetBufferList divise l’espace de données utilisé dans chaque structure NET_BUFFER source en fragments. La longueur de l’espace de données utilisé de chaque fragment est inférieure ou égale à la valeur spécifiée dans le paramètre MaximumLength . L’espace de données utilisé du dernier fragment peut être inférieur à MaximumLength . Le décalage de données des nouvelles structures NET_BUFFER est retiré par le nombre d’octets spécifié dans le paramètre DataOffsetDelta .
S’il existe plusieurs structures NET_BUFFER dans la structure parente NET_BUFFER_LIST (non illustrée dans l’illustration), le processus de fragmentation de chaque structure NET_BUFFER est le même que pour une structure unique. Par exemple, si le dernier élément de données d’une structure NET_BUFFER parente est inférieur à la taille maximale, NDIS ne combine pas ces données avec les données au début de la structure NET_BUFFER suivante.
Les pilotes NDIS appellent la fonction NdisFreeFragmentNetBufferList pour libérer une structure NET_BUFFER_LIST et toutes les structures NET_BUFFER associées et chaînes MDL précédemment allouées en appelant NdisAllocateFragmentNetBufferList.