WdfInterruptAcquireLock 函数 (wdfinterrupt.h)

[适用于 KMDF 和 UMDF]

WdfInterruptAcquireLock 方法开始一个代码序列,该代码序列在持有中断对象的旋转锁的同时, (DIRQL) 的设备中断请求级别执行。

对于被动级别中断对象, 方法开始一个代码序列,该序列在被动级别执行,同时持有中断对象的被动锁。

语法

void WdfInterruptAcquireLock(
  [in] WDFINTERRUPT Interrupt
);

参数

[in] Interrupt

框架中断对象的句柄。

注解

如果驱动程序提供无效的对象句柄,则会发生 bug 检查。

当驱动程序对 DIRQL 中断对象调用 WdfInterruptAcquireLock 时,系统会将处理器的 IRQL 提升到设备的 DIRQL,并获取驱动程序在中断对象的 WDF_INTERRUPT_CONFIG 结构中指定的旋转锁。 因此,中断对象的 EvtInterruptIsrEvtInterruptSynchronize 回调函数 (,以及为同一中断对象) 调用 WdfInterruptAcquireLock 的任何其他代码都无法执行。

当驱动程序调用 WdfInterruptReleaseLock 时,系统将处理器的 IRQL 返回到其以前的级别并释放旋转锁。

当驱动程序在被动级别中断对象上调用 WdfInterruptAcquireLock 时,系统会获取该驱动程序在中断对象的WDF_INTERRUPT_CONFIG结构中配置的被动级别 中断 锁。

当驱动程序调用 WdfInterruptReleaseLock 时,系统会释放中断锁。

对于被动级别中断,驱动程序必须在 IRQL = PASSIVE_LEVEL 调用 WdfInterruptAcquireLock

不要从任意线程上下文(如请求处理程序)调用 WdfInterruptAcquireLock

如果驱动程序必须执行几行代码而不被抢占,并且有效禁用了设备中断服务,则可以使用 WdfInterruptAcquireLockWdfInterruptReleaseLock 。 对于较大的代码部分,驱动程序应提供 EvtInterruptSynchronize 回调函数。

在框架调用驱动程序的 EvtInterruptEnable 回调函数之前或框架调用驱动程序的 EvtInterruptDisable 回调函数之后,驱动程序无法调用 WdfInterruptAcquireLock

在驱动程序调用 WdfInterruptAcquireLock 之后,在调用 WdfInterruptReleaseLock 之前,它不得为同一中断对象再次调用该方法。

有关 WdfInterruptAcquireLock 方法的详细信息,请参阅 同步中断代码

有关在基于框架的驱动程序中处理中断的详细信息,请参阅 处理硬件中断

对于被动级别中断对象,在任意线程(如队列对象回调函数)中运行时,驱动程序必须调用 WdfInterruptTryToAcquireLock 而不是 WdfInterruptAcquireLock。 例如,驱动程序可能从 EvtIoRead 调用 WdfInterruptTryToAcquireLock

这样做可以避免死锁的可能性,如以下方案中所述。

  1. 为了确定其设备是否中断,SPB 外围设备的功能驱动程序将 I/O 从其 ISR 内部发送到其总线,并保留被动级中断锁。
  2. 总线驱动程序在收到上述请求的同一线程中完成第二个请求。
  3. 第二个请求的完成例程将请求发送到外围驱动程序。
  4. 外围驱动程序的 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)

另请参阅