为中断提供服务
本主题介绍如何为 DIRQL 中断提供服务。 有关为被动级别中断提供服务的信息,请参阅 支持被动级别中断。
维护中断包括两个步骤,有时还有三个步骤:
在 IRQL = DIRQL 运行的中断服务例程中,快速保存易失性信息) (,例如注册内容。
处理延迟过程调用中保存的易失性信息, (在 IRQL = DISPATCH_LEVEL 运行的 DPC) 。
如有必要,请在 IRQL = PASSIVE_LEVEL 执行其他工作。
当设备生成硬件中断时,框架 (ISR) 调用驱动程序的中断服务例程,基于框架的驱动程序将其作为 EvtInterruptIsr 回调函数实现。
在设备的 DIRQL 上运行的 EvtInterruptIsr 回调函数必须快速保存中断信息(如寄存器内容),这些信息在发生另一个中断时会丢失。
通常, EvtInterruptIsr 回调函数计划延迟的过程调用 (DPC) 稍后在较低的 IRQL (DISPATCH_LEVEL) 处理保存的信息。 基于框架的驱动程序将 DPC 例程实现为 EvtInterruptDpc 或 EvtDpcFunc 回调函数。
大多数驱动程序对每种中断类型使用单个 EvtInterruptDpc 回调函数。 若要计划执行 EvtInterruptDpc 回调函数,驱动程序必须从 EvtInterruptIsr 回调函数中调用 WdfInterruptQueueDpcForIsr。
如果驱动程序为每个设备创建多个 框架队列对象 ,则可以考虑为每个队列使用单独的 DPC 对象 和 EvtDpcFunc 回调函数。 若要计划 执行 EvtDpcFunc 回调函数,驱动程序必须首先通过调用 WdfDpcCreate(通常在驱动程序的 EvtDriverDeviceAdd 回调函数中)创建一个或多个 DPC 对象。 然后,驱动程序的 EvtInterruptIsr 回调函数可以调用 WdfDpcEnqueue。
驱动程序通常在其 EvtInterruptDpc 或 EvtDpcFunc 回调函数中完成 I/O 请求。
有时,驱动程序必须在 IRQL = PASSIVE_LEVEL 执行一些中断服务操作。 在这种情况下,驱动程序的 EvtInterruptDpc 或 EvtDpcFunc 回调函数(以 IRQL = DISPATCH_LEVEL 执行)可以计划执行一个或多个 框架工作项,这些工作项在 IRQL = PASSIVE_LEVEL 运行。
有关在维护设备中断时使用工作项的驱动程序示例,请参阅 PCIDRV 示例驱动程序。