次の方法で共有


MINIPORT_MESSAGE_INTERRUPT_DPC コールバック関数 (ndis.h)

ドライバーが NdisMRegisterInterruptEx 関数を呼び出して割り込みを登録する場合、ミニポート ドライバーは MiniportMessageInterruptDPC ハンドラーを提供する必要があります。

メモMINIPORT_MESSAGE_INTERRUPT_DPC型を使用して関数を宣言する必要があります。 詳細については、次の例に関するセクションを参照してください。
 

構文

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 関数の場合、 MiniportDpcContextNULL です

[in] ReceiveThrottleParameters

へのポインター NDIS_RECEIVE_THROTTLE_PARAMETERS 構造体は、ミニポート ドライバーが DPC で示す必要がある NET_BUFFER_LIST 構造体の最大数を指定します。

メモ NDIS 6.1 以前では、このパラメーターの名前は NdisReserved1、データ型は PULONG、NDIS 用に予約されています。
 

NdisReserved1

NDIS 用に予約されています。

[in] NdisReserved2

NDIS 用に予約されています。

メモ NDIS 6.1 以前では、このパラメーターのデータ型は PULONG です。
 

戻り値

なし

解説

メッセージシグナル割り込みを 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 の実行後に割り込みを有効にする必要があります。

メモ パフォーマンスを向上させるには、ミニポート ドライバーは特定のメッセージの割り込みのみを無効にする必要があります。 すべてのメッセージシグナル割り込みを無効にすることはできません。
 
ミニポート ドライバーは、必要な制限時間内に完了する 割り込み DPC バッチ を処理中に示す受信バッファーの数を制限する必要があります。 割り込み DPC バッチは、ISR の後、および割り込みが再び有効になる前に実行されるすべての 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

こちらもご覧ください

IO_INTERRUPT_MESSAGE_INFO

IO_INTERRUPT_MESSAGE_INFO_ENTRY

MiniportHaltEx

MiniportInitializeEx

MiniportMessageInterrupt

NDIS_MINIPORT_INTERRUPT_CHARACTERISTICS NDIS_RECEIVE_THROTTLE_PARAMETERS

NET_BUFFER_LIST

NdisMDeregisterInterruptEx

NdisMIndicateReceiveNetBufferLists

NdisMQueueDpc

NdisMQueueDpcEx

NdisMRegisterInterruptEx

Receive Side Scaling (RSS)