(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 在调用 OnInterruptIsrOnInterruptDisableOnInterruptEnable 回调之前获取中断锁。

如果驱动程序需要使用中断锁同步任何代码,它将调用 IWDFInterrupt::AcquireInterruptLockIWDFInterrupt::ReleaseInterruptLock。 例如,驱动程序使用这些方法在其 OnInterruptWorkItem 回调例程中获取并释放中断锁。 但是,在 I/O 调度回调 ((如 OnReadOnWrite) )中,驱动程序首先调用 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 使用回调锁而不是按中断的对象锁。