Фрагментированные NET_BUFFER_LIST структуры
Драйвер NDIS может создать фрагментированную NET_BUFFER_LIST структуру из существующей структуры NET_BUFFER_LIST. Фрагментированная структура ссылается на набор NET_BUFFER структур, ссылающихся на исходные данные; однако данные делятся на единицы, размер которые не превышают максимальный. Драйверы могут использовать структуру этого типа для эффективного разбиения больших буферов на более мелкие.
На следующем рисунке показана связь между родительской NET_BUFFER_LIST структурой и фрагментарным дочерним элементом.
Предыдущий рисунок содержит родительскую NET_BUFFER_LIST структуру и дочернюю структуру, производную от этого родительского элемента. Родительская структура имеет одну NET_BUFFER_LIST_CONTEXT структуру и одну NET_BUFFER структуру с присоединенными многомерными списками. Родительский указатель родительской структуры имеет значение NULL , что указывает на то, что она не является производной структурой.
Дочерняя структура NET_BUFFER_LIST имеет три NET_BUFFER структуры с присоединенными списками MDL. Дочерняя структура NET_BUFFER_LIST имеет указатель на родительскую структуру. Значение NULL, в котором будет указан указатель структуры NET_BUFFER_LIST_CONTEXT, указывает, что дочерний элемент не имеет NET_BUFFER_LIST_CONTEXT структуры.
Драйверы NDIS вызывают функцию NdisAllocateFragmentNetBufferList , чтобы создать новую фрагментированную NET_BUFFER_LIST структуру, основанную на данных в существующей структуре NET_BUFFER_LIST. NDIS выделяет новые NET_BUFFER структуры и многомерные библиотеки для фрагментированных NET_BUFFER_LIST структур. NDIS не выделяет NET_BUFFER_LIST_CONTEXT структуру для фрагментаной структуры. Фрагмент NET_BUFFER структур и многомерных выражений описывает те же данные, что и родительская структура. Данные не копируются.
NdisAllocateFragmentNetBufferList создает фрагменты, начиная с начала используемого пространства данных в каждой родительской структуре NET_BUFFER и смещением на значение, указанное в параметре StartOffset .
NdisAllocateFragmentNetBufferList разделяет используемое пространство данных в каждой исходной NET_BUFFER структуре на фрагменты. Длина используемого пространства данных каждого фрагмента меньше или равна значению, указанному в параметре MaximumLength . Используемое пространство данных последнего фрагмента может быть меньше, чем MaximumLength. Смещение данных новых структур NET_BUFFER отступает на количество байтов, указанное в параметре DataOffsetDelta .
Если в родительскойструктуре NET_BUFFER_LIST имеется несколько NET_BUFFER структур (не показанных на рисунке), процесс фрагментирования для каждой NET_BUFFER структуры будет таким же, как и для одной структуры. Например, если последний фрагмент данных в какой-либо родительской NET_BUFFER структуре меньше максимального размера, NDIS не объединяет эти данные с данными в начале следующей NET_BUFFER структуры.
Драйверы NDIS вызывают функцию NdisFreeFragmentNetBufferList , чтобы освободить структуру NET_BUFFER_LIST и все связанные структуры NET_BUFFER и цепочки MDL, которые ранее были выделены путем вызова NdisAllocateFragmentNetBufferList.