次の方法で共有


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

DIRQL 未満で実行されるドライバー関数が、MiniportInterrupt 関数とリソースを共有する場合、ミニポート ドライバーは、MiniportSynchronizeInterrupt ハンドラーを提供する必要があります。

メッセージ通知割り込みの場合、DIRQL 未満で実行されるドライバー関数が 、MiniportMessageInterrupt 関数を使用してメッセージシグナル割り込みのリソースを共有する場合、ミニポート ドライバーは MiniportSynchronizeMessageInterrupt ハンドラーを提供します。

メモ この関数を宣言するには、非メッセージシグナル割り込みに MINIPORT_SYNCHRONIZE_INTERRUPT 型を使用するか、メッセージ通知割り込みに MINIPORT_SYNCHRONIZE_MESSAGE_INTERRUPT 型を使用する必要があります。 詳細については、次の例に関するセクションを参照してください。
 

構文

MINIPORT_SYNCHRONIZE_INTERRUPT MiniportSynchronizeInterrupt;

BOOLEAN MiniportSynchronizeInterrupt(
  [in] NDIS_HANDLE SynchronizeContext
)
{...}

パラメーター

[in] SynchronizeContext

ミニポート ドライバーの ミニポートXxx または内部関数が 呼び出されたときに提供されるコンテキスト領域へのハンドル。 NdisMSynchronizeWithInterruptEx 関数。

戻り値

MiniportSynchronizeInterrupt は、ドライバーによって決定された意味を持つブール値を返します。 NDIS が NdisMSynchronizeWithInterruptEx から返されるときに、NDIS は同じ値を返します。

注釈

メモ このセクションの情報は、"MiniportMessageInterrupt" に "MiniportInterrupt" を置き換え、"MiniportSynchronizeInterrupt" を "MiniportSynchronizeMessageInterrupt" に置き換えることによって、メッセージシグナル割り込みに適用することもできます。
 
DIRQL 未満で実行されるミニポート ドライバー関数が NIC レジスタなどのリソースをドライバーの MiniportInterrupt 関数と共有している場合、そのドライバーはそれらのリソースに直接アクセスできません。 このような低優先度関数が共有リソースに直接アクセスしようとすると、 MiniportInterrupt によって割り込まれる可能性があります。これにより、優先度の低いドライバー関数の状態の変更がオーバーライドされる可能性があります。

共有リソースへのアクセスを MiniportInterrupt と同期するには、優先度の低いドライバー関数で を呼び出す必要があります。 NdisMSynchronizeWithInterruptEx 関数。 ドライバーの MiniportSynchronizeInterrupt 関数は、DIRQL の共有リソースにアクセスします。 NdisMSynchronizeWithInterruptEx を呼び出すと、このようなミニポート ドライバーでの競合状態とデッドロックを防ぐことができます。

リソースを共有する優先度の低いドライバー関数 (DIRQL で実行される関数を除く) では、スピン ロックを使用してそれらの共有リソースを保護する必要があります。

MiniportSynchronizeInterrupt は、ドライバーの MiniportInitializeEx 関数が を呼び出したときに割り当てられた DIRQL で実行されます。 NdisMRegisterInterruptEx 関数。 DIRQL で実行されるドライバー関数と同様に、 MiniportSynchronizeInterrupt はできるだけ早く呼び出し元に制御を戻す必要があり、任意の IRQL で呼び出しても安全な NdisXxx 関数のみを呼び出すことができます。

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

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

MINIPORT_SYNCHRONIZE_INTERRUPT MySynchronizeInterrupt;

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

_Use_decl_annotations_
BOOLEAN
 MySynchronizeInterrupt(
    NDIS_HANDLE  SynchronizeContext
    )
  {...}

メッセージ通知割り込みに 対して MiniportSynchronizeMessageInterrupt 関数を定義するには、次のコード例に示すように 、MINIPORT_SYNCHRONIZE_MESSAGE_INTERRUPT 型を使用します。

MINIPORT_SYNCHRONIZE_MESSAGE_INTERRUPT MySynchronizeMessageInterrupt;

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

_Use_decl_annotations_
BOOLEAN
 MySynchronizeMessageInterrupt(
    NDIS_HANDLE  SynchronizeContext
    )
  {...}

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

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

要件

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

こちらもご覧ください

MiniportInetrrupt

MiniportInitializeEx

NdisAllocateSpinLock

NdisMRegisterInterruptEx

NdisMSynchronizeWithInterruptEx