Erweiterte Vorgänge
Erweiterte Vorgänge verringern die Größe des verwendeten Datenbereichs in einer NET_BUFFER-Struktur oder in allen NET_BUFFER-Strukturen in einer NET_BUFFER_LIST-Struktur .
Treiber verwenden die folgenden erweiterten Funktionen:
NdisAdvanceNetBufferListDataStart
Erweiterte Vorgänge können manchmal MDLs freigeben, die einer NET_BUFFER-Struktur zugeordnet sind. Um den Mechanismus zum Freigeben von MDLs bereitzustellen, kann ein Treiber einen optionalen Einstiegspunkt für eine NetFreeMdl-Funktion bereitstellen. Wenn der Einstiegspunkt NULL ist, verwendet NDIS eine Standardmethode, um MDLs zuzuordnen. MDLs dürfen nur innerhalb einer NetFreeMdl mit dem Kehrwert des Mechanismus freigegeben werden, der zum Zuordnen der MDL in der NetAllocateMdl-Funktion verwendet wurde.
Um die neue DataLength zu erhalten, subtrahiert NDIS das vom Treiber angegebene DataOffsetDelta vom aktuellen DataLength . Wenn ein vorheriger Rückzugsvorgang neuen Datenbereich zugewiesen hat, kann der vorab zugewiesene Arbeitsspeicher durch den Vorabvorgang freigegeben werden. Wenn ein erweiterter Vorgang keinen Arbeitsspeicher freigibt, fügt NDIS einfach dataOffsetDelta dem aktuellen DataOffset hinzu, um das neue DataOffset abzurufen. Wenn durch den advance-Vorgang Arbeitsspeicher freigegeben wurde, passt NDIS das DataOffset entsprechend an.
Für den vollständigen Fall "Senden" können vorausgehende Vorgänge Arbeitsspeicher freigeben, der bei vorherigen Rückzugsvorgängen zugeordnet wurde. Um die Leistung zu verbessern, sollten Treiber vor dem Senden genügend Gesamtdatengröße zuordnen, um die Rückzugsvorgänge aller zugrunde liegenden Treiber zu berücksichtigen.
Für den Empfangsindikationsfall passen Vorwärtsvorgänge einfach dataOffset und DataLength entsprechend an. Nach dem Vorabvorgang verbleiben die Header der unteren Ebenen im ungenutzten Datenbereich.