Operações de Retirada
As operações de recuo podem aumentar o tamanho do espaço de dados usado numa estrutura NET_BUFFER ou em todas as estruturas NET_BUFFER numa estrutura NET_BUFFER_LIST .
O NDIS fornece as seguintes funções de retiro:
NdisRetreatNetBufferListDataStart
Às vezes, as operações de recuo 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 a função NetAllocateMdl . Se o ponto de entrada for NULL, o NDIS usará um método padrão para alocar MDLs. MDLs devem ser libertados dentro de uma função NetFreeMdl que fornece a contraparte do mecanismo que foi usado para alocar os MDLs.
Para obter o novo DataLength, o NDIS adiciona o especificado pelo driver DataOffsetDelta ao DataLength atual . Se o tamanho do de espaço de dados não utilizado for maior do que o DataOffsetDelta, uma operação de recuo reduzirá o DataOffset . Nesse caso, o novo DataOffset é o DataOffset atual menos o DataOffsetDelta .
Se o DataOffsetDelta for maior que DataOffset, uma operação de recuo alocará novo espaço de dados. Nesse caso, o NDIS ajusta o DataOffset de forma correspondente.
Para operações de envio, o NDIS aloca memória se não houver espaço de dados não utilizado suficiente para satisfazer uma solicitação de retirada. Se nenhuma alocação de memória for necessária, o NDIS simplesmente ajustará o DataOffset e DataLength . Para um melhor desempenho, os drivers devem alocar um tamanho total de dados suficiente antes de os enviar, de modo a acomodar as operações de reposicionamento de todos os drivers subjacentes.
Para o caso de retorno de receção, o NDIS simplesmente ajusta os valores de DataOffset e DataLength de acordo. A operação de retirada reverte a operação de adiantamento 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.