次の方法で共有


IoConnectInterrupt 関数 (wdm.h)

IoConnectInterrupt ルーチンは、デバイス ドライバーの割り込みサービス ルーチン (ISR) を登録して、指定されたプロセッサセットのいずれかでデバイスが割り込むときに呼び出されるようにします。

構文

NTSTATUS IoConnectInterrupt(
  [out]          PKINTERRUPT       *InterruptObject,
  [in]           PKSERVICE_ROUTINE ServiceRoutine,
  [in, optional] PVOID             ServiceContext,
  [in, optional] PKSPIN_LOCK       SpinLock,
  [in]           ULONG             Vector,
  [in]           KIRQL             Irql,
  [in]           KIRQL             SynchronizeIrql,
  [in]           KINTERRUPT_MODE   InterruptMode,
  [in]           BOOLEAN           ShareVector,
  [in]           KAFFINITY         ProcessorEnableMask,
  [in]           BOOLEAN           FloatingSave
);

パラメーター

[out] InterruptObject

割り込みオブジェクトのセットへのポインターのドライバー提供の記憶域のアドレスへのポインター。 このポインターは、 後続の KeSynchronizeExecution の呼び出しで渡す必要があります。

[in] ServiceRoutine

ドライバーが提供する InterruptService ルーチンのエントリ ポイントへのポインター。

[in, optional] ServiceContext

割り込みサービス ルーチンが呼び出されたときに指定されるドライバーによって決定されたコンテキストへのポインター。 ServiceContext 領域は常駐メモリ内に存在する必要があります。ドライバーが作成したデバイス オブジェクトのデバイス拡張機能、ドライバーによって作成されたコントローラー オブジェクトのコントローラー拡張機能、またはデバイス ドライバーによって割り当てられた非ページ プール内に存在する必要があります。 詳細については、「 ISR コンテキスト情報の提供 」を参照してください。

[in, optional] SpinLock

ドライバーが記憶域を提供する初期化されたスピン ロックへのポインター。これは、他のドライバー ルーチンによって共有されるドライバーによって決定されたデータへのアクセスを同期するために使用されます。 ISR が複数のベクターを処理する場合、またはドライバーに複数の ISR がある場合は、このパラメーターが必要です。 それ以外の場合、ドライバーは割り込みスピン ロック用の記憶域を割り当てる必要はありません。入力ポインターは NULL です

[in] Vector

CM_PARTIAL_RESOURCE_DESCRIPTORの u.Interrupt.Vector メンバーで割り込みリソースに渡される割り込みベクトル指定します。

[in] Irql

CM_PARTIAL_RESOURCE_DESCRIPTORの u.Interrupt.Level メンバーで割り込み リソースに渡される DIRQL 指定します。

[in] SynchronizeIrql

ISR を実行する DIRQL を指定します。 ISR が複数の割り込みベクトルを処理する場合、またはドライバーに複数の ISR がある場合、この値は、各割り込みリソースの u.Interrupt.Level で渡される Irql 値の中で最も高い値である必要があります。 それ以外の場合、 IrqlSynchronizeIrql の値は同じです。

[in] InterruptMode

デバイスの割り込みが LevelSensitiveラッチかを指定します。

[in] ShareVector

割り込みベクトルが共有可能かどうかを指定します。

[in] ProcessorEnableMask

このプラットフォームでデバイス割り込みが発生する可能性があるプロセッサのセットを表す KAFFINITY 値を指定します。 この値は、 u.Interrupt.Affinity の割り込みリソースに渡されます。

[in] FloatingSave

ドライバーのデバイスの割り込み時に浮動小数点スタックを保存するかどうかを指定します。 x86 ベースおよび Itanium ベースのプラットフォームの場合、この値は FALSE に設定する必要があります。 浮動小数点と MMX の状態の保存の詳細については、「 WDM ドライバーでの浮動小数点または MMX の使用」を参照してください。

戻り値

IoConnectInterrupt は、次のいずれかの NTSTATUS 値を返すことができます。

STATUS_SUCCESS

STATUS_INVALID_PARAMETER: プロセッサが指定されませんでした。

STATUS_INSUFFICIENT_RESOURCES: 十分な非ページ プールが存在しません。

注釈

新しいドライバーでは、 使いやすい IoConnectInterruptEx ルーチンを使用する必要があります。 メッセージシグナル割り込み (MSI) をサポートするデバイスのドライバーでは、 IoConnectInterruptEx を使用する必要があります。

PnP ドライバーは、PnP IRP_MN_START_DEVICE要求を完了する前に、デバイスの起動の一部として IoConnectInterrupt を呼び出す必要があります。

ドライバーがIRP_MN_START_DEVICE要求を受け取ると、ドライバーは、それぞれ、IRP のIO_STACK_LOCATION構造体の Parameters.StartDevice.AllocatedResources および Parameters.StartDevice.AllocatedResourcesTranslated メンバーの生および翻訳されたハードウェア リソースを受け取ります。 割り込みを接続するために、ドライバーは AllocatedResourcesTranslated.List.PartialResourceList.PartialDescriptors[] のリソースを使用します。 ドライバーは、 CmResourceTypeInterrupt 型のリソースの部分記述子の配列をスキャンする必要があります。

ドライバーが SpinLock の記憶域を提供する場合は、割り込みスピン ロックを IoConnectInterrupt に渡す前に、KeInitializeSpinLock を呼び出す必要があります。

IoConnectInterrupt への正常な呼び出しから戻ると、ドライバーのデバイスで割り込みが有効になっている場合、または ShareVectorTRUE に設定されている場合、呼び出し元の ISR を呼び出すことができます。 ドライバーは、 IoConnectInterrupt が返されるまで割り込みを有効にすることはできません。

要件

要件
サポートされている最小のクライアント Windows 2000 以降で使用できます。
対象プラットフォーム ユニバーサル
Header wdm.h (Wdm.h、Ntddk.h、Ntifs.h を含む)
Library NtosKrnl.lib
[DLL] NtosKrnl.exe
IRQL PASSIVE_LEVEL
DDI コンプライアンス規則 HwStorPortProhibitedDDIs(storport), IrqlIoPassive2(wdm), PowerIrpDDis(wdm)

こちらもご覧ください

CM_PARTIAL_RESOURCE_DESCRIPTOR

IO_STACK_LOCATION

IoDisconnectInterrupt

KeInitializeSpinLock

KeSynchronizeExecution