Condividi tramite


Relazioni tra generazioni NET_BUFFER_LIST

I writer di driver devono comprendere e mantenere la relazione tra le strutture padre (originale) e le strutture figlio (derivate NET_BUFFER_LIST ) che derivano da operazioni clone, frammento e riassemble.

Il chiamante di una funzione clone/fragment/reassemble mantiene la relazione padre/figlio, incluso il puntatore padre nella struttura di NET_BUFFER_LIST figlio e un conteggio figlio. Il conteggio figlio garantisce che il chiamante libera il padre dopo che tutti i figli sono stati liberati. Sono applicabili le regole seguenti:

  • Dopo che un driver crea strutture figlio da una struttura NET_BUFFER_LIST , deve mantenere la proprietà della struttura padre e deve passare le strutture figlio ad altri driver. Il driver non deve mai passare la struttura padre NET_BUFFER_LIST a un altro driver.

  • Un driver deve aggiornare solo il conteggio figlio nella struttura di NET_BUFFER_LIST padre. Poiché la struttura padre non viene mai passata a un altro driver, non esiste alcun rischio che il valore del conteggio figlio possa essere sovrascritto. Il driver deve impostare il puntatore padre nelle strutture figlio per puntare alla struttura padre.

  • Quando un driver riceve un NET_BUFFER_LIST da un altro driver, il driver non deve sovrascrivere il puntatore padre. Se la struttura NET_BUFFER_LIST ricevuta è un elemento figlio, il puntatore padre deve essere già impostato. Il driver può usare la NET_BUFFER_LIST ricevuta da un altro driver come struttura padre.

  • NDIS non applica le regole precedenti. Il proprietario corrente di una struttura NET_BUFFER_LIST deve gestire il conteggio figlio e il puntatore padre. Ad esempio, se il proprietario corrente clonerà e frammenterà una struttura NET_BUFFER_LIST, deve gestire il puntatore padre e il contatore figlio.

  • NDIS imposta il conteggio figlio su zero e il puntatore padre su NULL quando alloca una struttura NET_BUFFER_LIST. NDIS non modifica questi campi ogni volta che un driver passa una struttura NET_BUFFER_LIST a un altro driver.

Strutture NET_BUFFER_LIST derivate