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_LIST の最初の NET_BUFFER

ドライバーは、このメンバーに直接アクセスできません。 代わりに、 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

このメンバーには、ビットごとの OR 演算と組み合わせることができるフラグが含まれています。

NdisTestNblFlagNdisTestNblFlagsNdisSetNblFlag、および 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構造体とそのデータは、受信操作の読み取り専用です。

ドライバーは、関連付けられているイーサネット フレームを分割しない場合でも、次のフラグを設定できます。

NDIS_NBL_FLAGS_IS_IPV4

このNET_BUFFER_LIST構造のすべてのイーサネット フレームは IPv4 フレームです。 このフラグが設定されている場合、ヘッダー データ分割プロバイダーは NDIS_NBL_FLAGS_IS_IPV6 フラグを設定しないでください。

NDIS_NBL_FLAGS_IS_IPV6

このNET_BUFFER_LIST構造内のすべてのイーサネット フレームは IPv6 フレームです。 このフラグが設定されている場合、ヘッダーデータ分割プロバイダーはNDIS_NBL_FLAGS_IS_IPV4フラグを設定しないでください。

NDIS_NBL_FLAGS_IS_TCP

このNET_BUFFER_LIST構造のイーサネット フレームはすべて TCP フレームです。 このフラグが設定されている場合、ヘッダーデータ分割プロバイダーは NDIS_NBL_FLAGS_IS_UDP フラグを設定せず、プロバイダーは NDIS_NBL_FLAGS_IS_IPV4 フラグまたは NDIS_NBL_FLAGS_IS_IPV6 フラグを設定する必要があります。

NDIS_NBL_FLAGS_IS_UDP

この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構造に関連付けられているパケットはすべてループバック パケットです。

ヘッダー データ分割プロバイダーが関連付けられたイーサネット フレームを分割しない場合、ミニポート ドライバーは、次のフラグがクリアされたNET_BUFFER_LIST構造を示す必要があります。

NDIS_NBL_FLAGS_HD_SPLIT

ヘッダーとデータは、このNET_BUFFER_LIST構造に関連付けられているすべてのイーサネット フレームで分割されます。

NDIS_NBL_FLAGS_SPLIT_AT_UPPER_LAYER_PROTOCOL_HEADER

この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

この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構造体にクローン (親) がある場合、このメンバーは未処理の複製の数を指定します。 それ以外の場合、このメンバーは 0 です。

Flags

NET_BUFFER_LIST構造体の属性。 次の定義では、フラグのセットのビット マスクを指定します。

NBL_FLAGS_PROTOCOL_RESERVED

このセットはプロトコル ドライバー用に予約されています。

メモ NDIS 6.30 以降では、プロトコルを使用するために 2 つの追加ビットを使用できます: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 関数。 ミニポート ドライバーは、次のいずれかの値を指定します。

NDIS_STATUS_SUCCESS

このNET_BUFFER_LIST構造に関連付けられているNET_BUFFER構造体によって記述されたすべてのネットワーク データが、ネットワーク経由で正常に送信されました。

NDIS_STATUS_INVALID_LENGTH

このNET_BUFFER_LIST構造に関連付けられている一部のNET_BUFFER構造体内のデータのサイズが、基になる NIC に対して大きすぎます。

NDIS_STATUS_RESOURCES

リソースが不足しているため、このNET_BUFFER_LIST構造体の送信要求が失敗しました。

NDIS_STATUS_FAILURE

このNET_BUFFER_LIST構造体に対するこの送信要求は、前の 3 つの値に記載されているもの以外の何らかの理由で失敗しました。

NDIS_STATUS_SEND_ABORTED

NDIS は、このNET_BUFFER_LIST構造体の送信操作を取り消すために 、MiniportCancelSend 関数を呼び出しました。

NDIS_STATUS_RESET_IN_PROGRESS

ミニポート ドライバーは、リセットのために送信要求を中止しました。

NDIS_STATUS_PAUSED

ドライバーが一時停止しているために送信要求を拒否する必要がある場合は、影響を受ける各NET_BUFFER_LISTの完全な状態をNDIS_STATUS_PAUSEDに設定します。

NdisReserved2

NDIS 用に予約されています。

NetBufferListInfo[MaxNetBufferListInfo]

リスト内のすべてのNET_BUFFER構造体に共通する情報を含む値の配列。 この情報は、多くの場合、"帯域外 (OOB) データ" と呼ばれます。

画面右側のnetBufferListInfo 配列の値を設定および取得するには、NET_BUFFER_LIST_INFO マクロを使用して列挙値をNDIS_NET_BUFFER_LIST_INFOします。

注釈

NDIS ドライバーは、次のいずれかの関数を呼び出して、NET_BUFFER_LIST構造体を割り当てて初期化できます。

NdisAllocateNetBufferList

NdisAllocateNetBufferAndNetBufferList NdisAllocateCloneNetBufferList NdisAllocateFragmentNetBufferList NdisAllocateReassembledNetBufferList

NET_BUFFER_LIST構造体に関連付けられているすべてのNET_BUFFER構造体には、 NetBufferListInfo メンバーと Context メンバーによって指定される属性があります。

ドライバーが NdisSendNetBufferLists または NdisFSendNetBufferLists 関数を呼び出すと、次の所有権が失われます。

  • 指定したNET_BUFFER_LIST構造体。
  • アタッチされた NET_BUFFER 構造体と MDL。
  • アタッチされているNDIS_REQUEST_CONTROLs。
  • NET_BUFFER_LIST構造体に関連付けられているすべての NetBufferListInfo データ。
NET_BUFFER_LIST構造体のリストの現在の所有者は、NET_BUFFER_LIST構造体を別のリストに移動できます。 ただし、NET_BUFFER_LIST構造体に関連付けられているすべてのNET_BUFFER構造体は、同じNET_BUFFER_LIST構造を維持する必要があります。 NET_BUFFER構造体を作成したドライバーのみが、それらを別のNET_BUFFER_LIST構造体に移動できます。 現在の所有者は、NET_BUFFER構造体の Next メンバーを変更できません。

NET_BUFFER_LIST構造体のリストは、単一のリンクと NULL で終わる単純なリストです。 NET_BUFFER_LIST構造体を別のリストに移動するには、ソース リストとコピー先リストの両方の Next メンバーを適切に更新します。

NET_BUFFER_LIST構造体のメンバーにアクセスするには、次のマクロと関数を使用します。

NET_BUFFER_LIST_NEXT_NBL

NET_BUFFER_LIST_FIRST_NB

NET_BUFFER_LIST_FLAGS

NET_BUFFER_LIST_MINIPORT_RESERVED NET_BUFFER_LIST_CONTEXT_DATA_START NET_BUFFER_LIST_CONTEXT_DATA_SIZE

NET_BUFFER_LIST_INFO

NET_BUFFER_LIST_STATUS

NdisGetPoolFromNetBufferListNET_BUFFER_LIST_PROTOCOL_RESERVED

ネット バッファーの使用方法の詳細については、「 NET_BUFFER アーキテクチャ」を参照してください。

要件

要件
サポートされている最小のクライアント NDIS 6.0 以降でサポートされています。
Header ndis/nbl.h (ndis.h を含む)

こちらもご覧ください

NDIS_NET_BUFFER_LIST_INFO

NET_BUFFER

NET_BUFFER_LIST_CONTEXT

NET_BUFFER_LIST_CONTEXT_DATA_SIZE NET_BUFFER_LIST_CONTEXT_DATA_START

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