次の方法で共有


IoConnectInterruptEx の CONNECT_MESSAGE_BASED バージョンの使用

Windows Vista 以降のオペレーティング システムの場合、ドライバーは IoConnectInterruptEx のCONNECT_MESSAGE_BASED バージョンを使用して、ドライバーのメッセージシグナル割り込みの ISR を登録できます。 ドライバーは、 Parameters->バージョン のCONNECT_MESSAGE_BASED の値を指定し、他の Parameters->MessageBased のメンバーを使用して、操作の他のパラメーター指定します。

  • Parameters->MessageBased.PhysicalDeviceObject は、ISRがサービスするデバイスのPDOを指定します。 システムは、デバイス オブジェクトを使用して、デバイスのメッセージ シグナル割り込みを自動的に識別します。

  • Parameters->MessageBased.MessageServiceRoutineInterruptMessageService ルーチンを指し、一方 Parameters->MessageBased.ServiceContext はシステムが ServiceContext パラメーターとして InterruptMessageServiceに渡す値を指定します。 ドライバーは、これを使用してコンテキスト情報を渡すことができます。 コンテキスト情報の受け渡しの詳細については、「 ISR コンテキスト情報の提供」を参照してください。

  • ドライバーは InterruptMessageService ルーチンを Parameters->MessageBased.FallBackServiceRoutineで指定することもできます。 デバイスに行ベースの割り込みがあり、メッセージ通知割り込みがない場合、システムは代わりに、行ベースの割り込みを処理するために InterruptMessageService ルーチンを登録します。 この場合、システムは、 Parameters->MessageBased.ServiceContextServiceContext パラメーターとして 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( &params, 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(&params);

if (NT_SUCCESS(status)) {
    // We record the type of ISR registered.
    devExt->IsrType = params.Version;
} else {
    // Operation failed. Handle error.
    ...
}