Операции отступления

Операции отступа могут увеличить размер используемого пространства данных в структуре NET_BUFFER или во всех структурах NET_BUFFER внутри структуры NET_BUFFER_LIST.

NDIS предоставляет следующие функции отступления:

NdisRetreatNetBufferDataStart

NdisRetreatNetBufferListDataStart

Операции отступления иногда могут выделять MDL, связанные со структурой NET_BUFFER. Чтобы предоставить механизм выделения многомерных выражений, драйвер может предоставить необязательную точку входа для функции NetAllocateMdl. Если точка входа NULL, NDIS использует метод по умолчанию для выделения MDL. MDL должны быть освобождены в функции NetFreeMdl, которая предоставляет обратный процесс механизма, использованного для их выделения.

Чтобы получить новый DataLength, NDIS добавляет указанный драйвером DataOffsetDelta к текущему DataLength. Если размер неиспользуемого пространства данных превышает DataOffsetDelta, операция отступа уменьшает DataOffset. В этом случае новый DataOffset равен текущему DataOffset минус DataOffsetDelta.

Если DataOffsetDelta больше DataOffset, операция отступа выделяет новое пространство данных. В этом случае NDIS корректирует DataOffset соответствующим образом.

Для операций отправки NDIS выделяет память, если недостаточно неиспользуемого пространства данных для удовлетворения запроса на отступление. Если выделение памяти не требуется, NDIS просто настраивает DataOffset и DataLength. Для повышения производительности драйверы должны выделить достаточный общий объём данных перед отправкой, чтобы обеспечить выполнение операций отката всеми базовыми драйверами.

В случае возврата NDIS соответственно изменяет DataOffset и DataLength. Операция отступления отменяет операцию продвижения, выполненную во время процесса обработки получения. После операции отступления использованное пространство данных содержит данные заголовка, используемые базовыми драйверами во время обработки получения.