KMESSAGE_SERVICE_ROUTINE コールバック関数 (wdm.h)
InterruptMessageService ルーチンは、メッセージシグナル割り込みを処理します。
構文
KMESSAGE_SERVICE_ROUTINE KmessageServiceRoutine;
BOOLEAN KmessageServiceRoutine(
[in] _KINTERRUPT *Interrupt,
[in] PVOID ServiceContext,
ULONG MessageID
)
{...}
パラメーター
[in] Interrupt
割り込みの KINTERRUPT 構造体へのポインター。 ドライバーは、ドライバーの InterruptMessageService ルーチンを登録した IoConnectInterruptEx ルーチンの呼び出しで、このポインターを受信しました。
[in] ServiceContext
InterruptMessageService ルーチンが登録されたときにドライバーが IoConnectInterruptEx に渡した ServiceContext 値。
MessageID
割り込みのメッセージ ID。 この値は、ドライバーのメッセージシグナル割り込みを記述するIO_INTERRUPT_MESSAGE_INFO構造体の MessageInfo メンバー配列内の割り込みのエントリのインデックスです。
戻り値
割り込みが InterruptMessageService ルーチンによって処理される場合、InterruptMessageService ルーチンは TRUE を返します。 それ以外の場合は、 FALSE を返します。
注釈
ドライバーは 、IoConnectInterruptEx を使用して 、メッセージシグナル割り込みを処理する InterruptMessageService ルーチンを登録します。 ドライバーは、その後、 IoDisconnectInterruptEx を呼び出してルーチンの登録を解除できます。 メッセージシグナル割り込みは、Windows Vista 以降でサポートされています。
システムは、ルーチンの 割り込みが 発生していない場合でも、InterruptMessageService ルーチンを呼び出すことができます。 たとえば、メッセージシグナル割り込みが共有されている場合、他のデバイスに属する割り込みに対して InterruptMessageService を呼び出すことができます。 ルーチンは、ServiceContext パラメーターの値が IoConnectInterruptEx に渡された値と一致するかどうかをチェックする必要があります。 値が一致する場合、 InterruptMessageService は割り込みを処理し 、TRUE を返します。 それ以外の場合、 InterruptMessageService は割り込みを処理せず、 FALSE を返します。
MSI (PCI 2.2) を使用するドライバーは、デバイスによって生成されたさまざまなメッセージを区別するために MessageID パラメーターを調べる必要があります。これらはすべて同じ割り込みリソース (したがって、同じ InterruptMessageService> コールバック) を共有するためです。
システムが短い時間間隔で複数の同一の割り込みを受け取った場合、 これらを InterruptMessageService の 1 回の呼び出しに結合できることに注意してください。 ルーチンは、1 回の呼び出し内で複数の同一の割り込みを処理するように記述する必要があります。
メッセージシグナル割り込みは、エッジによってトリガーされる割り込みの動作と似ています。 デバイスは割り込み要求を送信しますが、要求が受信されたハードウェア確認を受信しません。
InterruptMessageService は、ルーチンが処理するすべての割り込みの最大デバイス IRQL (DIRQL) 以上の IRQL で実行されます。
例
InterruptMessageService コールバック ルーチンを定義するには、まず、定義するコールバック ルーチンの種類を識別する関数宣言を指定する必要があります。 Windows には、ドライバーのコールバック関数の種類のセットが用意されています。 コールバック関数の種類を使用して関数を宣言すると、ドライバー、静的ドライバー検証ツール (SDV)、およびその他の検証ツールのコード分析でエラーが検出され、Windows オペレーティング システム用のドライバーを記述するための要件になります。
たとえば、 という名前MyInterruptMessageService
の InterruptMessageService コールバック ルーチンを定義するには、次のコード例に示すように、KMESSAGE_SERVICE_ROUTINE型を使用します。
KMESSAGE_SERVICE_ROUTINE MyInterruptMessageService;
次に、コールバック ルーチンを次のように実装します。
_Use_decl_annotations_
BOOLEAN
MyInterruptMessageService(
struct _KINTERRUPT *Interrupt,
PVOID ServiceContext,
ULONG MessageId
)
{
// Function body
}
KMESSAGE_SERVICE_ROUTINE関数の種類は、Wdm.h ヘッダー ファイルで定義されます。 コード分析ツールを実行するときにエラーをより正確に識別するには、必ず注釈を Use_decl_annotations
関数定義に追加してください。 注釈により Use_decl_annotations
、ヘッダー ファイル内のKMESSAGE_SERVICE_ROUTINE関数型に適用される注釈が確実に使用されます。 関数宣言の要件の詳細については、「 WDM ドライバーの関数ロール型を使用して関数を宣言する」を参照してください。 の詳細 Use_decl_annotations
については、「 関数の動作に注釈を付ける」を参照してください。
要件
要件 | 値 |
---|---|
サポートされている最小のクライアント | 「解説」を参照してください。 |
対象プラットフォーム | デスクトップ |
Header | wdm.h (Wdm.h、Ntddk.h、Ntifs.h を含む) |
IRQL | 「解説」を参照してください。 |