IoConnectInterruptEx の CONNECT_MESSAGE_BASED バージョンの使用
Windows Vista 以降のオペレーティング システムの場合、ドライバーは IoConnectInterruptEx のCONNECT_MESSAGE_BASED バージョンを使用して、ドライバーのメッセージシグナル割り込みの ISR を登録できます。 ドライバーは、 Parameters->バージョン のCONNECT_MESSAGE_BASED の値を指定し、他の Parameters->MessageBased のメンバーを使用して、操作の他のパラメーター指定します。
Parameters->MessageBased.PhysicalDeviceObject は、ISRがサービスするデバイスのPDOを指定します。 システムは、デバイス オブジェクトを使用して、デバイスのメッセージ シグナル割り込みを自動的に識別します。
Parameters->MessageBased.MessageServiceRoutine は InterruptMessageService ルーチンを指し、一方 Parameters->MessageBased.ServiceContext はシステムが ServiceContext パラメーターとして InterruptMessageServiceに渡す値を指定します。 ドライバーは、これを使用してコンテキスト情報を渡すことができます。 コンテキスト情報の受け渡しの詳細については、「 ISR コンテキスト情報の提供」を参照してください。
ドライバーは InterruptMessageService ルーチンを Parameters->MessageBased.FallBackServiceRoutineで指定することもできます。 デバイスに行ベースの割り込みがあり、メッセージ通知割り込みがない場合、システムは代わりに、行ベースの割り込みを処理するために InterruptMessageService ルーチンを登録します。 この場合、システムは、 Parameters->MessageBased.ServiceContext を ServiceContext パラメーターとして InterruptServiceに渡します。 IoConnectInterruptEx は、フォールバック ルーチンを登録した場合に Parameters->Version を CONNECT_LINE_BASED に更新します。
Parameters->MessageBased.ConnectionContext は、 IO_INTERRUPT_MESSAGE_INFO ( InterruptMessageServiceの場合) 構造体、または KINTERRUPT 構造体 ( InterruptServiceの場合)のいずれかの構造体へのポインタを受け取る変数を指します。 ドライバーは、受信したポインターを使用して ISR を削除できます。 詳細については、「 ISR の削除」に関するページをご覧ください。
ドライバーは必要に応じて Parameters->MessageBased.SpinLock でシステムが ISR と同期する際に使用するスピンロックを指定することができます。 ほとんどのドライバーは、ドライバーの代わりにスピン ロックを割り当てるシステムを有効にする NULL を指定できます。 ISR との同期の詳細については、「 デバイス データへのアクセスの同期」を参照してください。
次のコード例では、CONNECT_MESSAGE_BA Standard Edition D を使用して IntptMessageService ルーチンを登録する方法を示します。
IO_CONNECT_INTERRUPT_PARAMETERS params;
// deviceExtension is a pointer to the driver's device extension.
// deviceExtension->IntInfo is a PVOID.
// deviceExtension->IntType is a ULONG.
// deviceInterruptService is a pointer to the driver's InterruptService routine.
// deviceInterruptMessageService is a pointer to the driver's InterruptMessageService routine.
// PhysicalDeviceObject is a pointer to the device's PDO.
// ServiceContext is a pointer to driver-specified context for the ISR.
RtlZeroMemory( ¶ms, sizeof(IO_CONNECT_INTERRUPT_PARAMETERS) );
params.Version = CONNECT_MESSAGE_BASED;
params.MessageBased.PhysicalDeviceObject = PhysicalDeviceObject;
params.MessageBased.MessageServiceRoutine = deviceInterruptMessageService;
params.MessageBased.ServiceContext = ServiceContext;
params.MessageBased.SpinLock = NULL;
params.MessageBased.SynchronizeIrql = 0;
params.MessageBased.FloatingSave = FALSE;
params.MessageBased.FallBackServiceRoutine = deviceInterruptService;
status = IoConnectInterruptEx(¶ms);
if (NT_SUCCESS(status)) {
// We record the type of ISR registered.
devExt->IsrType = params.Version;
} else {
// Operation failed. Handle error.
...
}