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
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_SIZEParentNetBufferList
この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 がドライバーに提供したハンドル。
ミニポート ドライバー
プロトコル ドライバー
フィルター ドライバー
NDIS は SourceHandle を使用して、NET_BUFFER_LIST構造体を送信したドライバーにNET_BUFFER_LIST構造体を返します。
NblFlags
このメンバーには、ビットごとの OR 演算と組み合わせることができるフラグが含まれています。
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構造体とそのデータは、受信操作の読み取り専用です。
ドライバーは、関連付けられているイーサネット フレームを分割しない場合でも、次のフラグを設定できます。
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
このセットはプロトコル ドライバー用に予約されています。
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構造体を割り当てて初期化できます。
NdisAllocateNetBufferAndNetBufferList NdisAllocateCloneNetBufferList NdisAllocateFragmentNetBufferList NdisAllocateReassembledNetBufferListNET_BUFFER_LIST構造体に関連付けられているすべてのNET_BUFFER構造体には、 NetBufferListInfo メンバーと Context メンバーによって指定される属性があります。
ドライバーが NdisSendNetBufferLists または NdisFSendNetBufferLists 関数を呼び出すと、次の所有権が失われます。
- 指定したNET_BUFFER_LIST構造体。
- アタッチされた NET_BUFFER 構造体と MDL。
- アタッチされているNDIS_REQUEST_CONTROLs。
- NET_BUFFER_LIST構造体に関連付けられているすべての NetBufferListInfo データ。
NET_BUFFER_LIST構造体のリストは、単一のリンクと NULL で終わる単純なリストです。 NET_BUFFER_LIST構造体を別のリストに移動するには、ソース リストとコピー先リストの両方の Next メンバーを適切に更新します。
NET_BUFFER_LIST構造体のメンバーにアクセスするには、次のマクロと関数を使用します。
NET_BUFFER_LIST_MINIPORT_RESERVED NET_BUFFER_LIST_CONTEXT_DATA_START NET_BUFFER_LIST_CONTEXT_DATA_SIZE NdisGetPoolFromNetBufferList のNET_BUFFER_LIST_PROTOCOL_RESERVEDネット バッファーの使用方法の詳細については、「 NET_BUFFER アーキテクチャ」を参照してください。
要件
要件 | 値 |
---|---|
サポートされている最小のクライアント | NDIS 6.0 以降でサポートされています。 |
Header | ndis/nbl.h (ndis.h を含む) |