WdfInterruptAcquireLock 函数 (wdfinterrupt.h)
[适用于 KMDF 和 UMDF]
WdfInterruptAcquireLock 方法开始一个代码序列,该代码序列在持有中断对象的旋转锁的同时, (DIRQL) 的设备中断请求级别执行。
对于被动级别中断对象, 方法开始一个代码序列,该序列在被动级别执行,同时持有中断对象的被动锁。
语法
void WdfInterruptAcquireLock(
[in] WDFINTERRUPT Interrupt
);
参数
[in] Interrupt
框架中断对象的句柄。
注解
如果驱动程序提供无效的对象句柄,则会发生 bug 检查。
当驱动程序对 DIRQL 中断对象调用 WdfInterruptAcquireLock 时,系统会将处理器的 IRQL 提升到设备的 DIRQL,并获取驱动程序在中断对象的 WDF_INTERRUPT_CONFIG 结构中指定的旋转锁。 因此,中断对象的 EvtInterruptIsr 和 EvtInterruptSynchronize 回调函数 (,以及为同一中断对象) 调用 WdfInterruptAcquireLock 的任何其他代码都无法执行。
当驱动程序调用 WdfInterruptReleaseLock 时,系统将处理器的 IRQL 返回到其以前的级别并释放旋转锁。
当驱动程序在被动级别中断对象上调用 WdfInterruptAcquireLock 时,系统会获取该驱动程序在中断对象的WDF_INTERRUPT_CONFIG结构中配置的被动级别 中断 锁。
当驱动程序调用 WdfInterruptReleaseLock 时,系统会释放中断锁。
对于被动级别中断,驱动程序必须在 IRQL = PASSIVE_LEVEL 调用 WdfInterruptAcquireLock 。
不要从任意线程上下文(如请求处理程序)调用 WdfInterruptAcquireLock。
如果驱动程序必须执行几行代码而不被抢占,并且有效禁用了设备中断服务,则可以使用 WdfInterruptAcquireLock 和 WdfInterruptReleaseLock 。 对于较大的代码部分,驱动程序应提供 EvtInterruptSynchronize 回调函数。
在框架调用驱动程序的 EvtInterruptEnable 回调函数之前或框架调用驱动程序的 EvtInterruptDisable 回调函数之后,驱动程序无法调用 WdfInterruptAcquireLock。
在驱动程序调用 WdfInterruptAcquireLock 之后,在调用 WdfInterruptReleaseLock 之前,它不得为同一中断对象再次调用该方法。
有关 WdfInterruptAcquireLock 方法的详细信息,请参阅 同步中断代码。
有关在基于框架的驱动程序中处理中断的详细信息,请参阅 处理硬件中断。
对于被动级别中断对象,在任意线程(如队列对象回调函数)中运行时,驱动程序必须调用 WdfInterruptTryToAcquireLock 而不是 WdfInterruptAcquireLock。 例如,驱动程序可能从 EvtIoRead 调用 WdfInterruptTryToAcquireLock。
这样做可以避免死锁的可能性,如以下方案中所述。
- 为了确定其设备是否中断,SPB 外围设备的功能驱动程序将 I/O 从其 ISR 内部发送到其总线,并保留被动级中断锁。
- 总线驱动程序在收到上述请求的同一线程中完成第二个请求。
- 第二个请求的完成例程将请求发送到外围驱动程序。
- 外围驱动程序的 I/O 调度例程调用 WdfInterruptAcquireLock,后者随后会尝试获取中断对象的被动锁的死锁。
要求
要求 | 值 |
---|---|
目标平台 | 通用 |
最低 KMDF 版本 | 1.0 |
最低 UMDF 版本 | 2.0 |
标头 | wdfinterrupt.h (包括 Wdf.h) |
IRQL | <= DIRQL |
DDI 符合性规则 | DriverCreate (kmdf) 、 KmdfIrql (kmdf) 、 KmdfIrql2 (kmdf) 、 KmdfIrqlExplicit (kmdf) 、 WdfInterruptLock (kmdf) 、 WdfInterruptLockRelease (kmdf) |