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


Функция NdisAllocateNetBuffer (ndis/nblapi.h)

Вызовите функцию NdisAllocateNetBuffer , чтобы выделить и инициализировать структуру NET_BUFFER из пула NET_BUFFER структур.

Синтаксис

NDIS_EXPORTED_ROUTINE NET_BUFFER * NdisAllocateNetBuffer(
  [in]           NDIS_HANDLE PoolHandle,
  [in, optional] MDL         *MdlChain,
  [in]           ULONG       DataOffset,
  [in]           SIZE_T      DataLength
);

Параметры

[in] PoolHandle

Дескриптор пула NET_BUFFER структуры, который ранее был возвращен при вызове NdisAllocateNetBufferPool.

[in, optional] MdlChain

Указатель на цепочку MDL, которую NDIS использует для инициализации новой структуры NET_BUFFER . MdlChain может иметь значение NULL.

[in] DataOffset

Начальное смещение (в байтах) от начала буфера до начала используемого пространства данных в цепочке MDL. Пространство данных перед этим смещением — это неиспользуемое пространство данных. Таким образом, это значение также представляет начальный объем доступного пространства обратного заполнения в цепочке MDL. Если MdlChain имеет значение NULL, dataOffset должен иметь значение 0.

[in] DataLength

Длина используемого пространства данных в байтах в цепочке MDL. Если MdlChain имеет значение NULL, DataLength должно иметь значение 0.

Возвращаемое значение

NdisAllocateNetBuffer возвращает указатель на структуру NET_BUFFER , выделенную NDIS. Если выделение не удалось, этот указатель имеет значение NULL.

Комментарии

Вызовите NdisFreeNetBuffer , чтобы освободить NET_BUFFER структуру, выделенную из пула NET_BUFFER структуры.

Обратите вниманиеNET_BUFFER и NET_BUFFER_LIST структуры должны быть выделены из буферного пула NDIS. Драйвер не должен выделять и инициализировать структуру NET_BUFFER или NET_BUFFER_LIST из частного пула памяти или стека.
 
Предварительно выделяемый NET_BUFFER можно использовать повторно, повторно инициализировав его с другой цепочкой MDL, когда она владеет NET_BUFFER, но поля DataOffset, DataLength, CurrentMdl и CurrentMdlOffset в NET_BUFFER должны быть согласованы с новой цепочкой MDL.

Например, если исходная цепочка MDL содержит XDataLength и YDataOffset, а CurrentMdl начинается со второго MDL (M) в исходной цепочке MDL, CurrentMdlOffset имеет значение Z. Поле MdlChain в NET_BUFFER_DATA затем должно указать на новую цепочку MDL, содержащую X'DataLength и Y'DataOffset. Если CurrentMdl начинается с третьего MDL (M') в новой цепочке MDL, CurrentMdlOffset имеет значение Z', и для задания полей в NET_BUFFER необходимо использовать следующие макросы:

NET_BUFFER_FIRST_MDL(_NB) = New MDL chain;
NET_BUFFER_DATA_LENGTH(_NB) = X';
NET_BUFFER_DATA_OFFSET(_NB) = Y';
NET_BUFFER_CURRENT_MDL(_NB) = M';
NET_BUFFER_CURRENT_MDL_OFFSET(_NB) = Z';

Требования

Требование Значение
Минимальная версия клиента Поддерживается в NDIS 6.0 и более поздних версиях.
Целевая платформа Универсальное
Верхняя часть ndis/nblapi.h (включая ndis.h)
Библиотека Ndis.lib
IRQL <= DISPATCH_LEVEL
Правила соответствия DDI Irql_NetBuffer_Function(ndis), NdisAllocateNetBuffer(ndis)

См. также раздел

NET_BUFFER

NET_BUFFER_LIST

NdisAllocateNetBufferPool

NdisFreeNetBuffer