Condividi tramite


Relazioni tra generazioni NET_BUFFER_LIST

Gli sviluppatori di driver devono comprendere e mantenere la relazione tra le strutture padre (originali) NET_BUFFER_LIST e le strutture figlio (derivate) risultanti da operazioni di clonazione, frammentazione e riassemblaggio.

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

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

  • Un driver dovrebbe aggiornare solo il contatore dei figli nella struttura padre NET_BUFFER_LIST. 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 dovrebbe configurare il puntatore padre nelle strutture figlio affinché punti alla struttura genitore.

  • 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 il NET_BUFFER_LIST ricevuto 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 dovesse clonare e frammentare una struttura NET_BUFFER_LIST, dovrebbe 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