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