MINIPORT_INTERRUPT_DPC コールバック関数 (ndis.h)
ドライバーが NdisMRegisterInterruptEx 関数を呼び出して割り込みを登録する場合、ミニポート ドライバーは MiniportInterruptDPC 関数を提供する必要があります。
構文
MINIPORT_INTERRUPT_DPC MiniportInterruptDpc;
void MiniportInterruptDpc(
[in] NDIS_HANDLE MiniportInterruptContext,
[in] PVOID MiniportDpcContext,
[in] PVOID ReceiveThrottleParameters,
[in] PVOID NdisReserved2
)
{...}
パラメーター
[in] MiniportInterruptContext
割り込みコンテキスト情報のブロックへのハンドル。 ミニポート ドライバーは、ミニポート ドライバーに渡された ミニポートInterruptContext パラメーターでこのハンドルを提供しました。 NdisMRegisterInterruptEx 関数。
[in] MiniportDpcContext
NdisMQueueDpcEx または NdisMQueueDpc 関数を呼び出したときにミニポート ドライバーが指定したコンテキスト領域へのポインター。 ミニポート ドライバーが MiniportInterrupt 関数の TargetProcessors パラメーターでビットマスクを返したために NDIS が MiniportInterruptDPC を呼び出した場合、MiniportDpcContext は NULL です。
[in] ReceiveThrottleParameters
へのポインター NDIS_RECEIVE_THROTTLE_PARAMETERS 構造体。 この構造体は、ミニポート ドライバーが DPC で示す必要がある NET_BUFFER_LIST 構造体の最大数を指定します。
[in] NdisReserved2
NDIS 用に予約されています。
戻り値
なし
解説
NdisMRegisterInterruptEx 関数に割り込みを登録するミニポート ドライバーは、MiniportInterruptDPC 関数を提供する必要があります。
NDIS は、割り込みの遅延処理を完了する ミニポートInterruptDPC を呼び出します。 ミニポート ドライバーは、 NdisMQueueDpcEx または NdisMQueueDpc 関数を呼び出して、他のプロセッサの追加の遅延プロシージャ呼び出し (DPC) を要求できます。
ミニポート ドライバーは、各割り込みのソースを決定し、適切なアクションを実行します。 たとえば、割り込みが送信操作の完了を示す場合、ミニポート ドライバーは保留中の送信要求を完了します。 割り込みのソースがリンク状態の変更である場合、ミニポート ドライバーは NDIS への新しいリンクの状態を示します。 未処理の受信パケットがある場合、ミニポート ドライバーは NDIS へのパケットを示します。
受信側スケーリング (RSS) をサポートし、機能が有効になっているミニポート ドライバーは、MiniportInterruptDPC の受信キューを調べます。 NIC がそのような機能を提供する場合、NIC はハッシュ値に基づいて個別のキューで受信パケットを既にキューに入れている可能性があります。 それ以外の場合、ミニポート ドライバーは、 ミニポートInterruptDPC で個別のキューにパケットを並べ替えることができます。
MiniportInterruptDPC は を呼び出します。現在のプロセッサ上のパケットを示す NdisMIndicateReceiveNetBufferLists 関数。 MiniportInterruptDPC は、他の CPU に必要な処理を識別し、DPC が未処理でない CPU で DPC をスケジュールするように NDIS に要求できます。
現在の DPC が MiniportInterrupt 関数と同じ CPU で実行されている場合、ミニポート ドライバーは、CPU にマップできなかったすべてのパケットを示す必要があります。 この DPC が最後にスケジュールされた DPC であり、追加の DPC を要求しない場合、 MiniportInterruptDPC が返される前に、NIC の割り込みを再度有効にする必要があります。
割り込みは通常、NDIS が MiniportInterruptDPC を呼び出す前に、MiniportInterrupt 関数の NIC で既に無効になっています。 制御を返す前に、 MiniportInterruptDPC は割り込みを再び可能にすることができます。 割り込みが無効になっているときにミニポート ドライバーが追加の DPC をキューに入れていた場合、ドライバーは最後の DPC が返される前に割り込みを有効にする必要があります。
ミニポート ドライバーは、必要な制限時間内に完了する 割り込み DPC バッチ を処理中に示す受信バッファーの数を制限する必要があります。 割り込み DPC バッチは、ISR の後、および割り込みが再び有効になる前に実行されるすべての DPC のコレクションです。
ミニポート ドライバーは、 を呼び出すことができます。 NdisMRegisterInterruptEx で割り当てられたリソースを解放するには、 その MiniportInitializeEx 関数または MiniportHaltEx 関数から NdisMDeregisterInterruptEx 関数を使用します。 NdisMDeregisterInterruptEx が返された後、NDIS はミニポート ドライバーのミニポートInterruptまたはミニポートInterruptDPC 関数を呼び出しません。
NDIS は、IRQL = DISPATCH_LEVEL で MiniportInterruptDPC を呼び出します。
例
MiniportInterruptDPC 関数を定義するには、まず、定義する関数の型を識別する関数宣言を指定する必要があります。 Windows には、ドライバーの関数型のセットが用意されています。 関数の種類を使用して関数を宣言すると、 ドライバーのコード分析、 静的ドライバー検証ツール (SDV)、およびその他の検証ツールでエラーが検出され、Windows オペレーティング システム用のドライバーを記述するための要件になります。たとえば、" MyInterruptDPC" という名前の MiniportInterruptDPC 関数を定義するには、次のコード例に示すように 、MINIPORT_INTERRUPT_DPC 型を使用します。
MINIPORT_INTERRUPT_DPC MyInterruptDPC;
次に、次のように関数を実装します。
_Use_decl_annotations_
VOID
MyInterruptDPC(
NDIS_HANDLE MiniportInterruptContext,
PVOID MiniportDpcContext,
PVOID ReceiveThrottleParameters,
PVOID NdisReserved2
)
{...}
MINIPORT_INTERRUPT_DPC関数の種類は、Ndis.h ヘッダー ファイルで定義されます。 コード分析ツールを実行するときにエラーをより正確に識別するには、 Use_decl_annotations 注釈を関数定義に追加してください。 Use_decl_annotations注釈を使用すると、ヘッダー ファイル内のMINIPORT_INTERRUPT_DPC関数型に適用される注釈が確実に使用されます。 関数宣言の要件の詳細については、「NDIS ドライバーの関数 ロール型を使用して関数を宣言する」を参照してください。
Use_decl_annotationsの詳細については、「関数の動作に注釈を付ける」を参照してください。
要件
要件 | 値 |
---|---|
サポートされている最小のクライアント | NDIS 6.0 以降でサポートされています。 |
対象プラットフォーム | Windows |
ヘッダー | ndis.h (Ndis.h を含む) |
IRQL | DISPATCH_LEVEL |