MINIPORT_CO_SEND_NET_BUFFER_LISTS コールバック関数 (ndis.h)
MiniportCoSendNetBufferLists 関数は、NET_BUFFER_LIST構造の指定されたリンク されたリストに含まれるネットワーク データを送信します。
構文
MINIPORT_CO_SEND_NET_BUFFER_LISTS MiniportCoSendNetBufferLists;
void MiniportCoSendNetBufferLists(
[in] NDIS_HANDLE MiniportVcContext,
[in] PNET_BUFFER_LIST NetBufferLists,
[in] ULONG SendFlags
)
{...}
パラメーター
[in] MiniportVcContext
ミニポート ドライバーが仮想接続 (VC) ごとの状態を維持するミニポート ドライバーによって割り当てられたコンテキスト領域へのハンドル。 ミニポート ドライバーは、ミニポート CoCreateVc 関数から NDIS にこのハンドルを提供しました。
[in] NetBufferLists
NET_BUFFER_LIST 構造体の リンクされたリスト内の最初の NET_BUFFER_LIST 構造体へのポインター。 リスト内の各NET_BUFFER_LIST構造体には、NET_BUFFER構造体の一覧が記述されています。 リスト 内の各NET_BUFFER 構造体は、メモリ記述子リスト (MDL) のチェーンにマップされます。 MDLs には、 MiniportCoSendNetBufferLists が送信するネットワーク データが含まれています。
[in] SendFlags
送信操作の属性を定義するフラグ。 フラグは、ビットごとの OR 演算と組み合わせることができます。 すべてのフラグをクリアするには、このパラメーターを 0 に設定します。 MiniportCoSendNetBufferLists では、 次のフラグがサポートされています。
NDIS_SEND_FLAGS_DISPATCH_LEVEL
現在の IRQL がDISPATCH_LEVEL場合、呼び出し元は必要に応じてこのフラグを設定できます。 このフラグの詳細については、「 ディスパッチ IRQL 追跡」を参照してください。
NDIS_SEND_FLAGS_CHECK_FOR_LOOPBACK
NDIS はループバックをチェックする必要があります。 既定では、NDIS は送信要求を送信したドライバーにデータをループ バックしません。 基になるドライバーは、 NDIS_SEND_FLAGS_CHECK_FOR_LOOPBACK フラグを設定することで、この動作をオーバーライドできます。 このフラグが設定されている場合、NDIS は、バインドの受信条件に一致するデータを含むすべての NET_BUFFER 構造体を識別します。 NDIS は、基になるドライバー NET_BUFFER 条件に一致する構造体を示します。 このフラグは、他のバインディングでのループバックまたはループ バックのチェックには影響しません。
戻り値
なし
解説
CoNDIS ミニポート ドライバーには、MiniportCoSendNetBufferLists 関数が必要です。 基になるドライバーが を呼び出すと、 NdisCoSendNetBufferLists 関数は、バインドされた ミニポート ドライバーの MiniportCoSendNetBufferLists 関数を呼び出します。
NetBufferLists で NDIS が渡すNET_BUFFER_LIST構造体のリンクリストの順序は、ミニポート ドライバーがネットワーク データを送信する順序を表します。 さらに、ミニポート ドライバーは、ミニポート ドライバー が構造体を 受信した順序で複数 のミニポートCoSendNetBufferLists 呼び出しからNET_BUFFER_LIST構造体を送信する必要があります。
CoNDIS ミニポート ドライバーは、 NDIS が MiniportCoSendNetBufferLists 関数を呼び出すことによって行うすべての送信要求を受け入れる必要があります。 ミニポート ドライバーが送信要求をすぐに完了できない場合、ドライバーは要求を完了できるまでキューに要求を保持する必要があります。 送信要求が保留中の間、ミニポート ドライバーは 、NET_BUFFER_LIST構造体と、NET_BUFFER_LIST 構造体に関連付けられているすべてのリソースの 所有権を保持 します。
ミニポート ドライバーは、 を呼び出す必要があります。すべての CoNDIS 送信要求を完了するための NdisMCoSendNetBufferListsComplete 関数。 コンピューターのパフォーマンスを向上させるために、ドライバーは、複数の送信要求からの NET_BUFFER_LIST 構造を含むリンクリストを作成できます。 その後、ドライバーは、 NdisMCoSendNetBufferListsComplete への 1 回の呼び出しで、このようなリンクリストを渡すことができます。
さらに、ドライバーが NdisMCoSendNetBufferListsComplete を呼び出した直後に、ミニポート ドライバーがNET_BUFFER_LIST構造体やその他の関連リソースにアクセスできないと想定する必要があります。
MiniportCoSendNetBufferLists 関数は、ネットワーク データの内部キューへのアクセスを、同じキューにアクセスするドライバーの他の MiniportXxx 関数と同期する必要があります。 ミニポート ドライバーは、スピン ロックを使用して、キューへのアクセスを同期できます。
プロトコル ドライバーは、バインドされたミニポート ドライバーが選択したメディアの種類に基づいて、必要なネットワーク データを決定します。 ただし、プロトコル ドライバーは、選択したメディアの最小パケット サイズよりも短いパケットを指定するネットワーク データを提供できます。 この場合、選択したメディアが送信パケット サイズに最小長要件を課している場合、 MiniportCoSendNetBufferLists はパケットをゼロで埋め込む必要があります。
NDIS は、IRQL<= DISPATCH_LEVELで MiniportCoSendNetBufferLists を呼び出します。
例
MiniportCoSendNetBufferLists 関数を定義するには、まず、定義する関数の種類を識別する関数宣言を指定する必要があります。 Windows には、ドライバー用の一連の関数型が用意されています。 関数の種類を使用して関数を宣言すると、ドライバー、静的ドライバー検証ツール (SDV)、およびその他の検証ツールのコード分析でエラーが検出され、Windows オペレーティング システムのドライバーを記述するための要件になります。たとえば、" MyCoSendNetBufferLists" という名前の MiniportCoSendNetBufferLists 関数を定義するには、次のコード例に示すように 、MINIPORT_CO_SEND_NET_BUFFER_LISTS 型を使用します。
MINIPORT_CO_SEND_NET_BUFFER_LISTS MyCoSendNetBufferLists;
次に、次のように関数を実装します。
_Use_decl_annotations_
VOID
MyCoSendNetBufferLists(
NDIS_HANDLE MiniportVcContext,
PNET_BUFFER_LIST NetBufferLists,
ULONG SendFlags
)
{...}
MINIPORT_CO_SEND_NET_BUFFER_LISTS関数の種類は、Ndis.h ヘッダー ファイルで定義されています。 コード分析ツールの実行時にエラーをより正確に識別するには、 Use_decl_annotations 注釈を関数定義に追加してください。 Use_decl_annotations注釈を使用すると、ヘッダー ファイル内のMINIPORT_CO_SEND_NET_BUFFER_LISTS関数型に適用される注釈が確実に使用されます。 関数宣言の要件の詳細については、「NDIS ドライバーの関数 ロール型を使用して関数を宣言する」を参照してください。
Use_decl_annotationsの詳細については、「関数の動作に注釈を付ける」を参照してください。
要件
要件 | 値 |
---|---|
サポートされている最小のクライアント | NDIS 6.0 以降でサポートされています。 |
対象プラットフォーム | Windows |
ヘッダー | ndis.h (Ndis.h を含む) |
IRQL | <= DISPATCH_LEVEL |