Beziehungen zwischen NET_BUFFER_LIST Generationen
Treiberautoren sollten die Beziehung zwischen den übergeordneten (ursprünglichen) NET_BUFFER_LIST-Strukturen und den untergeordneten (abgeleiteten) Strukturen verstehen und beibehalten, die sich aus Klon-, Fragment- und Neuassemvorgängen ergeben.
Der Aufrufer einer Klon-/Fragment-/Reassemble-Funktion behält die beziehung zwischen übergeordnetem und untergeordnetem Element bei, einschließlich des übergeordneten Zeigers in der untergeordneten NET_BUFFER_LIST-Struktur und einer untergeordneten Anzahl. Die Untergeordnete Anzahl stellt sicher, dass der Anrufer das übergeordnete Element freigibt, nachdem alle untergeordneten Elemente freigegeben wurden. Es gelten die folgenden Regeln:
Nachdem ein Treiber untergeordnete Strukturen aus einer NET_BUFFER_LIST-Struktur erstellt hat, sollte er den Besitz der übergeordneten Struktur behalten und die untergeordneten Strukturen an andere Treiber übergeben. Der Treiber sollte niemals die übergeordnete NET_BUFFER_LIST-Struktur an einen anderen Treiber übergeben.
Ein Treiber sollte nur die untergeordnete Anzahl in der übergeordneten NET_BUFFER_LIST-Struktur aktualisieren. Da die übergeordnete Struktur nie an einen anderen Treiber übergeben wird, besteht kein Risiko, dass der Wert der untergeordneten Anzahl überschrieben wird. Der Treiber sollte den übergeordneten Zeiger in den untergeordneten Strukturen so festlegen, dass er auf die übergeordnete Struktur verweist.
Wenn ein Treiber eine NET_BUFFER_LIST von einem anderen Treiber empfängt, darf der Treiber den übergeordneten Zeiger nicht überschreiben. Wenn die empfangene NET_BUFFER_LIST Struktur ein untergeordnetes Element ist, sollte der übergeordnete Zeiger bereits festgelegt werden. Der Treiber kann die von einem anderen Treiber empfangene NET_BUFFER_LIST als übergeordnete Struktur verwenden.
NDIS erzwingt nicht die vorherigen Regeln. Der aktuelle Besitzer einer NET_BUFFER_LIST-Struktur muss die untergeordnete Anzahl und den übergeordneten Zeiger verwalten. Wenn der aktuelle Besitzer beispielsweise eine NET_BUFFER_LIST-Struktur klonen und fragmentiert, muss er den übergeordneten Zeiger und den untergeordneten Zähler verwalten.
NDIS legt die untergeordnete Anzahl auf 0 und den übergeordneten Zeiger auf NULL fest, wenn eine NET_BUFFER_LIST-Struktur zugeordnet wird. NDIS ändert diese Felder nicht jedes Mal, wenn ein Treiber eine NET_BUFFER_LIST-Struktur an einen anderen Treiber übergibt.