Fragmentierte NET_BUFFER_LIST-Strukturen
Ein NDIS-Treiber kann eine fragmentierte NET_BUFFER_LIST-Struktur aus einer vorhandenen NET_BUFFER_LIST-Struktur erstellen. Die fragmentierte Struktur verweist auf einen Satz von NET_BUFFER Strukturen, die auf die ursprünglichen Daten verweisen. Die Daten werden jedoch in Einheiten unterteilt, die eine maximale Größe nicht überschreiten. Treiber können diese Art von Struktur verwenden, um große Puffer effizient in kleinere Puffer aufzuteilen.
Die folgende Abbildung zeigt die Beziehung zwischen einer übergeordneten NET_BUFFER_LIST-Struktur und einem fragmentierten untergeordneten Element.
Die obige Abbildung enthält eine übergeordnete NET_BUFFER_LIST-Struktur und eine untergeordnete Struktur, die von diesem übergeordneten Element abgeleitet wurde. Die übergeordnete Struktur verfügt über eine NET_BUFFER_LIST_CONTEXT-Struktur und eine NET_BUFFER-Struktur mit angefügten MDLs. Der übergeordnete Zeiger der übergeordneten Struktur ist NULL , was angibt, dass es sich nicht um eine abgeleitete Struktur handelt.
Die untergeordnete NET_BUFFER_LIST-Struktur verfügt über drei NET_BUFFER-Strukturen mit angefügten MDLs. Die untergeordnete NET_BUFFER_LIST-Struktur verfügt über einen Zeiger auf die übergeordnete Struktur. Der NULL-Wert , bei dem ein NET_BUFFER_LIST_CONTEXT-Strukturzeiger sein würde, gibt an, dass das untergeordnete Element über keine NET_BUFFER_LIST_CONTEXT Struktur verfügt.
NDIS-Treiber rufen die NdisAllocateFragmentNetBufferList-Funktion auf, um eine neue fragmentierte NET_BUFFER_LIST-Struktur zu erstellen, die auf den Daten in einer vorhandenen NET_BUFFER_LIST-Struktur basiert. NDIS ordnet neue NET_BUFFER-Strukturen und MDLs für die fragmentierte NET_BUFFER_LIST-Struktur zu. NDIS weist keine NET_BUFFER_LIST_CONTEXT-Struktur für die fragmentierte Struktur zu. Das Fragment NET_BUFFER Strukturen und MDLs beschreibt dieselben Daten wie die übergeordnete Struktur. Die Daten werden nicht kopiert.
NdisAllocateFragmentNetBufferList erstellt die Fragmente , beginnend am Anfang des verwendeten Datenbereichs in jedem übergeordneten NET_BUFFER-Struktur und offset um den im StartOffset-Parameter angegebenen Wert.
NdisAllocateFragmentNetBufferList unterteilt den verwendeten Datenbereich in jeder Quellstruktur NET_BUFFER in Fragmente. Die Länge des verwendeten Datenbereichs jedes Fragments ist kleiner oder gleich dem im MaximumLength-Parameter angegebenen Wert. Der verwendete Datenbereich des letzten Fragments kann kleiner als MaximumLength sein. Der Datenoffset der neuen NET_BUFFER-Strukturen wird um die Anzahl von Bytes zurückgesetzt, die im DataOffsetDelta-Parameter angegeben ist.
Wenn mehrere NET_BUFFER Strukturen in der übergeordneten NET_BUFFER_LIST-Struktur vorhanden sind (nicht in der Abbildung dargestellt), ist der Fragmentierungsprozess für jede NET_BUFFER-Struktur identisch mit einer einzelnen Struktur. Wenn beispielsweise das letzte Datenelement in einer übergeordneten NET_BUFFER-Struktur kleiner als die maximale Größe ist, kombiniert NDIS diese Daten nicht mit den Daten am Anfang der nächsten NET_BUFFER-Struktur.
NDIS-Treiber rufen die NdisFreeFragmentNetBufferList-Funktion auf, um eine NET_BUFFER_LIST-Struktur und alle zugeordneten NET_BUFFER-Strukturen und MDL-Ketten frei zu geben, die zuvor durch Aufrufen von NdisAllocateFragmentNetBufferList zugeordnet wurden.