Предварительные операции

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

Драйверы используют следующие расширенные функции:

NdisAdvanceNetBufferDataStart

NdisAdvanceNetBufferListDataStart

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

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

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

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