维护中断 (UMDF 1)
警告
UMDF 2 是 UMDF 的最新版本,取代了 UMDF 1。 所有新的 UMDF 驱动程序都应使用 UMDF 2 编写。 不会向 UMDF 1 添加任何新功能,并且较新版本的 Windows 10 上对 UMDF 1 的支持有限。 通用 Windows 驱动程序必须使用 UMDF 2。
存档的 UMDF 1 示例可在 Windows 11 版本 22H2 - 2022 年 5 月驱动程序示例更新中找到。
有关详细信息,请参阅使用 UMDF 入门。
维护中断由两个步骤组成:
- 在中断服务例程中,) 快速保存易失性信息 (注册内容。
- 处理工作项例程中保存的易失性信息。
当设备生成硬件中断时,框架将调用驱动程序的中断服务例程 (ISR) ,基于框架的驱动程序实现该例程作为 OnInterruptIsr 回调函数实现。
在PASSIVE_LEVEL运行的 OnInterruptIsr 回调函数必须快速保存中断信息(例如注册内容),将工作项排队以进一步处理数据,并在共享中断行时从 ISR 返回以允许为其他中断提供服务。 由于 UMDF 驱动程序的 ISR 在PASSIVE_LEVEL运行,因此不建议处理基于 PCI 行的中断。 这些中断通常在多个设备之间共享,其中一些设备可能不接受 ISR 延迟。 但是,可以在 UMDF 驱动程序中处理 PCI MSI 中断。 这些中断具有边缘语义,不共享。
通常, OnInterruptIsr 回调函数计划一个工作项,以便稍后处理保存的信息。 基于框架的驱动程序将 workitem 例程作为 OnInterruptWorkItem 回调函数实现。
大多数驱动程序对每种中断类型使用单个 OnInterruptWorkItem 回调函数。 若要计划 OnInterruptWorkItem 回调函数的执行,驱动程序必须从 OnInterruptIsr 回调函数内部调用 IWDFInterrupt::QueueWorkItemForIsr。
如果驱动程序为每个设备创建多个框架队列对象,则可以考虑为每个队列使用单独的 workitem 对象和 OnWorkItem 回调函数。 若要计划 OnWorkItem 回调函数的执行,驱动程序必须先通过调用 IWdfDevice3::CreateWorkItem(通常从驱动程序的 IDriverEntry::OnDeviceAdd 回调函数)创建一个或多个 workitem 对象。 然后,驱动程序的 OnInterruptIsr 回调函数可以调用 IWDFWorkItem::Enqueue。
驱动程序通常在其 OnInterruptWorkItem 或 OnWorkItem 回调函数中完成 I/O 请求。
有关处理中断的 UMDF 驱动程序的示例,请参阅从 WDK Windows 8开始提供的 SpbAccelerometer 示例驱动程序。