删除系统分配的计时器对象

从 Windows 8.1 开始,ExDeleteTimer 例程将删除由 ExAllocateTimer 例程创建的计时器对象。 此计时器对象是系统分配 的EX_TIMER 结构,其成员对驱动程序不透明。 在删除计时器对象之前, ExDeleteTimer 将禁用该对象的进一步计时器操作,并取消或完成对可能正在进行的对象的任何挂起操作。

驱动程序调用 ExDeleteTimer 后,此例程会执行几个步骤,以确保它可以安全地删除计时器对象。 首先, ExDeleteTimer 将计时器对象标记为禁用,以防止驱动程序启动使用该对象的新计时器操作。 禁用计时器对象后,对 ExSetTimerExCancelTimer 例程的调用会立即返回 FALSE ,并且不执行任何操作。 此外,对 ExDeleteTimer 的第二次调用将返回 FALSE ,并且不执行任何操作。

接下来, ExDeleteTimer 检查计时器是否在对 ExDeleteTimer 的上一次调用中挂起。 禁用计时器对象不会取消在禁用该对象之前设置的计时器。 在以下两种情况下,以前设置的计时器可能会在禁用计时器对象后过期:

  • 计时器是定期的。
  • 计时器是一次性 (或非长期) ,尚未过期。

禁用计时器对象后,定期计时器永远不会过期多次。

如果驱动程序实现 ExTimerCallback 回调例程,则确保此例程的 Timer 参数始终是指向计时器对象的有效指针, (EX_TIMER 结构) ,即使计时器在禁用计时器对象后过期也是如此。

如果没有计时器处于挂起状态, ExDeleteTimer 将删除计时器对象并返回而不等待。

如果在调用 ExDeleteTimer 时计时器处于挂起状态,则驱动程序提供给此例程的 CancelWait 参数值将控制例程的行为。 Cancel 参数指示 ExDeleteTimer 是否尝试取消挂起的计时器。 Wait 参数指示 ExDeleteTimer 是否等待返回,直到删除计时器对象。

如果 Cancel (在这种情况下等待 必须为 FALSE) 并且计时器处于挂起状态, 则 ExDeleteTimer 允许计时器在计时器对象被删除之前过期。 在这种情况下, ExDeleteTimer 将标记计时器对象,以指示在挂起的计时器 (过期后将其删除,并且对 ExTimerCallback 例程的任何最后一次回调) 完成。 然后 ,ExDeleteTimer 返回,而无需等待计时器完成过期或删除对象。

如果 CancelTRUE则 ExDeleteTimer 会尝试在挂起的计时器过期之前取消该计时器。 ExDeleteTimer 如果成功取消计时器,则返回 TRUE 。 如果 ExDeleteTimer 无法取消计时器,则返回 FALSE,这种情况适用于已过期或正在过期的一次性计时器。 如果在 ExDeleteTimer 调用之前取消了 (一次性或定期) 计时器,或者从未设置计时器,ExDeleteTimer 也会返回 FALSE

如果 CancelTRUEWaitFALSE则 ExDeleteTimer 永远不会阻止调用线程。 如果无法立即删除计时器对象, ExDeleteTimer 将标记计时器对象,以指示将在挂起的计时器过期后将其删除,并立即返回 ,而不会等待计时器过期或对象被删除。

如果 CancelWait 都为 TRUE,则如果无法立即删除计时器对象, 则 ExDeleteTimer 会阻止调用线程。 ExDeleteTimer 会在必要时等待计时器完成过期,并等待驱动程序实现的 ExTimerCallback 例程的任何回调完成。 接下来,如果驱动程序实现此例程, ExDeleteTimer 将删除计时器对象并调用 ExTimerDeleteCallback 例程。 最后, ExDeleteTimer 返回。

驱动程序可以从驱动程序的 ExTimerCallback 例程调用 ExDeleteTimer,该例程在 IRQL = DISPATCH_LEVEL 运行,但驱动程序必须在此调用中将 Wait 参数设置为 FALSE

作为一个选项,驱动程序可以实现在删除计时器对象后运行的 ExTimerDeleteCallback 回调例程。 通常, ExTimerDeleteCallback 例程释放驱动程序分配用于计时器对象的任何系统资源。

ExDeleteTimer 计划驱动程序实现的 ExTimerDeleteCallback 例程在计时器对象被删除后运行,此时指向此对象的指针不再有效。 如果在 ExDeleteTimer 调用中 Wait 参数为 TRUE,则 ExTimerDeleteCallback 例程的回调将在 ExDeleteTimer 返回之前完成。 如果 WaitFALSE则 ExTimerDeleteCallback 例程可能会在 ExDeleteTimer 返回之前或之后运行。

有关详细信息,请参阅 ExXxx计时器例程和EX_TIMER对象