[适用于 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 外围设备的函数驱动程序从 ISR 内部将 I/O 发送到其总线,并保留被动级中断锁。
- 总线驱动程序在收到上述请求的同一线程中完成第二个请求。
- 第二个请求的完成例程将请求发送到外围驱动程序。
- 外围驱动程序的 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) |