WdfInterruptAcquireLock 関数 (wdfinterrupt.h)

[KMDF と UMDF に適用]

WdfInterruptAcquireLock メソッドは、割り込みオブジェクトのスピン ロックを保持しながら、デバイスのデバイス割り込み要求レベル (DIRQL) で実行されるコード シーケンスを開始します。

パッシブ レベルの割り込みオブジェクトの場合、 メソッドは、割り込みオブジェクトのパッシブ ロックを保持しながらパッシブ レベルで実行されるコード シーケンスを開始します。

構文

void WdfInterruptAcquireLock(
  [in] WDFINTERRUPT Interrupt
);

パラメーター

[in] Interrupt

フレームワーク割り込みオブジェクトへのハンドル。

注釈

ドライバーが無効なオブジェクト ハンドルを提供すると、バグ チェックが発生します。

ドライバーが DIRQL 割り込みオブジェクトで WdfInterruptAcquireLock を 呼び出すと、システムはプロセッサの IRQL をデバイスの DIRQL に発生させ、割り込みオブジェクトの WDF_INTERRUPT_CONFIG 構造体でドライバーが指定したスピン ロックを取得します。 その結果、割り込みオブジェクトの EvtInterruptIsr および EvtInterruptSynchronize コールバック関数 (および同じ割り込みオブジェクトに対して WdfInterruptAcquireLock を呼び出す他のコード) は実行できません。

ドライバーが WdfInterruptReleaseLock を呼び出すと、システムはプロセッサの IRQL を以前のレベルに返し、スピン ロックを解放します。

ドライバーがパッシブ レベルの割り込みオブジェクトで WdfInterruptAcquireLock を 呼び出すと、システムは、割り込みオブジェクトの WDF_INTERRUPT_CONFIG 構造でドライバーが構成したパッシブ レベルの割り込みロックを取得します。

ドライバーが WdfInterruptReleaseLock を呼び出すと、システムは割り込みロックを解放します。

パッシブ レベルの割り込みの場合、ドライバーは IRQL = PASSIVE_LEVEL で WdfInterruptAcquireLock を 呼び出す必要があります。

要求ハンドラーなどの任意のスレッド コンテキストから WdfInterruptAcquireLock を呼び出さないでください。

ドライバーが割り込まずに数行のコードを実行し、デバイス割り込みのサービスを効果的に無効にする必要がある場合は、 WdfInterruptAcquireLockWdfInterruptReleaseLock を使用できます。 コードのより大きなセクションでは、ドライバーは EvtInterruptSynchronize コールバック関数を提供する必要があります。

ドライバーは、フレームワークがドライバーの EvtInterruptEnable コールバック関数を呼び出す前、またはフレームワークがドライバーの EvtInterruptDisable コールバック関数を呼び出した後に WdfInterruptAcquireLock を呼び出すことはできません。

ドライバーが WdfInterruptAcquireLock を呼び出した後、 WdfInterruptReleaseLock を呼び出す前に、同じ割り込みオブジェクトに対してメソッドを再度呼び出してはなりません。

WdfInterruptAcquireLock メソッドの詳細については、「割り込みコードの同期」を参照してください。

フレームワーク ベースのドライバーでの割り込みの処理の詳細については、「 ハードウェア割り込みの処理」を参照してください。

パッシブ レベルの割り込みオブジェクトの場合、ドライバーは、キュー オブジェクトコールバック関数などの任意のスレッドで実行されている場合、WdfInterruptAcquireLock ではなく WdfInterruptTryToAcquireLock を呼び出す必要があります。 たとえば、ドライバーは EvtIoRead から WdfInterruptTryToAcquireLock を呼び出す場合があります。

これにより、次のシナリオで説明するように、デッドロックの可能性を回避できます。

  1. デバイスが中断されたかどうかを判断するために、SPB 周辺機器のファンクション ドライバーは、パッシブ レベルの割り込みロックを保持して、ISR 内からバスに I/O を送信します。
  2. バス ドライバーは、上記の要求を受信したのと同じスレッドで 2 番目の要求を完了します。
  3. 2 番目の要求の完了ルーチンは、周辺機器ドライバーに要求を送信します。
  4. 周辺機器ドライバーの I/O ディスパッチ ルーチンは WdfInterruptAcquireLock を呼び出します。これにより、割り込みオブジェクトのパッシブ ロックを取得しようとしてデッドロックが発生します。

要件

要件
対象プラットフォーム ユニバーサル
最小 KMDF バージョン 1.0
最小 UMDF バージョン 2.0
Header wdfinterrupt.h (Wdf.h を含む)
IRQL <= DIRQL
DDI コンプライアンス規則 DriverCreate(kmdf)KmdfIrql(kmdf)KmdfIrql2(kmdf)、KmdfIrqlExplicit(kmdf)、 WdfInterruptLock(kmdf)WdfInterruptLockRelease(kmdf)

こちらもご覧ください