Предварительные операции
Предварительные операции уменьшают размер используемого пространства данных в NET_BUFFER структуре или во всех NET_BUFFER структурах в NET_BUFFER_LIST структуре.
Драйверы используют следующие расширенные функции:
NdisAdvanceNetBufferListDataStart
Операции с заранее выполняемыми операциями иногда могут освобождать многомерные списки, связанные со структурой NET_BUFFER. Чтобы предоставить механизм освобождения многомерных выражений, драйвер может предоставить необязательную точку входа для функций NetFreeMdl . Если точка входа имеет значение NULL, NDIS использует метод по умолчанию для выделения многомерных выражений. Многомерные библиотеки должны быть освобождены только в NetFreeMdl с использованием обратной связи механизма, который использовался для выделения MDL в функции NetAllocateMdl .
Чтобы получить новый DataLength, NDIS вычитает указанный драйвером DataOffsetDelta из текущего DataLength . Если предыдущая операция отката выделила новое пространство данных, то предварительная операция может освободить такую ранее выделенную память. Если предварительная операция не освобождает память, NDIS просто добавляет DataOffsetDelta в текущий dataOffset , чтобы получить новый dataOffset . Если предварительная операция освободила память, NDIS соответствующим образом корректирует DataOffset .
Для отправки полного варианта предварительные операции могут освободить память, которая была выделена в предыдущих операциях отката. Для повышения производительности драйверы должны выделить достаточный общий размер данных перед отправкой для выполнения операций отступления всех базовых драйверов.
В случае с указанием получения предварительные операции просто корректируют DataOffset и DataLength соответствующим образом. После операции предварительного выполнения заголовки нижних слоев остаются в неиспользуемом пространстве данных.