启用和禁用中断
如果驱动程序处理设备中断,则必须提供启用和禁用中断的 EvtInterruptEnable 和 EvtInterruptDisable 回调函数。 通常,这些回调函数在设备的 DIRQL 上运行,并且必须执行任何必要的操作来启用和禁用设备的中断机制。 对于 被动级中断,这些回调函数以 IRQL = PASSIVE_LEVEL运行,同时持有被动级中断锁。
如果驱动程序必须执行与启用或禁用中断相关的其他操作,并且无法在 IRQL = DIRQL 下执行这些附加操作,则驱动程序还可以提供 EvtDeviceD0EntryPostInterruptsEnabled 和 EvtDeviceD0ExitPreInterruptsDisabled 回调函数。 这两个回调函数在 IRQL = PASSIVE_LEVEL运行,没有保留中断锁,并且可以调用 IRQL = DIRQL 中不可用的框架对象方法。
每次设备进入其工作 (D0) 状态时,框架都会调用驱动程序的 EvtInterruptEnable 和 EvtDeviceD0EntryPostInterruptsEnabled 回调函数,然后框架调用驱动程序的 EvtDeviceD0Entry 回调函数。
每次设备离开工作状态时,框架都会调用驱动程序的 EvtDeviceD0ExitPreInterruptsDisabled 和 EvtInterruptDisable 回调函数,然后框架调用驱动程序的 EvtDeviceD0Exit 回调函数。 有关框架何时调用驱动程序的回调函数的详细信息,请参阅 PnP 和电源管理方案。
不得假定每次框架调用驱动程序的 EvtInterruptEnable 回调函数时,设备都将使用相同的中断资源。 有时,PnP 管理器 会重新分发系统资源,并且可能会将新的中断资源分配给设备。
驱动程序可以调用 WdfInterruptGetInfo 来确定设备的中断资源。 驱动程序可以调用 WdfInterruptGetDevice 来确定中断对象所属的设备。 (几个驱动程序可能会调用 WdfInterruptWdmGetInterrupt.)
若要直接启用和禁用中断,驱动程序可以调用中断对象的 WdfInterruptEnable 和 WdfInterruptDisable 方法,这些方法调用驱动程序的 EvtInterruptEnable 和 EvtInterruptDisable 事件回调函数。 但是,大多数驱动程序应只允许框架在正确的时间调用 EvtInterruptEnable 和 EvtInterruptDisable 回调函数。