割り込みオブジェクトの作成

デバイスのハードウェア割り込みを処理する Windows Driver Frameworks (WDF) ドライバーは、各デバイスがサポートできる割り込みごとに、フレームワーク割り込みオブジェクトを作成する必要があります。 Windows 8 以降のバージョンのオペレーティング システムで実行されているフレームワーク バージョン 1.11 以降では、カーネルモード ドライバー フレームワーク (KMDF) ドライバーとユーザーモード ドライバー フレームワーク (UMDF) ドライバーは、パッシブレベルの処理を必要とする割り込みオブジェクトを作成できます。 ただし、System on a Chip (SoC) プラットフォームのドライバーを作成する場合を除き、ドライバーは DIRQL 割り込みオブジェクトを使用する必要があります。

ドライバーは通常、その EvtDriverDeviceAdd コールバック関数でフレームワーク割り込みオブジェクトを作成します。 ドライバーは、EvtDevicePrepareHardware コールバック関数から割り込みオブジェクトを作成することもできます。

フレームワークは、プラグ アンド プレイ (PnP) マネージャーが割り込みベクターなどのシステム リソースをデバイスに割り当てる前に、ドライバーの EvtDriverDeviceAdd コールバック関数を呼び出します。 PnP マネージャーがリソースを割り当てると、フレームワークは割り込みリソースをデバイスの割り込みオブジェクトに格納します。 (プラグ アンド プレイをサポートしていないドライバーは、割り込みオブジェクトを使用できません。)

フレームワーク割り込みオブジェクトを作成するには、ドライバーが WDF_INTERRUPT_CONFIG 構造体を初期化し、WdfInterruptCreate メソッドに渡す必要があります。

UMDF では次の種類の割り込みがサポートされます。

  • レベルトリガー (共有または排他的)
  • エッジトリガー (排他的のみ)
  • MSI (定義によって排他的)

UMDF は、共有エッジトリガー割り込みをサポートしないことに注意してください

UMDF バージョン 2.15 以降、UMDF では、ハードウェア レジスタを使用して明示的に有効または無効にできない、通常は GPIO ピンでサポートされるハードウェア プッシュ ボタンなどの単純なデバイスの割り込みをサポートしています。 このようなデバイスをサポートするには、UMDF ドライバーは、排他的なエッジトリガー割り込みを使用する必要があります。

KMDF バージョン 1.15 以降では、KMDF では、「Active-Both 割り込みの処理で」説明されている回避策なしで、このようなデバイスの割り込みもサポートされています。

また、WDF_INTERRUPT_CONFIG では、ドライバーは、次のドライバー提供のイベント コールバック関数へのポインターを提供します。

EvtInterruptEnable
ハードウェア割り込みを有効にします。

EvtInterruptDisable
ハードウェア割り込みを無効にします。

EvtInterruptIsr
割り込みの割り込みサービス ルーチン (ISR)。

EvtInterruptDpc
割り込みの遅延プロシージャ呼び出し (DPC)。

EvtInterruptWorkItem
パッシブレベル割り込みの作業項目。

Windows 8 以降のバージョンのオペレーティング システムでフレームワーク バージョン 1.11 以降を使用するドライバーの場合、ドライバーはフレームワーク割り込みオブジェクト (DIRQL またはパッシブ) の親を、フレームワーク デバイス オブジェクトまたはフレームワーク キュー オブジェクトに明示的に設定できます。 ドライバーが親を指定する場合、ドライバーは割り込みオブジェクトの WDF_INTERRUPT_CONFIG 構造体の AutomaticSerialization メンバーを TRUE に設定する必要があります。 (AutomaticSerialization が TRUE の場合、フレームワークは割り込みオブジェクトの EvtInterruptDpc または EvtInterruptWorkItem コールバック関数の実行を、割り込みの親オブジェクトの下にある他のオブジェクトからのコールバック関数と同期することを思い出してください。)

たとえば、ドライバーは割り込みの親としてキューを指定し、割り込みの EvtInterruptDpc または EvtInterruptWorkItem コールバックとキューのコールバックを同期します。 この構成では、フレームワークは、デバイス オブジェクトを削除するときにキュー オブジェクトを削除します。

WdfInterruptCreate を呼び出した後、ドライバーは必要に応じて WdfInterruptSetPolicy または WdfInterruptSetExtendedPolicy を呼び出して、追加の割り込みパラメーターを指定できます。 通常、ドライバーは、EvtDriverDeviceAdd コールバック関数からこれらのメソッドを呼び出します。

フレームワークは、割り込みの親を削除する前に割り込みを自動的に削除します。 必要に応じて、ドライバーは WdfObjectDelete を呼び出して、早い時点で割り込みを削除できます。

メッセージ シグナル割り込みのサポート

Windows Vista 以降では、メッセージシグナル割り込み (MSI) がサポートされています。 オペレーティング システムがデバイスの MSI をサポートできるようにするには、ドライバーの INF ファイルでレジストリにいくつかの値を設定する必要があります。 これらの値を設定する方法については、「レジストリでメッセージシグナル割り込みを有効にする」を参照してください。

ドライバーは、デバイスがサポートできる各割り込みベクターまたは MSI メッセージのフレームワーク割り込みオブジェクトを作成する必要があります。 PnP マネージャーが、デバイスがサポートできる割り込みリソースをすべてデバイスに許可しない場合、余分な割り込みオブジェクトは使用されず、そのコールバック関数は呼び出されません。

Windows 7 では、オペレーティング システムは、デバイス機能ごとに 910 を超える割り込みメッセージに対するリソース要求をサポートしていません。 Windows 8 では、オペレーティング システムは、デバイス機能ごとに 2048 を超える割り込みに対するリソース要求をサポートしていません。

デバイス ドライバーがこの制限を超えると、デバイスの起動に失敗する可能性があります。 多数の論理プロセッサを含むコンピューターで動作するには、ドライバーはプロセッサごとに複数の割り込みを要求しないでください。

ドライバーは、障害なく、PnP マネージャーがリソース要件の一覧から代替割り込みリソースのセットをデバイスに割り当てる、割り込みリソースのシステム再調整を許容する必要があります。 たとえばデバイスには、デバイスが要求したよりも少ない数のメッセージ割り込みが割り当てられている可能性があります。 最悪の場合、ドライバーは、1 つのラインベースの割り込みだけでデバイスを操作する準備をする必要があります。