次の方法で共有


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

NDIS は、NIC がメッセージ ベースの割り込みを生成するときに 、MiniportMessageInterrupt 関数を呼び出します。

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

構文

MINIPORT_MESSAGE_INTERRUPT MiniportMessageInterrupt;

BOOLEAN MiniportMessageInterrupt(
  [in]  NDIS_HANDLE MiniportInterruptContext,
  [in]  ULONG MessageId,
  [out] PBOOLEAN QueueDefaultInterruptDpc,
  [out] PULONG TargetProcessors
)
{...}

パラメーター

[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構造体へのポインターを渡します。

[out] QueueDefaultInterruptDpc

この呼び出しから返す前にミニポート ドライバーが設定するブール変数へのポインター。 ミニポート ドライバーは、ドライバーが既定の (現在の) CPU 上の DPC を必要とすることを示すために 、この 値を TRUE に設定します。 TRUE に設定すると、NDIS は TargetProcessors パラメーターの値を無視します。 FALSE に設定すると、NDIS は TargetProcessors パラメーターの値を使用して DPC をスケジュールします。

[out] TargetProcessors

NDIS が DPC をスケジュールする必要があるターゲット プロセッサを示すビットマスク。 このビットマスクは、プロセッサ グループ 0 の最初の 32 個のプロセッサを表します。 ビットマスク内の各ビットは CPU を識別します。 呼び出し元がビット 0 を設定する場合、NDIS は CPU 0 の DPC をスケジュールします。 呼び出し元がビット 1 を設定する場合、NDIS は CPU 1 用の DPC をスケジュールします。

メモ NDIS 6.20 以降のドライバーでは、DPC をスケジュールするには、このパラメーターを使用しないでください。 代わりに、このパラメーターを 0 に設定し、 NdisMQueueDpcEx 関数を使用して DPC をスケジュールする必要があります。
 

戻り値

基になる NIC によって割り込みが生成された場合、MiniportMessageInterruptTRUE を返します。それ以外の場合は、FALSE を返します。

注釈

NdisMRegisterInterruptEx 関数を使用してメッセージシグナル割り込み (MSI) サポートに登録するミニポート ドライバーは、MiniportMessageInterrupt 関数を提供する必要があります。

ミニポート ドライバーは、 その MiniportMessageInterrupt 関数で可能な限り少ない作業を行う必要があります。 NIC によって生成される割り込みの I/O 操作を遅延させる必要があります。 MiniportMessageInterruptDPC 関数。

NIC が MSI を生成すると、NDIS はミニポート ドライバーの MiniportMessageInterrupt 関数を呼び出します。

MiniportMessageInterrupt は割り込みに関する必要な状態情報を保存し、I/O 処理のできるだけ多くを に延期します。 MiniportMessageInterruptDPC 関数。

ミニポート ドライバーが指定されたメッセージの遅延プロシージャ呼び出し (DPC) を要求する場合、ミニポート ドライバーは、そのメッセージのそれ以上のすべての割り込みを無効にし、すべての DPC が完了した後に割り込みを再度有効にする必要があります。

ミニポート ドライバーは、既定の CPU のみの DPC をスケジュールする場合は、 QueueDefaultInterruptDpcを TRUE に設定する必要があります。 ドライバーは、次の場合にこれを行うことができます。

  • NIC によって割り込みが生成され、送信操作の完了またはその他の CPU で実行されないその他の要求が通知されました。
  • NIC は、受信したデータを通知する割り込みを生成し、ミニポート ドライバーは、個別の DPC で受信したパケットを処理できません。
  • 割り込みは受信パケットを示し、ミニポート ドライバーは個別の DPC で受信したパケットを処理できますが、 受信側スケーリング (RSS) はミニポート ドライバーに対して有効になっていません。 詳細については、「 OID_GEN_RECEIVE_SCALE_CAPABILITIES OID_GEN_RECEIVE_SCALE_PARAMETERS
  • ミニポート ドライバーに対して受信側のスケーリングが有効になり、ミニポート ドライバーは、受信キューごとに異なるメッセージを生成できます。
ミニポート ドライバーが個別の DPC で受信したパケットを処理する場合、ミニポート ドライバーは QueueDefaultInterruptDpc パラメーターを FALSE に設定 します。 ミニポート ドライバーは、各空でない受信キューに関連付けられている CPU の TargetProcessors ビットを設定する必要があります。 NDIS は、プロセッサ グループ 0 で示されている各 CPU で DPC をスケジュールします。

MiniportMessageInterrupt が NIC レジスタや状態変数などの指定されたメッセージのリソースを、下位 IRQL で実行される別の MiniportXxx 関数と共有する場合、その MiniportXxx 関数は を呼び出す必要があります。 NdisMSynchronizeWithInterruptEx 関数。 これにより、ドライバーの MiniportSynchronizeMessageInterrupt 関数が、同期されたマルチプロセッサセーフな方法で共有リソースにアクセスできるようになります。

ミニポート ドライバーは、 を呼び出すことができます。 NdisMRegisterInterruptEx で割り当てられたリソースを解放するには、 その MiniportInitializeEx 関数または MiniportHaltEx 関数から NdisMDeregisterInterruptEx 関数を使用します。 NdisMDeregisterInterruptEx が返された後、NDIS はミニポート ドライバーの MiniportMessageInterrupt または MiniportMessageInterruptDPC 関数を呼び出しません。

NDIS は、ミニポート ドライバーが NdisMRegisterInterruptEx への以前の呼び出しで登録された MSI の DIRQL で MiniportMessageInterrupt を呼び出します。 したがって、 MiniportMessageInterrupt は、任意の IRQL で呼び出しても安全な NDISRawXxx 関数や NdisRead/WriteRegisterXxx 関数などの NDIS 関数のサブセットを呼び出す必要があります。

MiniportMessageInterrupt 関数を定義するには、まず、定義する関数の種類を識別する関数宣言を指定する必要があります。 Windows には、ドライバー用の一連の関数型が用意されています。 関数の種類を使用して関数を宣言すると、ドライバー、静的ドライバー検証ツール (SDV)、およびその他の検証ツールのコード分析でエラーが検出され、Windows オペレーティング システムのドライバーを記述するための要件になります。

たとえば、" MyMessageInterrupt" という名前の MiniportMessageInterrupt 関数を定義するには、次のコード例に示すように 、MINIPORT_MESSAGE_INTERRUPT 型を使用します。

MINIPORT_MESSAGE_INTERRUPT MyMessageInterrupt;

次に、次のように関数を実装します。

_Use_decl_annotations_
BOOLEAN
 MyMessageInterrupt(
    NDIS_HANDLE  MiniportInterruptContext,
    ULONG  MessageId,
    PBOOLEAN  QueueDefaultInterruptDpc,
    PULONG  TargetProcessors
    )
  {...}

MINIPORT_MESSAGE_INTERRUPT関数の種類は、Ndis.h ヘッダー ファイルで定義されています。 コード分析ツールの実行時にエラーをより正確に識別するには、 Use_decl_annotations 注釈を関数定義に追加してください。 Use_decl_annotations注釈を使用すると、ヘッダー ファイル内のMINIPORT_MESSAGE_INTERRUPT関数型に適用される注釈が確実に使用されます。 関数宣言の要件の詳細については、「NDIS ドライバーの関数 ロール型を使用して関数を宣言する」を参照してください。

Use_decl_annotationsの詳細については、「関数の動作に注釈を付ける」を参照してください。

要件

要件
サポートされている最小のクライアント NDIS 6.0 以降でサポートされています。
対象プラットフォーム Windows
ヘッダー ndis.h (Ndis.h を含む)
IRQL 「解説」セクションを参照してください

こちらもご覧ください

IO_INTERRUPT_MESSAGE_INFO

IO_INTERRUPT_MESSAGE_INFO_ENTRY

MiniportHaltEx

MiniportInitializeEx

MiniportMessageInterruptDPC

MiniportSynchronizeMessageInterrupt

NDIS_MINIPORT_INTERRUPT_CHARACTERISTICS

NdisMDeregisterInterruptEx

NdisMQueueDpcEx

NdisMRegisterInterruptEx

NdisMSynchronizeWithInterruptEx OID_GEN_RECEIVE_SCALE_CAPABILITIES OID_GEN_RECEIVE_SCALE_PARAMETERS

Receive Side Scaling (RSS)