割り込み同期のオブジェクト

PortCls システム ドライバーは、ミニポート ドライバーのメリットを活かすため、IInterruptSync インターフェイスを実装します。 IInterruptSync は、割り込みサービス ルーチン (ISR) の一覧の実行を非割り込みルーチンと同期する割り込み同期オブジェクトを表しています。

割り込み同期オブジェクトには、次の 2 つの主な機能があります。

  • 割り込みに対する ISR の一覧の実行。 同期オブジェクトは、割り込みソースに接続されます。 割り込みが発生するたびに、同期オブジェクトは、選択したモードに従って指定された順序で ISR を実行します。 (3 つのモードについては、次の説明をご覧ください。)

  • ISR ではないルーチンの実行。 これらの非割り込みルーチンは、同期オブジェクトの割り込みに接続されません。 代わりに、非割り込みルーチンは、呼び出し元の選択時点で実行されます。 ただし、同期オブジェクトは、オブジェクトの ISR の一覧を使用して非割り込みルーチンを同期的に実行します。 言い換えると、非割り込みルーチンは、同期オブジェクトの一覧の ISR が実行を開始する前に、完了するまで実行されます。その逆も同様です。

割り込み同期オブジェクトは、複数の ISR を柔軟に処理できます。 ISR は、同期オブジェクトが割り込み時に走査する、リンクされた一覧に存在します。 ミニポート ドライバーは、同期オブジェクトに ISR を登録するとき、ISR をこの一覧の先頭または末尾に追加するかどうかを指定します。

ミニポート ドライバーは、PcNewInterruptSync 関数を呼び出して、割り込み同期オブジェクトを作成します。 この呼び出し中、ドライバーは、オブジェクトが割り込み時に ISR の一覧を走査する方法を指定します。 この呼び出しでは、次の表の INTERRUPTSYNCMODE 列挙定数で指定された 3 つのオプションがサポートされています。

定数 説明

InterruptSyncModeNormal

一覧内の各 ISR を呼び出します。そのうちの 1 つが STATUS_SUCCESS を返すまで呼び出します。

InterruptSyncModeAll

上記の ISR のリターン コードに関係なく、一覧内の各 ISR を 1 回だけ呼び出します。

InterruptSyncModeRepeat

一覧内のどの ISR も STATUS_SUCCESS を返さない一覧のトリップが発生するまで、ISR の一覧全体を走査します。

InterruptSyncModeNormal モードでは、同期オブジェクトは、ISR のいずれかが STATUS_SUCCESS を返すまで、一覧内の各 ISR を呼び出します。 この ISR に続く一覧の ISR が呼び出されることはありません。 このモードは、オペレーティング システムが通常 ISR を処理する方法をエミュレートします。 どの ISR も STATUS_SUCCESS を返さない場合、動作は InterruptSyncModeAll と同じです。

InterruptSyncModeAll モードでは、上記の ISR のリターン コードに関係なく、一覧内の各 ISR が 1 回だけ呼び出されます。 これは、割り込みのソースが決定論的ではないより原始的なハードウェアを対象としていますが、他の状況でも役立つ場合があります。 たとえば、特定の割り込みが 2 つのソースのうちどちらから発生しているかに関係なく、割り込みごとに 2 つの割り込みソースが緊密に同期される可能性があります。

InterruptSyncModeRepeat モードでは、同期オブジェクトは、一覧内のどのルーチンも STATUS_SUCCESS を返さない一覧のトリップが発生するまで、ISR の一覧全体を繰り返し走査します。 このモードは、複数のソースからの割り込みが同じ割り込みラインで同時に発生したり、ISR 処理中に 2 つ目の割り込みが発生したりする場合に適しています。 各割り込みソースは、処理が必要かどうかを判断できる必要があります。 常に STATUS_SUCCESS を返す ISR がこのモードで同期オブジェクトに登録されている場合、システムは応答を停止します。

これらのいずれかのモードで、登録された ISR のいずれかが STATUS_SUCCESS を返した場合、同期オブジェクトはオペレーティング システムへの割り込みを確認します。 3 つのモードすべてで、割り込みを正常に処理しなかったことをすべての割り込みソースが示している場合、同期オブジェクトは、失敗した結果コードをオペレーティング システムに返します。

IInterruptSync インターフェイスでは、次のメソッドがサポートされています。

IInterruptSync::CallSynchronizedRoutine

IInterruptSync::Connect

IInterruptSync::Disconnect

IInterruptSync::GetKInterrupt

IInterruptSync::RegisterServiceRoutine