Поделиться через


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

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

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

NdisRetreatNetBufferDataStart

NdisRetreatNetBufferListDataStart

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

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

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

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

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