(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 入门。
访问中断数据缓冲区的所有驱动程序代码都必须同步,以便一次只有一个例程访问数据。
可以使用手动中断锁定或自动回调序列化来同步中断代码。
手动中断锁定
UMDF 在调用 OnInterruptIsr、 OnInterruptDisable 或 OnInterruptEnable 回调之前获取中断锁。
如果驱动程序需要使用中断锁同步任何代码,它将调用 IWDFInterrupt::AcquireInterruptLock 和 IWDFInterrupt::ReleaseInterruptLock。 例如,驱动程序使用这些方法在其 OnInterruptWorkItem 回调例程中获取并释放中断锁。 但是,在 I/O 调度回调 ((如 OnRead 和 OnWrite) )中,驱动程序首先调用 IWDFInterrupt::TryToAcquireInterruptLock ,以决定是将工作项排队还是在同一线程中执行工作,以避免潜在的死锁。 有关可能由从任意线程上下文调用 IWDFInterrupt::AcquireInterruptLock 而导致的死锁方案示例,请参阅 IWDFInterrupt::AcquireInterruptLock 的“备注”部分。
如果 IWDFInterrupt::TryToAcquireInterruptLock 返回 TRUE,则表示驱动程序已在同一线程中获取中断锁。 在这种情况下,驱动程序执行需要该锁的工作,然后调用 ReleaseInterruptLock。 如果 IWDFInterrupt::TryToAcquireInterruptLock 返回 FALSE,则驱动程序会将工作项排队,并在其 OnWorkItem 回调中执行工作。 在这种情况下,工作项不得使用自动序列化。
使用自动序列化
UMDF 驱动程序可以通过调用 IWDFDeviceInitialize::SetLockingConstraint 请求自动回调同步,并将 LockType 参数设置为 WdfDeviceLevel。
然后,驱动程序在调用 CreateInterrupt 之前,将其WUDF_INTERRUPT_CONFIG结构的 AutomaticSerialization 成员设置为 TRUE。
因此,UMDF 使用 I/O 队列、请求取消和文件对象回调例程序列化驱动程序的 OnInterruptWorkItem 回调。 在此方案中,UMDF 使用回调锁而不是按中断的对象锁。