IoConnectInterruptEx の CONNECT_LINE_BASED バージョンの使用
Windows Vista 以降のオペレーティング システムの場合、ドライバーは IoConnectInterruptEx の CONNECT_LINE_BASED バージョンを使用して、ドライバーのライン ベースの割り込みの InterruptService ルーチンを登録できます。 (以前のオペレーティング システムのドライバーは、IoConnectInterruptEx の CONNECT_FULLY_SPECIFIED バージョンを使用できます。)
注 この方法は、すべてのライン ベースの割り込みに対して 1 つの割り込みサービス ルーチン (ISR) を登録するドライバーにのみ使用できます。 ドライバーは、複数の割り込みを受信できる場合は、IoConnectInterruptEx のCONNECT_FULLY_SPECIFIEDバージョンを使用する必要があります。
ドライバーは、 Parameters->バージョン のCONNECT_LINE_BASED の値を指定し、他の Parameters->LineBased のメンバーを使用して、操作の他のパラメーターを指定します。
Parameters->LineBased.PhysicalDeviceObject は、ISR がサービスするデバイスの物理デバイス オブジェクト (PDO) を指定します。 システムは、デバイス オブジェクトを使用して、デバイスのラインベースの割り込みを自動的に識別します。
Parameters->LineBased.ServiceRoutine は InterruptService ルーチンを指し、Parameters->LineBased.ServiceContext はシステムが InterruptService に ServiceContext パラメーターとして渡す値を指定します。 ドライバーは、これを使用してコンテキスト情報を渡すことができます。 コンテキスト情報の受け渡しの詳細については、「 ISR コンテキスト情報の提供」を参照してください。
ドライバーは、Parameters->LineBased.InterruptObject の PKINTERRUPT 変数へのポインターを提供します。 IoConnectInterruptEx ルーチンは、ISR を削除するときに使用できる割り込みオブジェクトを指すこの変数を、設定します。 詳細については、「 ISR の削除」に関するページをご覧ください。
ドライバーは必要に応じて Parameters->LineBased.SpinLock でシステムが ISR と同期する際に使用するスピンロックを指定することができます。 ほとんどのドライバーは、ドライバーの代わりにスピン ロックを割り当てるシステムを有効にする NULL を指定できます。 ISR との同期の詳細については、「 デバイス データへのアクセスの同期」を参照してください。
次のコード例は、CONNECT_LINE__BASED を使用して InterruptService ルーチンを登録する方法を示しています。
IO_CONNECT_INTERRUPT_PARAMETERS params;
// deviceExtension is a pointer to the driver's device extension.
// deviceExtension->IntObj is a PKINTERRUPT.
// deviceInterruptService is a pointer to the driver's InterruptService 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_LINE_BASED;
params.LineBased.PhysicalDeviceObject = PhysicalDeviceObject;
params.LineBased.InterruptObject = &deviceExtension->IntObj;
params.LineBased.ServiceRoutine = deviceInterruptService;
params.LineBased.ServiceContext = ServiceContext;
params.LineBased.SpinLock = NULL;
params.LineBased.SynchronizeIrql = 0;
params.LineBased.FloatingSave = FALSE;
status = IoConnectInterruptEx(¶ms);
if (!NT_SUCCESS(status)) {
// Operation failed. Handle error.
...
}