为中断提供服务

本主题介绍如何为 DIRQL 中断提供服务。 有关为被动级别中断提供服务的信息,请参阅 支持被动级别中断

维护中断包括两个步骤,有时还有三个步骤:

  1. 在 IRQL = DIRQL 运行的中断服务例程中,快速保存易失性信息) (,例如注册内容。

  2. 处理延迟过程调用中保存的易失性信息, (在 IRQL = DISPATCH_LEVEL 运行的 DPC) 。

  3. 如有必要,请在 IRQL = PASSIVE_LEVEL 执行其他工作。

当设备生成硬件中断时,框架 (ISR) 调用驱动程序的中断服务例程,基于框架的驱动程序将其作为 EvtInterruptIsr 回调函数实现。

在设备的 DIRQL 上运行的 EvtInterruptIsr 回调函数必须快速保存中断信息(如寄存器内容),这些信息在发生另一个中断时会丢失。

通常, EvtInterruptIsr 回调函数计划延迟的过程调用 (DPC) 稍后在较低的 IRQL (DISPATCH_LEVEL) 处理保存的信息。 基于框架的驱动程序将 DPC 例程实现为 EvtInterruptDpcEvtDpcFunc 回调函数。

大多数驱动程序对每种中断类型使用单个 EvtInterruptDpc 回调函数。 若要计划执行 EvtInterruptDpc 回调函数,驱动程序必须从 EvtInterruptIsr 回调函数中调用 WdfInterruptQueueDpcForIsr

如果驱动程序为每个设备创建多个 框架队列对象 ,则可以考虑为每个队列使用单独的 DPC 对象EvtDpcFunc 回调函数。 若要计划 执行 EvtDpcFunc 回调函数,驱动程序必须首先通过调用 WdfDpcCreate(通常在驱动程序的 EvtDriverDeviceAdd 回调函数中)创建一个或多个 DPC 对象。 然后,驱动程序的 EvtInterruptIsr 回调函数可以调用 WdfDpcEnqueue

驱动程序通常在其 EvtInterruptDpcEvtDpcFunc 回调函数中完成 I/O 请求

有时,驱动程序必须在 IRQL = PASSIVE_LEVEL 执行一些中断服务操作。 在这种情况下,驱动程序的 EvtInterruptDpcEvtDpcFunc 回调函数(以 IRQL = DISPATCH_LEVEL 执行)可以计划执行一个或多个 框架工作项,这些工作项在 IRQL = PASSIVE_LEVEL 运行。

有关在维护设备中断时使用工作项的驱动程序示例,请参阅 PCIDRV 示例驱动程序。