Partager via


Opérations avancées

Les opérations avancées diminuent la taille de l’espace de données utilisé dans une structure NET_BUFFER ou dans toutes les structures NET_BUFFER d’une structure NET_BUFFER_LIST .

Les pilotes utilisent les fonctions avancées suivantes :

NdisAdvanceNetBufferDataStart

NdisAdvanceNetBufferListDataStart

Les opérations avancées peuvent parfois libérer des DLL associées à une structure NET_BUFFER. Pour fournir le mécanisme permettant de libérer des DLL, un pilote peut fournir un point d’entrée facultatif pour les fonctions NetFreeMdl . Si le point d’entrée est NULL, NDIS utilise une méthode par défaut pour allouer des DLL. Les MDL doivent uniquement être libérées dans un NetFreeMdl à l’aide de cette réciproque du mécanisme utilisé pour allouer la MDL dans la fonction NetAllocateMdl .

Pour obtenir le nouveau DataLength, NDIS soustrait le DataOffsetDelta spécifié par le pilote de l’élément DataLength actuel. Si une opération de retrait précédente a alloué un nouvel espace de données, l’opération avancée peut libérer la mémoire précédemment allouée. Si une opération avancée ne libère pas de mémoire, NDIS ajoute simplement dataOffsetDelta au DataOffset actuel pour obtenir le nouveau DataOffset . Si l’opération avancée a libéré de la mémoire, NDIS ajuste le DataOffset en conséquence.

Pour le cas d’envoi complet, les opérations avancées peuvent libérer de la mémoire allouée lors des opérations de retrait précédentes. Pour de meilleures performances, les pilotes doivent allouer suffisamment de taille totale des données avant l’envoi pour prendre en charge les opérations de retrait de tous les pilotes sous-jacents.

Pour le cas d’indication de réception, les opérations avancées ajustent simplement dataOffset et DataLength en conséquence. Après l’opération avancée, les en-têtes des couches inférieures restent dans l’espace de données inutilisé.