次の方法で共有


KSERVICE_ROUTINE コールバック関数 (wdm.h)

InterruptService ルーチン (ISR) は、デバイスの割り込みを迅速に処理し、必要に応じて、受信したデータの割り込み後処理をスケジュールします。

構文

KSERVICE_ROUTINE KserviceRoutine;

BOOLEAN KserviceRoutine(
  [in] _KINTERRUPT *Interrupt,
  [in] PVOID ServiceContext
)
{...}

パラメーター

[in] Interrupt

割り込みの KINTERRUPT 構造体への呼び出し元指定のポインター。

[in] ServiceContext

IoConnectInterrupt または IoConnectInterruptEx の以前の呼び出しで指定された、呼び出し元から提供されたコンテキスト情報へのポインター。

戻り値

割り込みがドライバーのデバイスの 1 つから取得されなかったとルーチンが判断した場合は、 FALSE を返す必要があります。 それ以外の場合、ルーチンは割り込みを処理し、 TRUE を返す必要があります。

注釈

特定の割り込みベクターとプロセッサ アフィニティに ISR を登録するには、ドライバーが IoConnectInterrupt または IoConnectInterruptEx を呼び出す必要があります。

ドライバーの InterruptService ルーチン (ISR) は、IoConnectInterrupt への SynchronizeIrql パラメーターで指定されたシステム割り当て DIRQL で割り込みコンテキストで実行されます。 (DIRQL 値が大きい他のデバイスでは、ISR が中断される可能性があります)。

システムが ISR を呼び出す前に、割り込みのスピン ロック (IoConnectInterrupt への SpinLock パラメーター) を取得するため、ISR は別のプロセッサで同時に実行できません。 ISR が戻った後、システムはスピン ロックを解放します。

ISR は、 まず、コンテキストによって提供されるコンテキスト情報を調べることによって、ドライバーのデバイスの 1 つから割り込みが発生したかどうかを判断する必要があります。 割り込みがドライバーのデバイスの 1 つからでない場合は、I/O マネージャーが同じプロセッサと割り込みベクトルの ISR を登録している他のドライバーを呼び出すことができるように、ルーチンはすぐに FALSE を 返す必要があります。

ISR の実装の詳細については、「 割り込みサービス ルーチン」を参照してください。

InterruptService コールバック ルーチンを定義するには、まず、定義するコールバック ルーチンの種類を識別する関数宣言を指定する必要があります。 Windows には、ドライバーのコールバック関数の種類のセットが用意されています。 コールバック関数の種類を使用して関数を宣言すると、ドライバー、静的ドライバー検証ツール (SDV)、およびその他の検証ツールのコード分析でエラーが検出され、Windows オペレーティング システム用のドライバーを記述するための要件になります。

たとえば、 という名前MyInterruptServiceInterruptService コールバック ルーチンを定義するには、次のコード例に示すように、KSERVICE_ROUTINE型を使用します。

KSERVICE_ROUTINE MyInterruptService;

次に、コールバック ルーチンを次のように実装します。

_Use_decl_annotations_
BOOLEAN
  MyInterruptService(
    struct _KINTERRUPT  *Interrupt,
    PVOID  ServiceContext
    )
  {
      // Function body
  }

KSERVICE_ROUTINE関数の種類は、Wdm.h ヘッダー ファイルで定義されます。 コード分析ツールを実行するときにエラーをより正確に識別するには、必ず注釈を _Use_decl_annotations_ 関数定義に追加してください。 注釈を _Use_decl_annotations_ 使用すると、ヘッダー ファイル内のKSERVICE_ROUTINE関数型に適用される注釈が確実に使用されます。 関数宣言の要件の詳細については、「 WDM ドライバーの関数ロール型を使用して関数を宣言する」を参照してください。 の詳細 _Use_decl_annotations_については、「 関数の動作に注釈を付ける」を参照してください。

要件

要件
対象プラットフォーム デスクトップ
Header wdm.h (Wdm.h、Ntddk.h、Ntifs.h を含む)
IRQL DIRQL で呼び出されます (「解説」セクションを参照)。