MINIPORT_MESSAGE_INTERRUPT コールバック関数 (ndis.h)
NDIS は、NIC がメッセージ ベースの割り込みを生成するときに 、MiniportMessageInterrupt 関数を呼び出します。
構文
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 をスケジュールします。
戻り値
基になる NIC によって割り込みが生成された場合、MiniportMessageInterrupt は TRUE を返します。それ以外の場合は、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。
- ミニポート ドライバーに対して受信側のスケーリングが有効になり、ミニポート ドライバーは、受信キューごとに異なるメッセージを生成できます。
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_ENTRYMiniportSynchronizeMessageInterrupt
NDIS_MINIPORT_INTERRUPT_CHARACTERISTICS NdisMSynchronizeWithInterruptEx OID_GEN_RECEIVE_SCALE_CAPABILITIES OID_GEN_RECEIVE_SCALE_PARAMETERS