NdisAllocatePacketPoolEx 関数 (ndis.h)

メモ NDIS 5。 x は非推奨となり、NDIS 6 に置き換えられます。 x があります。 新しい NDIS ドライバーの開発については、「 Windows Vista 以降のネットワーク ドライバー」を参照してください。 NDIS 5 の移植について説明します。 x ドライバーを NDIS 6 に設定します。 x については、「 NDIS 5.x ドライバーを NDIS 6.0 に移植する」を参照してください。

この関数は、パケット記述子のプールの記憶域ブロックを割り当てて初期化します。

構文

void NdisAllocatePacketPoolEx(
  [out] PNDIS_STATUS Status,
  [out] PNDIS_HANDLE PoolHandle,
  [in]  UINT         NumberOfDescriptors,
  [in]  UINT         NumberOfOverflowDescriptors,
  [in]  UINT         ProtocolReservedLength
);

パラメーター

[out] Status

この関数がパケット プール割り当ての状態を返す呼び出し元が指定した変数を指します。

[out] PoolHandle

呼び出し元が指定した変数を指します。この変数は、この関数がパケット プールへのハンドルを返します。 このハンドルは、ドライバーが後で呼び出す NdisXXXパケット 関数に必要なパラメーターです。

[in] NumberOfDescriptors

予想される通常の使用のためにプールに含める必要があるパケット記述子の数を指定します。 割り当て可能な NumberOfDescriptors の最大数は0xFFFF。 これより多くを割り当てようとした場合、 NdisAllocatePacketPoolEx はNDIS_STATUS_RESOURCES の状態 を返します。

[in] NumberOfOverflowDescriptors

オーバーフロー状態のために予約されているパケット記述子の数を指定します。つまり、 NumberOfDescriptors で指定されたすべての記述子が使用されている場合です。 このパラメーターと NumberOfDescriptors の合計が0xFFFFを超える場合、 NdisAllocatePacketPoolEx は、このパラメーターとして指定された値を減らして、 NumberOfDescriptorsNumberOfOverflowDescriptors の合計が0xFFFFになるようにします。

[in] ProtocolReservedLength

各パケット記述子の ProtocolReserved 配列に割り当てるバイト数を指定します。 受信指示でパケット記述子を使用する場合、このパラメーターは 4*size of (PVOID) です。

戻り値

なし

解説

次の表は、この関数で使用できる戻り値を示しています。

Status 説明
NDIS_STATUS_SUCCESS ドライバーは、上位レベルのドライバーまでの表示を行うか、下位レベルのドライバーにパケットを送信するパケット記述子が必要な場合に NdisAllocatePacket を呼び出すことができます。
NDIS_STATUS_RESOURCES メモリが不足している可能性があるため、パケット プールの割り当てに失敗しました。 この戻り値は、後続の呼び出しが失敗するとは限りません。 ただし、呼び出し元は NumberOfDescriptors を減らそうとし、すぐに再度呼び出す可能性があります。

NdisAllocatePacketPoolEx の呼び出しが成功すると、呼び出し元が保存する必要があるパケット プールへのハンドルが返されます。 通常、ドライバーは次に、このハンドルを使用して NdisAllocatePacket を 1 回以上呼び出して、パケット記述子のセットを割り当てます。

NdisAllocatePacketPoolEx は、 NumberOfDescriptors で指定されたパケット記述子の数に対応するために十分なメモリのみを静的に割り当てます。 NdisAllocatePacket の呼び出しでプールから割り当てることができるパケット記述子の合計数は、0xFFFFの方が少ないか、最初に NdisAllocatePacketPoolEx に渡された NumberOfDescriptorsNumberOfOverflowDescriptors の合計です。 オーバーフロー記述子は、オーバーフロー状態の間にのみ動的に割り当てられます。つまり、指定された NumberOfDescriptor が既に割り当てられ、まだ使用されている場合です。

NumberOfDescriptorsNumberOfOverflowDescriptors の合計は、パケット プールの空きリストにパケット記述子を返すために NdisFreePacket を呼び出す前に、ドライバーが NdisAllocatePacket を呼び出すことができる回数に関する有効な制限です。 オーバーフロー記述子がまだ割り当てられていない場合、 NdisFreePacket は静的に割り当てられたプールにパケット記述子を返します。 1 つ以上のオーバーフロー記述子が既に割り当てられている場合、 NdisFreePacket は、プールではなく、システム メモリにパケット記述子を返します。

NdisAllocatePacketPoolEx の呼び出し元は、予期される通常の読み込みに必要なパケット記述子の数に NumberOfDescriptors を設定する必要があります。 ドライバーは、予想されるピーク負荷に対応するために必要な追加の記述子の数に NumberOfOverflowDescriptors を設定する必要があります。 使用可能なパケット記述子の合計数 (NumberOfDescriptorsNumberOfOverflowDescriptors) がプールから割り当てられている場合、 NdisAllocatePacket の呼び出しはNDIS_STATUS_RESOURCESを返します。

送信または示されたパケットが割り当てドライバーに返されると、 NdisReinitializePacket を呼び出してバッファー記述子のチェーンで設定し直した後に各パケット記述子を再利用できます。または、ドライバーは NdisFreePacket を呼び出して、そのパケットを空きリストに返すことができます。 パケット プールから割り当てられたパケットの再初期化と再利用は、解放するよりもはるかに高速であり、再割り当てを行う必要があります。 ドライバーがパケット記述子を使用 して NdisReinitializePacket を呼び出す前に、 NdisReinitializePacket はバッファー チェーンの先頭を NULL に設定するため、パケット記述子にチェーンされているバッファー記述子へのポインターを保存する必要があります。

ドライバーがパケット記述子を必要としなくなると、 [(nf-ndis-ndisfreepacketpool.md) を呼び出して、 NdisAllocatePacketPoolEx で割り当てたストレージを解放します。

OS バージョン: .NET 4.0 以降Windows CE。

要件

要件
Header ndis.h
Library Ndis.lib
IRQL IRQL <= DISPATCH_LEVEL

こちらもご覧ください