次の方法で共有


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

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

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

構文

MINIPORT_ISR MiniportIsr;

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

パラメーター

[in] MiniportInterruptContext

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

[out] QueueDefaultInterruptDpc

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

[out] TargetProcessors

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

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

戻り値

MiniportInterrupt は 、次のいずれかの値を返します。

リターン コード 説明
True

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

False

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

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

注釈

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

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

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

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

割り込みが NIC の場合、 MiniportInterrupt は NIC の割り込みを無視し、割り込みに関して必要な状態を保存し、可能な限り多くの I/O 処理を MiniportInterruptDPC 関数に延期します。

基になる NIC によって指定された割り込みが生成され、ミニポート ドライバーが遅延プロシージャ呼び出し (DPC) を要求する場合、ミニポート ドライバーは NIC からのそれ以上のすべての割り込みを無効にし、すべての 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 は、指定された各 CPU で DPC をスケジュールします。
メモNDIS は、MiniportInterrupt が返す値に関係なく、QueueDefaultInterruptDpc パラメーターと TargetProcessors パラメーターで指定された値に基づいて DPC をキューに入れます。 ただし、 MiniportInterrupt は引き続き正しい値を返す必要があります。
 
MiniportInterrupt が NIC レジスタや状態変数などのリソースを、下位 IRQL で実行される別の MiniportXxx 関数と共有する場合、その MiniportXxx 関数は を呼び出す必要があります。 NdisMSynchronizeWithInterruptEx 関数。 これにより、ドライバーの MiniportSynchronizeInterrupt 関数が、同期されたマルチプロセッサセーフな方法で共有リソースにアクセスできるようになります。

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

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

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

たとえば、" MyInterrupt" という名前の MiniportInterrupt 関数を定義するには、次のコード例に示すように 、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の詳細については、「関数の動作に注釈を付ける」を参照してください。

要件

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

こちらもご覧ください

MiniportHaltEx

MiniportInitializeEx

MiniportInterruptDPC

MiniportSynchronizeInterrupt NDIS_MINIPORT_INTERRUPT_CHARACTERISTICS

NdisMDeregisterInterruptEx

NdisMQueueDpcEx

NdisMRegisterInterruptEx

NdisMSynchronizeWithInterruptEx OID_GEN_RECEIVE_SCALE_CAPABILITIES OID_GEN_RECEIVE_SCALE_PARAMETERS

Receive Side Scaling (RSS)