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

NDIS は、NIC または NIC と割り込みを共有する別のデバイスが割り込みを生成するときに 、ミニポートInterrupt 関数を呼び出します。

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

構文

MINIPORT_ISR MiniportIsr;

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

パラメーター

[in] MiniportInterruptContext

割り込みコンテキスト情報のブロックへのハンドル。 ミニポート ドライバーは、ミニポート ドライバーに渡された ミニポートInterruptContext パラメーターでこのハンドルを提供しました。 NdisMRegisterInterruptEx 関数。

[out] QueueDefaultInterruptDpc

この呼び出しから戻る前にミニポート ドライバーが設定する BOOLEAN 変数へのポインター。 ミニポート ドライバーは、ドライバーが既定の (現在の) CPU 上の DPC を必要とすることを示す TRUE にこの値を設定します。 この値が TRUE に設定されている場合、NDIS は TargetProcessors パラメーターの値を無視します。 FALSE に設定されている場合、NDIS は、DPC をスケジュールする TargetProcessors パラメーターの値を使用します。 QueueDefaultInterruptDpcTRUE の場合、NDIS は、ミニポートInterrupt からの戻り値に関係なく DPC をスケジュールします。

[out] TargetProcessors

NDIS が DPC をスケジュールする対象プロセッサを示すビットマスク。 このビットマスクは、プロセッサ グループ 0 の最初の 32 個のプロセッサを表します。 ビットマスク内の各ビットは CPU を識別します。 呼び出し元がビット 0 を設定する場合、NDIS は CPU 0 の DPC をスケジュールします。 呼び出し元がビット 1 を設定する場合、NDIS は CPU 1 用の DPC をスケジュールします。 QueueDefaultInterruptDpcFALSE に設定され、TargetProcessors が 0 に設定されている場合、NDIS は DPC をスケジュールしません。 それ以外の場合、NDIS は ミニポートInterrupt からの戻り値に関係なく DPC をスケジュールします。

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

戻り値

ミニポートInterrupt は、次のいずれかの値を返します。

リターン コード Description

MiniportInterrupt は、基になる NIC によって割り込みが生成されたことを確認しました。

MiniportInterrupt は、基になる NIC が割り込みを生成しなかったと判断しました。

 
手記NDIS は、ミニポートInterrupt が返す値に関係なく、QueueDefaultInterruptDpc パラメーターと TargetProcessors パラメーターで指定された値に基づいて DPC をキューに入れます。 ただし、 MiniportInterrupt は引き続き正しい値を返す必要があります。
 

注釈

NdisMRegisterInterruptEx 関数に割り込みを登録するミニポート ドライバーは、ミニポートInterrupt 関数を提供する必要があります。

ミニポート ドライバーは、 ミニポートInterrupt 関数で可能な限り少ない作業を行う必要があります。 NIC が ミニポートInterruptDPC 関数に生成する割り込みの I/O 操作を延期する必要があります。

NIC の割り込み行で割り込みが発生すると、NDIS はミニポート ドライバーの ミニポートInterrupt 関数を呼び出します。

すべての NIC は、I/O バス上の他のデバイスと行ベースの割り込みを共有できます。 NIC が割り込みを生成しなかった場合、システムが割り込みを生成したデバイスのドライバーを呼び出すことができるように 、ミニポートInterrupt はすぐに FALSE を返す必要があります。 QueueDefaultInterruptDpcFALSE に設定され、TargetProcessors パラメーターが 0 に設定されている場合、NDIS は DPC をスケジュールしません。 それ以外の場合、NDIS はミニポートInterrupt からの再ミニポートのターン値に関係なく、DPC をスケジュールします。

割り込みが NIC 用の場合、 ミニポートInterrupt は NIC の割り込みを無視し、割り込みに関して必要な状態を保存し、可能な限り I/O 処理を ミニポートInterruptDPC 関数に延期します。

基になる NIC によって指定された割り込みが生成され、ミニポート ドライバーが遅延プロシージャ呼び出し (DPC) を要求する場合、ミニポート ドライバーは、NIC からさらにすべての割り込みを無効にし、すべての DPC が完了した後に割り込みを再び有効化する必要があります。

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

  • NIC によって割り込みが生成され、送信操作の完了、または他の CPU で実行されないその他の要求が通知されました。
  • NIC は、受信したデータを通知する割り込みを生成し、ミニポート ドライバーは、個別の DPC で受信したパケットを処理できません。
  • 割り込みは受信したパケットを示し、ミニポート ドライバーは個別の DPC で受信したパケットを処理できますが、 受信側スケーリング (RSS) はミニポート ドライバーに対して有効になっていません。 詳細については、次を参照してください。 OID_GEN_RECEIVE_SCALE_CAPABILITIES OID_GEN_RECEIVE_SCALE_PARAMETERS
ミニポート ドライバーが個別の DPC で受信したパケットを処理する場合、ドライバーは QueueDefaultInterruptDpc パラメーターを FALSE に設定します。 ミニポート ドライバーは、空でない各受信キューに関連付けられている CPU の TargetProcessors ビットを設定する必要があります。 NDIS は、指定された各 CPU で DPC をスケジュールします。
手記NDIS は、ミニポートInterrupt が返す値に関係なく、QueueDefaultInterruptDpc パラメーターと TargetProcessors パラメーターで指定された値に基づいて DPC をキューに入れます。 ただし、 MiniportInterrupt は引き続き正しい値を返す必要があります。
 
Nic レジスタや状態変数などのリソースを、下位 IRQL で実行される別のミニポートXxx 関数と共有する場合、そのミニポートXxx 関数は、 を呼び出す必要があります。 NdisMSynchronizeWithInterruptEx 関数。 これにより、ドライバーの ミニポートSynchronizeInterrupt 関数は、同期されたマルチプロセッサセーフな方法で共有リソースにアクセスします。

ミニポート ドライバーは、次を呼び出すことができます。 NdisMRegisterInterruptEx で割り当てられたリソースを解放する ミニポートInitializeEx または ミニポートHaltEx 関数から NdisMDeregisterInterruptEx 関数。 NdisMDeregisterInterruptEx が返された後、NDIS はミニポート ドライバーのミニポートInterrupt またはミニポートInterruptDPC 関数を呼び出しません。

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

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

たとえば、" MyInterrupt" という名前のミニポートInterrupt 関数を定義するには、次のコード例に示すように MINIPORT_ISR 型を使用します。

MINIPORT_ISR MyInterrupt;

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

_Use_decl_annotations_
BOOLEAN
 MyInterrupt(
    NDIS_HANDLE  MiniportInterruptContext,
    PBOOLEAN  QueueDefaultInterruptDpc,
    PULONG  TargetProcessors
    )
  {...}

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

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

Requirements

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

こちらも参照ください

ミニポートHaltEx

ミニポートInitializeEx

ミニポートInterruptDPC

ミニポートSynchronizeInterrupt NDIS_MINIPORT_INTERRUPT_CHARACTERISTICS

NdisMDeregisterInterruptEx

NdisMQueueDpcEx

NdisMRegisterInterruptEx

NdisMSynchronizeWithInterruptEx OID_GEN_RECEIVE_SCALE_CAPABILITIES OID_GEN_RECEIVE_SCALE_PARAMETERS

Receive Side Scaling (RSS)