Relações entre gerações de NET_BUFFER_LIST
Os criadores de drivers devem entender e manter a relação entre as estruturas de NET_BUFFER_LIST pai (original) e as estruturas filhas (derivadas) que resultam de operações de clonagem, fragmentação e remontagem.
O chamador de uma função de clone/fragmentação/reconstrução mantém a relação pai/filho, incluindo o ponteiro do pai na estrutura NET_BUFFER_LIST do filho e uma contagem de filhos. A contagem de crianças garante que o chamador liberte o pai depois de todas as crianças terem sido libertadas. Aplicam-se as seguintes regras:
Depois que um controlador cria estruturas filho a partir de uma estrutura NET_BUFFER_LIST, ele deve manter a posse da estrutura pai e deve passar as estruturas filho para outros controladores. O controlador nunca deve passar a estrutura NET_BUFFER_LIST principal para outro controlador.
Um driver só deve atualizar a contagem de filhos na estrutura de NET_BUFFER_LIST pai. Como a estrutura pai nunca é passada para outro driver, não há risco de que o valor da contagem de filhos possa ser sobrescrito. O driver deve definir o ponteiro pai nas estruturas filhas para que apontem para a estrutura mãe.
Quando um controlador recebe uma NET_BUFFER_LIST de outro controlador, ele não deve substituir o ponteiro pai. Se a estrutura NET_BUFFER_LIST recebida for um filho, seu ponteiro pai já deve estar definido. O driver pode usar a NET_BUFFER_LIST recebida de outro driver como uma estrutura mãe.
O NDIS não aplica as regras anteriores. O proprietário atual de uma estrutura NET_BUFFER_LIST deve gerenciar a contagem de filhos e o ponteiro do pai. Por exemplo, se o proprietário atual tiver de clonar e fragmentar uma estrutura NET_BUFFER_LIST, ele deverá gerenciar o ponteiro pai e o contador filho.
O NDIS define a contagem de filhos como zero e o ponteiro do pai como NULL quando aloca uma estrutura NET_BUFFER_LIST. O NDIS não altera esses campos cada vez que um driver passa uma estrutura NET_BUFFER_LIST para outro driver.