使用 IoConnectInterruptEx 的 CONNECT_LINE_BASED 版本

对于 Windows Vista 和更高版本的操作系统,驱动程序可以使用 ioConnectInterruptEx CONNECT_LINE_BASED 版本为驱动程序的基于行的中断注册 InterruptService 例程。 (适用于早期操作系统的驱动程序可以使用 ioConnectInterruptEx.CONNECT_FULLY_SPECIFIED 版)

注意 只能将此方法用于为所有基于行的中断注册单个中断服务例程的驱动程序, (ISR) 。 如果驱动程序可以接收多个中断,则必须使用 ioConnectInterruptEx CONNECT_FULLY_SPECIFIED 版本。

驱动程序将 Parameters-Version> 的值指定为 CONNECT_LINE_BASED,并使用Parameters-LineBased> 的成员来指定操作的其他参数:

  • Parameters-LineBased.PhysicalDeviceObject 为 ISR 服务的设备指定物理设备对象 (PDO) 。> 系统使用设备对象自动识别设备的基于线路的中断。

  • Parameters-LineBased.ServiceRoutine> 指向 InterruptService 例程,而 Parameters-LineBased>。ServiceContext 指定系统作为 ServiceContext 参数传递给 InterruptService 的值。 驱动程序可以使用此来传递上下文信息。 有关传递上下文信息的详细信息,请参阅 提供 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( &params, 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(&params);

if (!NT_SUCCESS(status)) {
    // Operation failed. Handle error.
    ...
}