Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
Um driver NDIS pode criar uma estrutura NET_BUFFER_LIST fragmentada a partir de uma estrutura 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 eficientemente buffers grandes em buffers menores.
A figura a seguir mostra a relação entre uma estrutura NET_BUFFER_LIST pai e um filho fragmentado.
A figura anterior contém uma estrutura de NET_BUFFER_LIST pai e uma estrutura filho que foi derivada desse pai. A estrutura pai tem uma estrutura NET_BUFFER_LIST_CONTEXT e uma estrutura NET_BUFFER com MDLs anexadas. O ponteiro da estrutura principal é NULL indicando que não é uma estrutura derivada.
A estrutura NET_BUFFER_LIST filha tem três estruturas NET_BUFFER com MDLs acopladas. A estrutura NET_BUFFER_LIST filho tem um ponteiro para a estrutura pai. O NULL, onde estaria um ponteiro para a estrutura NET_BUFFER_LIST_CONTEXT, indica que o filho não tem uma estrutura NET_BUFFER_LIST_CONTEXT.
Os drivers NDIS chamam a função NdisAllocateFragmentNetBufferList para criar uma nova estrutura fragmentada NET_BUFFER_LIST baseada nos dados de uma estrutura NET_BUFFER_LIST existente. O NDIS aloca novas estruturas NET_BUFFER e MDLs para a estrutura NET_BUFFER_LIST fragmentada. O NDIS não aloca uma estrutura NET_BUFFER_LIST_CONTEXT para a estrutura fragmentada. Os fragmentos das estruturas NET_BUFFER e MDLs descrevem os mesmos dados que a estrutura mãe. Os dados não são copiados.
NdisAllocateFragmentNetBufferList cria os fragmentos, começando pelo início do espaço de dados usado em cada estrutura 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 utilizado do último fragmento pode ser menor que MaximumLength . O deslocamento de dados das novas estruturas NET_BUFFER é reduzido pelo número de bytes especificado no parâmetro DataOffsetDelta.
Se existirem várias estruturas NET_BUFFER na estrutura pai NET_BUFFER_LIST (não mostrada na ilustração), o processo de fragmentação para cada estrutura NET_BUFFER é idêntico ao de uma única estrutura. Por exemplo, se o último segmento de dados em qualquer estrutura NET_BUFFER pai for menor do que o tamanho máximo, o NDIS não combinará esses dados com os dados no início da próxima estrutura NET_BUFFER.
Os drivers NDIS chamam a função NdisFreeFragmentNetBufferList para liberar uma estrutura NET_BUFFER_LIST e todas as estruturas NET_BUFFER associadas e cadeias MDL que foram alocadas anteriormente chamando NdisAllocateFragmentNetBufferList.