Operazioni avanzate
Le operazioni avanzate riducono le dimensioni dello spazio dati usato in una struttura NET_BUFFER o in tutte le strutture NET_BUFFER in una struttura NET_BUFFER_LIST .
I driver usano le funzioni di avanzamento seguenti:
NdisAdvanceNetBufferListDataStart
Le operazioni avanzate possono talvolta liberare mdl associati a una struttura di NET_BUFFER. Per fornire il meccanismo per liberare mdls, un driver può fornire un punto di ingresso facoltativo per le funzioni NetFreeMdl . Se il punto di ingresso è NULL, NDIS usa un metodo predefinito per allocare mdls. Gli mdls devono essere liberati solo all'interno di netFreeMdl usando tale reciproco del meccanismo usato per allocare il file MDL nella funzione NetAllocateMdl .
Per ottenere il nuovo Oggetto DataLength, NDIS sottrae il driver Specificato dal driver DataOffsetDelta dall'oggetto DataLength corrente. Se un'operazione di ritiro precedente ha allocato nuovo spazio dati, l'operazione avanzata può liberare tale memoria allocata in precedenza. Se un'operazione avanzata non libera memoria, NDIS aggiunge semplicemente DataOffsetDelta all'oggetto DataOffset corrente per ottenere il nuovo Oggetto DataOffset . Se l'operazione avanzata ha liberato memoria, NDIS regola di conseguenza l'oggetto DataOffset .
Per il caso di completamento dell'invio, le operazioni avanzate possono liberare memoria allocata nelle operazioni di ritiro precedenti. Per prestazioni migliori, i driver devono allocare sufficienti dimensioni totali dei dati prima dell'invio per supportare le operazioni di ritiro di tutti i driver sottostanti.
Per il caso di indicazione di ricezione, le operazioni di avanzamento regolano semplicemente dataOffset e DataLength di conseguenza. Dopo l'operazione di avanzamento, le intestazioni dei livelli inferiori rimangono nello spazio dati inutilizzato.