Operações de retirada
As operações de retirada podem aumentar o tamanho do espaço de dados usado em uma estrutura NET_BUFFER ou em todas as estruturas NET_BUFFER em uma estrutura NET_BUFFER_LIST .
O NDIS fornece as seguintes funções de retirada:
NdisRetreatNetBufferListDataStart
Às vezes, as operações de retirada podem alocar MDLs associadas a uma estrutura NET_BUFFER. Para fornecer o mecanismo para alocar MDLs, um driver pode fornecer um ponto de entrada opcional para uma função NetAllocateMdl . Se o ponto de entrada for NULL, o NDIS usará um método padrão para alocar MDLs. Os MDLs devem ser liberados dentro de uma função NetFreeMdl que fornece a recíproca do mecanismo que foi usado para alocar o MDL.
Para obter o novo DataLength, o NDIS adiciona o DataOffsetDelta especificado pelo driver ao DataLength atual. Se o tamanho do espaço de dados não utilizado for maior que o DataOffsetDelta, uma operação de retirada reduzirá o DataOffset . Nesse caso, o novo DataOffset é o DataOffset atual menos o DataOffsetDelta .
Se DataOffsetDelta for maior que DataOffset, uma operação de retirada alocará novo espaço de dados. Nesse caso, o NDIS ajusta o DataOffset adequadamente.
Para operações de envio, o NDIS alocará memória se não houver espaço de dados não utilizado suficiente para atender a uma solicitação de retirada. Se nenhuma alocação de memória for necessária, o NDIS simplesmente ajustará o DataOffset e o DataLength . Para melhorar o desempenho, os drivers devem alocar tamanho total de dados suficiente antes de enviar para acomodar as operações de retirada de todos os drivers subjacentes.
Para o caso de retorno de recebimento, o NDIS simplesmente ajusta o DataOffset e o DataLength adequadamente. A operação de retirada inverte a operação de avanço que ocorreu durante o processamento de recebimento. Após a operação de retirada, o espaço de dados usado contém os dados de cabeçalho que os drivers subjacentes usaram durante o processamento de recebimento.