PROTOCOL_CO_RECEIVE_NET_BUFFER_LISTS コールバック関数 (ndis.h)
ProtocolCoReceiveNetBufferLists 関数プロセスは、基になるドライバーから指示を受け取ります。
構文
PROTOCOL_CO_RECEIVE_NET_BUFFER_LISTS ProtocolCoReceiveNetBufferLists;
void ProtocolCoReceiveNetBufferLists(
[in] NDIS_HANDLE ProtocolBindingContext,
[in] NDIS_HANDLE ProtocolVcContext,
[in] PNET_BUFFER_LIST NetBufferLists,
[in] ULONG NumberOfNetBufferLists,
[in] ULONG ReceiveFlags
)
{...}
パラメーター
[in] ProtocolBindingContext
バインディングの状態情報を維持するためにプロトコル ドライバーが割り当てたコンテキスト領域へのハンドル。 このハンドルは、 NdisOpenAdapterEx の以前の呼び出しで NDIS に渡されました。
[in] ProtocolVcContext
このドライバーが仮想接続 (VC) ごとのランタイム状態情報を保持する、プロトコル ドライバーによって割り当てられたコンテキスト領域へのハンドル。 クライアントまたはスタンドアロンの呼び出しマネージャーは、 NdisCoCreateVc 関数を呼び出したとき、または ProtocolCoCreateVc 関数からこのハンドルを提供しました。
[in] NetBufferLists
基になるドライバーが割り当てた NET_BUFFER_LIST 構造体のリンクされた一覧。 各 NET_BUFFER_LIST 構造体は、通常、1 つの NET_BUFFER 構造体に関連付けられます。
[in] NumberOfNetBufferLists
NetBufferLists が指定する構造体のリンクリストにあるNET_BUFFER_LIST構造体の数。
[in] ReceiveFlags
送信操作の属性を定義するフラグ。 フラグは、ビットごとの OR 演算と組み合わせることができます。 すべてのフラグをクリアするには、このパラメーターを 0 に設定します。 ProtocolCoReceiveNetBufferLists では、 次のフラグがサポートされています。
NDIS_RECEIVE_FLAGS_DISPATCH_LEVEL
現在の IRQL はDISPATCH_LEVEL。 このフラグの詳細については、「 ディスパッチ IRQL 追跡」を参照してください。
NDIS_RECEIVE_FLAGS_RESOURCES
NDIS は、ProtocolCoReceiveNetBufferLists の呼び出しが返された直後に、NET_BUFFER_LIST構造体とアタッチされているNET_BUFFER構造体の所有権を再利用します。
戻り値
なし
解説
CoNDIS プロトコル ドライバーには ProtocolCoReceiveNetBufferLists 関数が必要です。 バインドされたミニポート ドライバーが を呼び出した後、NDIS は ProtocolCoReceiveNetBufferLists を呼び出します。 NdisMCoIndicateReceiveNetBufferLists 関数。 ProtocolCoReceiveNetBufferLists の呼び出しは、ループバックの結果として発生する可能性もあります。
CoReceiveFlags パラメーターのNDIS_RECEIVE_FLAGS_RESOURCES フラグが設定されていない場合、プロトコル ドライバーは、 を呼び出すまでNET_BUFFER_LIST構造体の所有権を保持します。 NdisReturnNetBufferLists 関数。 NDIS が NDIS_RECEIVE_FLAGS_RESOURCES フラグを設定する場合、プロトコル ドライバーは 、NET_BUFFER_LIST 構造と関連付けられているリソースを保持できません。 NDIS_RECEIVE_FLAGS_RESOURCES は、基になるドライバーに低い受信リソースがあることを示します。 この場合、 ProtocolCoReceiveNetBufferLists 関数は、受信したデータをプロトコル割り当てストレージにコピーし、できるだけ早く戻る必要があります。
マルチプロセッサ システムでは、 ProtocolCoReceiveNetBufferLists は 複数のプロセッサで同時に実行できます。 この状況では、 ProtocolCoReceiveNetBufferLists がアクセスする重要なデータ構造に保護 (スピン ロックの使用など) を適用します。
NDIS は、IRQL<= DISPATCH_LEVELで ProtocolCoReceiveNetBufferLists を呼び出します。
例
ProtocolCoReceiveNetBufferLists 関数を定義するには、まず、定義する関数の種類を識別する関数宣言を指定する必要があります。 Windows には、ドライバー用の一連の関数型が用意されています。 関数の種類を使用して関数を宣言すると、ドライバー、静的ドライバー検証ツール (SDV)、およびその他の検証ツールのコード分析でエラーが検出され、Windows オペレーティング システムのドライバーを記述するための要件になります。たとえば、" MyCoReceiveNetBufferLists" という名前の ProtocolCoReceiveNetBufferLists 関数を定義するには、次のコード例に示すように 、PROTOCOL_CO_RECEIVE_NET_BUFFER_LISTS 型を使用します。
PROTOCOL_CO_RECEIVE_NET_BUFFER_LISTS MyCoReceiveNetBufferLists;
次に、次のように関数を実装します。
_Use_decl_annotations_
VOID
MyCoReceiveNetBufferLists(
NDIS_HANDLE ProtocolBindingContext,
NDIS_HANDLE ProtocolVcContext,
INPNET_BUFFER_LIST NetBufferLists,
ULONG NumberOfNetBufferLists,
ULONG ReceiveFlags
)
{...}
PROTOCOL_CO_RECEIVE_NET_BUFFER_LISTS関数の種類は、Ndis.h ヘッダー ファイルで定義されています。 コード分析ツールの実行時にエラーをより正確に識別するには、 Use_decl_annotations 注釈を関数定義に追加してください。 Use_decl_annotations注釈を使用すると、ヘッダー ファイル内のPROTOCOL_CO_RECEIVE_NET_BUFFER_LISTS関数型に適用される注釈が確実に使用されます。 関数宣言の要件の詳細については、「NDIS ドライバーの関数 ロール型を使用して関数を宣言する」を参照してください。
Use_decl_annotationsの詳細については、「関数の動作に注釈を付ける」を参照してください。
要件
要件 | 値 |
---|---|
サポートされている最小のクライアント | NDIS 6.0 以降でサポートされています。 |
対象プラットフォーム | Windows |
ヘッダー | ndis.h (Ndis.h を含む) |
IRQL | <= DISPATCH_LEVEL |