структура NET_BUFFER_LIST (ndis/nbl.h)

Структура NET_BUFFER_LIST задает связанный список NET_BUFFER структур.

Синтаксис

typedef struct _NET_BUFFER_LIST {
  union {
    struct {
      NET_BUFFER_LIST *Next;
      NET_BUFFER      *FirstNetBuffer;
    };
    SLIST_HEADER           Link;
    NET_BUFFER_LIST_HEADER NetBufferListHeader;
  };
  NET_BUFFER_LIST_CONTEXT *Context;
  NET_BUFFER_LIST         *ParentNetBufferList;
  NDIS_HANDLE             NdisPoolHandle;
  PVOID                   NdisReserved[2];
  PVOID                   ProtocolReserved[4];
  PVOID                   MiniportReserved[2];
  PVOID                   Scratch;
  NDIS_HANDLE             SourceHandle;
  ULONG                   NblFlags;
  LONG                    ChildRefCount;
  ULONG                   Flags;
  union {
    NDIS_STATUS Status;
    ULONG       NdisReserved2;
  };
  PVOID                   NetBufferListInfo[MaxNetBufferListInfo];
} NET_BUFFER_LIST, *PNET_BUFFER_LIST;

Члены

Next

Следующая NET_BUFFER_LIST структура в цепочке.

Драйверы не должны обращаться к этому элементу напрямую. Вместо этого они должны вызвать макрос NET_BUFFER_LIST_NEXT_NBL .

FirstNetBuffer

Первый NET_BUFFER на этом NET_BUFFER_LIST.

Драйверы не должны обращаться к этому элементу напрямую. Вместо этого они должны вызвать макрос NET_BUFFER_LIST_FIRST_NB .

Link

Зарезервировано для NDIS.

NetBufferListHeader

Структура NET_BUFFER_LIST_HEADER .

Context

Указатель на структуру NET_BUFFER_LIST_CONTEXT . Драйверы протоколов и мини-портов используют эту структуру для хранения сведений о структуре NET_BUFFER_LIST. Сведения, хранящиеся в структуре NET_BUFFER_LIST_CONTEXT, непрозрачны для NDIS и других драйверов в стеке.

Используйте следующие функции и макросы для доступа к данным в структуре NET_BUFFER_LIST_CONTEXT:

NdisAllocateNetBufferListContext NdisFreeNetBufferListContext NET_BUFFER_LIST_CONTEXT_DATA_START NET_BUFFER_LIST_CONTEXT_DATA_SIZE

ParentNetBufferList

Если эта NET_BUFFER_LIST структура является клоном другой структуры NET_BUFFER_LIST, этот элемент указывает указатель на родительскую NET_BUFFER_LIST структуру. В противном случае этот параметр имеет значение NULL. Драйвер использует Функция NdisAllocateCloneNetBufferList для создания клона.

NdisPoolHandle

Дескриптор пула, определяющий NET_BUFFER_LIST пул, из которого была выделена структура NET_BUFFER_LIST.

NdisReserved[2]

Зарезервировано для использования NDIS.

ProtocolReserved[4]

Зарезервировано для использования драйверами протокола.

MiniportReserved[2]

Зарезервировано для использования драйверами минипорта.

Scratch

Данные, определенные текущим владельцем структуры NET_BUFFER_LIST. Текущий владелец, NDIS или драйвер NDIS, может использовать этот элемент в своих целях. При первоначальном выделении структуры NET_BUFFER_LIST этот элемент имеет значение NULL. После того как текущий владелец откажет права владения, NDIS или другой драйвер может перезаписать этот элемент.

SourceHandle

Дескриптор, предоставленный NDIS драйверу в операции привязки или присоединения с помощью одной из следующих процедур, предоставляемых драйвером:

Драйвер мини-порта

MiniportInitializeEx

Драйвер протокола

ProtocolBindAdapterEx

Драйвер фильтра

FilterAttach

NDIS использует SourceHandle для возврата структуры NET_BUFFER_LIST драйверу, который отправил структуру NET_BUFFER_LIST.

NblFlags

Этот элемент содержит флаги, которые можно объединить с побитовой операцией ИЛИ.

Используйте макросы NdisTestNblFlag, NdisTestNblFlags, NdisSetNblFlag и NdisClearNblFlag для доступа к флагам.

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

NDIS_NBL_FLAGS_SEND_READ_ONLY

Если задано значение , структура NET_BUFFER_LIST и ее данные доступны только для чтения для операций отправки.

NDIS_NBL_FLAGS_RECV_READ_ONLY

Если задано значение , структура NET_BUFFER_LIST и ее данные доступны только для чтения для операций получения.

Драйвер может установить следующие флаги, даже если он не разделяет связанный кадр Ethernet:

NDIS_NBL_FLAGS_IS_IPV4

Все кадры Ethernet в этой NET_BUFFER_LIST структуре являются кадрами IPv4. Если этот флаг установлен, поставщик разделения данных заголовка не должен устанавливать флаг NDIS_NBL_FLAGS_IS_IPV6.

NDIS_NBL_FLAGS_IS_IPV6

Все кадры Ethernet в этой NET_BUFFER_LIST структуре являются кадрами IPv6. Если этот флаг установлен, поставщик разделения заголовков и данных не должен устанавливать флаг NDIS_NBL_FLAGS_IS_IPV4.

NDIS_NBL_FLAGS_IS_TCP

Все кадры Ethernet в этой NET_BUFFER_LIST структуре являются кадрами TCP. Если этот флаг установлен, поставщик разделения данных заголовков не должен устанавливать флаг NDIS_NBL_FLAGS_IS_UDP, а поставщик должен установить флаг NDIS_NBL_FLAGS_IS_IPV4 или флаг NDIS_NBL_FLAGS_IS_IPV6.

NDIS_NBL_FLAGS_IS_UDP

Все кадры Ethernet в этой NET_BUFFER_LIST структуре являются кадрами UDP. Если этот флаг установлен, поставщик разделения заголовков и данных не должен устанавливать флаг NDIS_NBL_FLAGS_IS_TCP, а поставщик должен установить флаг NDIS_NBL_FLAGS_IS_IPV4 или флаг NDIS_NBL_FLAGS_IS_IPV6.

NDIS_NBL_FLAGS_IS_LOOPBACK_PACKET

Все пакеты, связанные с этой NET_BUFFER_LIST структурой, являются пакетами замыкания на себя.

Если поставщик разделения заголовков и данных не разделяет связанный кадр Ethernet, драйвер мини-порта должен указать структуру NET_BUFFER_LIST с снятыми следующими флагами:

NDIS_NBL_FLAGS_HD_SPLIT

Заголовок и данные разделяются на все кадры Ethernet, связанные с этой NET_BUFFER_LIST структурой.

NDIS_NBL_FLAGS_SPLIT_AT_UPPER_LAYER_PROTOCOL_HEADER

Все кадры Ethernet в этом NET_BUFFER_LIST разделены в начале заголовка протокола верхнего уровня. Если этот флаг установлен, поставщик разделения заголовков и данных должен установить флаг NDIS_NBL_FLAGS_IS_IPV4 или флаг NDIS_NBL_FLAGS_IS_IPV6. Кроме того, поставщик может задать флаг NDIS_NBL_FLAGS_IS_TCP или флаг NDIS_NBL_FLAGS_IS_UDP, но поставщик не должен устанавливать флаг NDIS_NBL_FLAGS_SPLIT_AT_UPPER_LAYER_PROTOCOL_PAYLOAD.

NDIS_NBL_FLAGS_SPLIT_AT_UPPER_LAYER_PROTOCOL_PAYLOAD

Все кадры Ethernet в этой NET_BUFFER_LIST структуре разделяются в начале полезных данных TCP или UDP. Если этот флаг установлен, поставщик разделения заголовков и данных должен установить флаг NDIS_NBL_FLAGS_IS_IPV4 или флаг NDIS_NBL_FLAGS_IS_IPV6. Кроме того, поставщик должен установить флаг NDIS_NBL_FLAGS_IS_TCP или флаг NDIS_NBL_FLAGS_IS_UDP, но поставщик не должен устанавливать флаг NDIS_NBL_FLAGS_SPLIT_AT_UPPER_LAYER_PROTOCOL_HEADER.

ChildRefCount

Если эта NET_BUFFER_LIST структура содержит клоны (является родительским), этот элемент указывает количество незадаченных клонов. В противном случае этот элемент равен нулю.

Flags

Атрибуты структуры NET_BUFFER_LIST. Следующие определения указывают битовую маску для набора флагов:

NBL_FLAGS_PROTOCOL_RESERVED

Этот набор зарезервирован для драйверов протокола.

Примечание Начиная с версии NDIS 6.30, для использования протокола доступны два дополнительных бита: 0x00000003. Протокол NDIS 6.30 может использовать эти биты только в том случае, если NdisGetVersion возвращает значение, большее или равное NDIS_RUNTIME_VERSION_630. Протоколы не должны использовать эти биты в более ранних версиях NDIS, так как до версии 6.30 NDIS использует их внутри организации.
 

NBL_FLAGS_MINIPORT_RESERVED

Этот набор зарезервирован для драйверов минипорта.

NBL_FLAGS_SCRATCH

Текущий владелец структуры NET_BUFFER_LIST( NDIS или драйвер NDIS) может использовать этот набор. Когда текущий владелец откажет права владения, NDIS или другой драйвер может перезаписать эти флаги.

NBL_FLAGS_NDIS_RESERVED

Этот набор зарезервирован для NDIS.

Status

Окончательное состояние завершения операции с сетевыми данными в этой NET_BUFFER_LIST структуре. Драйверы минипорта записывают это значение перед вызовом Функция NdisMSendNetBufferListsComplete . Драйверы miniport указывают одно из следующих значений:

NDIS_STATUS_SUCCESS

Все сетевые данные, описанные NET_BUFFER структурами, связанными с этой NET_BUFFER_LIST структурой, успешно переданы по сети.

NDIS_STATUS_INVALID_LENGTH

Размер данных в некоторых NET_BUFFER структурах, связанных с этой NET_BUFFER_LIST структурой, был слишком велик для базовой сетевой карты.

NDIS_STATUS_RESOURCES

Сбой запроса на отправку для этой структуры NET_BUFFER_LIST из-за нехватки ресурсов.

NDIS_STATUS_FAILURE

Этот запрос на отправку для этой структуры NET_BUFFER_LIST завершился сбоем по какой-либо причине, отличной от указанных в предыдущих трех значениях.

NDIS_STATUS_SEND_ABORTED

NDIS вызвал функцию MiniportCancelSend для отмены операции отправки для этой NET_BUFFER_LIST структуры.

NDIS_STATUS_RESET_IN_PROGRESS

Драйвер мини-порта прервал запрос на отправку из-за сброса.

NDIS_STATUS_PAUSED

Если драйвер должен отклонять запросы на отправку, так как он приостановлен, он устанавливает полное состояние в каждом затронутом NET_BUFFER_LIST NDIS_STATUS_PAUSED.

NdisReserved2

Зарезервировано для NDIS.

NetBufferListInfo[MaxNetBufferListInfo]

Массив значений, содержащий сведения, общие для всех NET_BUFFER структур в списке. Эту информацию часто называют "данными внеполосного диапазона (OOB).

Вы можете использовать кнопку NDIS_NET_BUFFER_LIST_INFO значения перечисления с помощью макроса NET_BUFFER_LIST_INFO для задания и получения значений в массиве NetBufferListInfo .

Комментарии

Драйверы NDIS могут вызывать любую из следующих функций для выделения и инициализации структуры NET_BUFFER_LIST:

NdisAllocateNetBufferList

NdisAllocateNetBufferAndNetBufferList NdisAllocateCloneNetBufferList NdisAllocateFragmentNetBufferList NdisAllocateReassembledNetBufferList

Все NET_BUFFER структуры, связанные со структурой NET_BUFFER_LIST, имеют атрибуты, заданные элементами NetBufferListInfo и Context .

Когда драйвер вызывает функцию NdisSendNetBufferLists или NdisFSendNetBufferLists , он теряет право владения:

  • Указанная структура NET_BUFFER_LIST.
  • Присоединенные NET_BUFFER структуры и многомерные списки.
  • Все присоединенные NDIS_REQUEST_CONTROLs.
  • Все данные NetBufferListInfo , связанные с NET_BUFFER_LIST структурой.
Текущий владелец списка NET_BUFFER_LIST структур может переместить структуру NET_BUFFER_LIST в другой список. Однако все NET_BUFFER структуры, связанные со структурой NET_BUFFER_LIST, должны оставаться с одной и той же NET_BUFFER_LIST структурой. Только драйвер, создавший структуры NET_BUFFER, может переместить их в другую структуру NET_BUFFER_LIST. Текущий владелец не может изменить следующий элемент NET_BUFFER структуры.

Список NET_BUFFER_LIST структур представляет собой простой по отдельности связанный список, заканчивающийся со значением NULL. Чтобы переместить структуру NET_BUFFER_LIST в другой список, внесите соответствующие изменения в следующие элементы как в исходном, так и в целевом списках.

Чтобы получить доступ к членам структуры NET_BUFFER_LIST, используйте следующие макросы и функции:

NET_BUFFER_LIST_NEXT_NBL

NET_BUFFER_LIST_FIRST_NB

NET_BUFFER_LIST_FLAGS

NET_BUFFER_LIST_CONTEXT_DATA_SIZE NET_BUFFER_LIST_CONTEXT_DATA_START NET_BUFFER_LIST_MINIPORT_RESERVED

NET_BUFFER_LIST_INFO

NET_BUFFER_LIST_STATUS

NET_BUFFER_LIST_PROTOCOL_RESERVED NdisGetPoolFromNetBufferList

Дополнительные сведения об использовании чистых буферов см. в разделе Архитектура NET_BUFFER.

Требования

Требование Значение
Минимальная версия клиента Поддерживается в NDIS 6.0 и более поздних версиях.
Верхняя часть ndis/nbl.h (включая ndis.h)

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

NDIS_NET_BUFFER_LIST_INFO

NET_BUFFER

NET_BUFFER_LIST_CONTEXT

NET_BUFFER_LIST_CONTEXT_DATA_START NET_BUFFER_LIST_CONTEXT_DATA_SIZE

NET_BUFFER_LIST_FIRST_NB

NET_BUFFER_LIST_FLAGS

NET_BUFFER_LIST_HEADER

NET_BUFFER_LIST_INFO

NET_BUFFER_LIST_MINIPORT_RESERVED

NET_BUFFER_LIST_NEXT_NBL

NET_BUFFER_LIST_PROTOCOL_RESERVED

NET_BUFFER_LIST_STATUS

NdisAllocateCloneNetBufferList NdisAllocateFragmentNetBufferList NdisAllocateNetBufferAndNetBufferList

NdisAllocateNetBufferList

NdisAllocateNetBufferListContext NdisAllocateReassembledNetBufferList

NdisCancelSendNetBufferLists

NdisClearNblFlag

NdisFreeNetBufferListContext

NdisGeneratePartialCancelId

NdisGetPoolFromNetBufferList

NdisSendNetBufferLists

NdisSetNblFlag

NdisTestNblFlag

NdisTestNblFlags