次の方法で共有


WdfInterruptAcquireLock 関数 (wdfinterrupt.h)

[KMDF と UMDF に適用]

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

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

構文

void WdfInterruptAcquireLock(
  [in] WDFINTERRUPT Interrupt
);

パラメーター

[in] Interrupt

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

戻り値

なし

注釈

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

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

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

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

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

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

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

WdfInterruptAcquireLock 使用し、WdfInterruptReleaseLock できます。これは、ドライバーが割り込まずに数行のコードを実行する必要があり、デバイス割り込みのサービスを効果的に無効にする必要がある場合です。 コードのより大きなセクションでは、ドライバーは 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
ヘッダー wdfinterrupt.h (Wdf.h を含む)
IRQL <= DIRQL
DDI コンプライアンス規則 する DriverCreate(kmdf), KmdfIrql(kmdf), KmdfIrql2(kmdf), KmdfIrqlExplicit(kmdf), WdfInterruptLock(kmdf), WdfInterruptLockRelease(kmdf)

こちらもご覧ください