NdisAllocateNetBufferAndNetBufferList 関数 (ndis/nblapi.h)

NdisAllocateNetBufferAndNetBufferList 関数を呼び出して、事前に割り当てられたNET_BUFFER構造体で初期化されるNET_BUFFER_LIST構造体を割り当てて初期化します。

構文

NDIS_EXPORTED_ROUTINE NET_BUFFER_LIST * NdisAllocateNetBufferAndNetBufferList(
  [in]           NDIS_HANDLE          PoolHandle,
  [in]           USHORT               ContextSize,
  [in]           USHORT               ContextBackFill,
  [in, optional] __drv_aliasesMem MDL *MdlChain,
  [in]           ULONG                DataOffset,
  [in]           SIZE_T               DataLength
);

パラメーター

[in] PoolHandle

から以前に返されたNET_BUFFER_LIST構造体プール ハンドル NdisAllocateNetBufferListPool 関数。 呼び出し元が NdisAllocateNetBufferListPool に渡した NET_BUFFER_LIST_POOL_PARAMETERS 構造体の fAllocateNetBuffer メンバーは TRUE に設定され、 DataSize メンバーは 0 に設定されている必要があります。

[in] ContextSize

呼び出し元のために予約するNET_BUFFER_LIST_CONTEXT構造体内の使用されるデータ領域の量。 ContextSize は、MEMORY_ALLOCATION_ALIGNMENTによって定義された値の倍数である必要があります。

[in] ContextBackFill

呼び出し元が必要とする 未使用のデータ領域 (バックフィル領域) の量。 NDIS は、この値を ContextSize に追加し、追加の領域を割り当てます。 ContextBackFill は、MEMORY_ALLOCATION_ALIGNMENTによって定義された値の倍数である必要があります。

[in, optional] MdlChain

NDIS が事前割り当て済みのNET_BUFFER構造体を初期化するために使用する MDL チェーンへのポインター。 MdlChain には NULL を指定できます。

[in] DataOffset

バッファーの先頭から MDL チェーン内の 使用されるデータ空間 の先頭までの初期オフセット (バイト単位)。 このオフセットの前のデータ領域は 未使用のデータ空間です。 したがって、この値は、MDL チェーン内の使用可能なバックフィル領域の初期量も表します。 MdlChainNULL の場合、DataOffset は 0 である必要があります。

[in] DataLength

MDL チェーンで 使用されるデータ空間 の長さ (バイト単位)。 MdlChainNULL の場合、DataLength は 0 である必要があります。

戻り値

NdisAllocateNetBufferAndNetBufferList は、割り当てられたNET_BUFFER_LIST構造体へのポインターを返します。 NET_BUFFER_LIST構造体には、NET_BUFFER構造体が含まれます。 割り当てが失敗した場合、このポインターは NULL です

注釈

NdisAllocateNetBufferAndNetBufferList 関数が割り当てる構造体は、事前に割り当てられたNET_BUFFER構造体とペアになっているNET_BUFFER_LIST構造体を含むプールから取得する必要があります。 このようなプールを作成するには、 を呼び出す必要があります。 ndisAllocateNetBufferListPool 関数。NET_BUFFER_LIST_POOL_PARAMETERS構造体の fAllocateNetBuffer メンバーが TRUE に設定され、DataSize メンバーが 0 に設定されています。

NET_BUFFERNET_BUFFER_LIST 構造体は、NDIS バッファー プールから割り当てる必要があります。 ドライバーは、プライベート メモリ プールまたはスタックから NET_BUFFER_LIST または NET_BUFFER 構造体を割り当てて初期化することはできません。
 
NdisFreeNetBufferList 関数を呼び出して、NET_BUFFER_LIST構造体を解放します。

事前割り当て 済みNET_BUFFER は、NET_BUFFERを所有するときに別の MDL チェーンで再初期化することで再利用できますが、 NET_BUFFERDataOffsetDataLengthCurrentMdlCurrentMdlOffset フィールドは、新しい MDL チェーンと一 致している必要 があります。

たとえば、元の MDL チェーンに XDataLengthYDataOffset が含まれており、CurrentMdl が元の MDL チェーンの 2 番目の MDL (M) で始まる場合、CurrentMdlOffsetZ になります。NET_BUFFER_DATAMdlChain フィールドは、X'DataLength と Y'DataOffset を含む新しい MDL チェーンを指す必要があります。 CurrentMdl が新しい MDL チェーンの 3 番目の MDL (M') で始まる場合、CurrentMdlOffsetZ' であり、次のマクロを使用して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 以降でサポートされています。
対象プラットフォーム ユニバーサル
Header ndis/nblapi.h (ndis.h を含む)
Library Ndis.lib
IRQL <= DISPATCH_LEVEL
DDI コンプライアンス規則 Irql_NetBuffer_Function(ndis)、NdisAllocateNetBufferList(ndis)、NdisAllocateNetBufferList_InitFail(ndis)

こちらもご覧ください

NET_BUFFER

NET_BUFFER_LIST

NET_BUFFER_LIST_CONTEXT

NET_BUFFER_LIST_POOL_PARAMETERS

NdisAllocateNetBufferListPool

NdisFreeNetBufferList