Estruturas de NET_BUFFER_LIST fragmentadas
Um driver NDIS pode criar uma estrutura de NET_BUFFER_LIST fragmentada de uma estrutura de NET_BUFFER_LIST existente. A estrutura fragmentada faz referência a um conjunto de estruturas NET_BUFFER que fazem referência aos dados originais; no entanto, os dados são divididos em unidades que não excedem um tamanho máximo. Os drivers podem usar esse tipo de estrutura para dividir com eficiência buffers grandes em buffers menores.
A figura a seguir mostra a relação entre uma estrutura de NET_BUFFER_LIST pai e um filho fragmentado.
A figura anterior contém uma estrutura de NET_BUFFER_LIST pai e uma estrutura filho derivada desse pai. A estrutura pai tem uma estrutura NET_BUFFER_LIST_CONTEXT e uma estrutura NET_BUFFER com MDLs anexados. O ponteiro pai da estrutura pai é NULL , indicando que não é uma estrutura derivada.
A estrutura NET_BUFFER_LIST filho tem três estruturas NET_BUFFER com MDLs anexados. A estrutura NET_BUFFER_LIST filho tem um ponteiro para a estrutura pai. O NULL em que um ponteiro de estrutura NET_BUFFER_LIST_CONTEXT seria indica que o filho não tem NET_BUFFER_LIST_CONTEXT estrutura.
Os drivers NDIS chamam a função NdisAllocateFragmentNetBufferList para criar uma estrutura de NET_BUFFER_LIST fragmentada baseada nos dados em uma estrutura de NET_BUFFER_LIST existente. O NDIS aloca novas estruturas de NET_BUFFER e MDLs para a estrutura de NET_BUFFER_LIST fragmentada. O NDIS não aloca uma estrutura NET_BUFFER_LIST_CONTEXT para a estrutura fragmentada. O fragmento NET_BUFFER estruturas e MDLs descrevem os mesmos dados que a estrutura pai. Os dados não são copiados.
NdisAllocateFragmentNetBufferList cria os fragmentos, começando desde o início do espaço de dados usado em cada estrutura de NET_BUFFER pai e deslocado pelo valor especificado no parâmetro StartOffset .
NdisAllocateFragmentNetBufferList divide o espaço de dados usado em cada estrutura de NET_BUFFER de origem em fragmentos. O comprimento do espaço de dados usado de cada fragmento é menor ou igual ao valor especificado no parâmetro MaximumLength . O espaço de dados usado do último fragmento pode ser menor que MaximumLength . O deslocamento de dados das novas estruturas de NET_BUFFER é recuado pelo número de bytes especificados no parâmetro DataOffsetDelta .
Se houver várias estruturas NET_BUFFER na estrutura de NET_BUFFER_LIST pai (não mostrada na ilustração), o processo de fragmentação para cada estrutura NET_BUFFER será o mesmo que para uma única estrutura. Por exemplo, se a última parte dos dados em qualquer estrutura de NET_BUFFER pai for menor que o tamanho máximo, o NDIS não combinará esses dados com os dados no início da próxima estrutura de NET_BUFFER.
Os drivers NDIS chamam a função NdisFreeFragmentNetBufferList para liberar uma estrutura NET_BUFFER_LIST e todas as estruturas de NET_BUFFER associadas e cadeias de MDL que foram alocadas anteriormente chamando NdisAllocateFragmentNetBufferList.