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


Повторно сборка NET_BUFFER_LIST структур

Драйвер NDIS может создать повторно сборку NET_BUFFER_LIST структуры из существующей структуры NET_BUFFER_LIST. Повторно собираемая структура ссылается на исходные данные из нескольких исходных NET_BUFFER структур. Драйверы могут использовать структуру этого типа для эффективного объединения множества небольших буферов в один большой буфер.

На следующем рисунке показана связь между родительской NET_BUFFER_LIST структурой и повторной сборкой дочерней структуры:

Схема, иллюстрирующая связь между родительской NET_BUFFER_LIST структурой и повторной дочерней структурой.

Предыдущий рисунок содержит родительскую NET_BUFFER_LIST структуру и дочернюю структуру, производную от этого родительского элемента. Родительская структура имеет одну NET_BUFFER_LIST_CONTEXT структуру и три NET_BUFFER структуры с присоединенными многомерными списками. Родительский указатель родительской структуры имеет значение NULL , что указывает на то, что она не является производной структурой.

Дочерняя структура NET_BUFFER_LIST имеет одну NET_BUFFER структуру с присоединенными многомерными списками. Дочерняя структура NET_BUFFER_LIST имеет указатель на родительскую структуру. Значение NULL, в котором будет указан указатель структуры NET_BUFFER_LIST_CONTEXT, указывает, что дочерний элемент не имеет NET_BUFFER_LIST_CONTEXT структуры.

Драйверы NDIS вызывают функцию NdisAllocateReassembledNetBufferList , чтобы повторно собрать фрагментированную NET_BUFFER_LIST структуру. NDIS выделяет новую структуру NET_BUFFER и многомерные списки с повторной сборкой NET_BUFFER_LIST. NDIS не выделяет структуру NET_BUFFER_LIST_CONTEXT для повторной сборки. Повторно сборка NET_BUFFER структуры и многомерных выражений описывают те же данные, что и родительская структура. Данные не копируются.

Чтобы создать повторно сборку NET_BUFFER_LIST структуры, NdisAllocateReassembledNetBufferList пропускает количество байтов, указанное в параметре StartOffset в каждой из родительских структур NET_BUFFER. NdisAllocateReassembledNetBufferList объединяет оставшиеся данные в каждой родительской NET_BUFFER структуре в цепочку MDL одной повторной сборки NET_BUFFER структуры. NdisAllocateReassembledNetBufferList отступает (увеличивает используемое пространство данных в) повторно сборки NET_BUFFER структуры на сумму, указанную в DataOffsetDelta .

Драйверы NDIS вызывают функцию NdisFreeReassembledNetBufferList для освобождения повторной сборки NET_BUFFER_LIST структуры и связанной NET_BUFFER структуры и цепочки MDL.

Производные структуры NET_BUFFER_LIST