删除系统分配的计时器对象
从 Windows 8.1 开始,ExDeleteTimer 例程将删除由 ExAllocateTimer 例程创建的计时器对象。 此计时器对象是系统分配 的EX_TIMER 结构,其成员对驱动程序不透明。 在删除计时器对象之前, ExDeleteTimer 将禁用该对象的进一步计时器操作,并取消或完成对可能正在进行的对象的任何挂起操作。
驱动程序调用 ExDeleteTimer 后,此例程会执行几个步骤,以确保它可以安全地删除计时器对象。 首先, ExDeleteTimer 将计时器对象标记为禁用,以防止驱动程序启动使用该对象的新计时器操作。 禁用计时器对象后,对 ExSetTimer 或 ExCancelTimer 例程的调用会立即返回 FALSE ,并且不执行任何操作。 此外,对 ExDeleteTimer 的第二次调用将返回 FALSE ,并且不执行任何操作。
接下来, ExDeleteTimer 检查计时器是否在对 ExDeleteTimer 的上一次调用中挂起。 禁用计时器对象不会取消在禁用该对象之前设置的计时器。 在以下两种情况下,以前设置的计时器可能会在禁用计时器对象后过期:
- 计时器是定期的。
- 计时器是一次性 (或非长期) ,尚未过期。
禁用计时器对象后,定期计时器永远不会过期多次。
如果驱动程序实现 ExTimerCallback 回调例程,则确保此例程的 Timer 参数始终是指向计时器对象的有效指针, (EX_TIMER 结构) ,即使计时器在禁用计时器对象后过期也是如此。
如果没有计时器处于挂起状态, ExDeleteTimer 将删除计时器对象并返回而不等待。
如果在调用 ExDeleteTimer 时计时器处于挂起状态,则驱动程序提供给此例程的 Cancel 和 Wait 参数值将控制例程的行为。 Cancel 参数指示 ExDeleteTimer 是否尝试取消挂起的计时器。 Wait 参数指示 ExDeleteTimer 是否等待返回,直到删除计时器对象。
如果 Cancel (在这种情况下 , 等待 必须为 FALSE) 并且计时器处于挂起状态, 则 ExDeleteTimer 允许计时器在计时器对象被删除之前过期。 在这种情况下, ExDeleteTimer 将标记计时器对象,以指示在挂起的计时器 (过期后将其删除,并且对 ExTimerCallback 例程的任何最后一次回调) 完成。 然后 ,ExDeleteTimer 返回,而无需等待计时器完成过期或删除对象。
如果 Cancel 为 TRUE, 则 ExDeleteTimer 会尝试在挂起的计时器过期之前取消该计时器。 ExDeleteTimer 如果成功取消计时器,则返回 TRUE 。 如果 ExDeleteTimer 无法取消计时器,则返回 FALSE,这种情况适用于已过期或正在过期的一次性计时器。 如果在 ExDeleteTimer 调用之前取消了 (一次性或定期) 计时器,或者从未设置计时器,ExDeleteTimer 也会返回 FALSE。
如果 Cancel 为 TRUE 且 Wait 为 FALSE, 则 ExDeleteTimer 永远不会阻止调用线程。 如果无法立即删除计时器对象, ExDeleteTimer 将标记计时器对象,以指示将在挂起的计时器过期后将其删除,并立即返回 ,而不会等待计时器过期或对象被删除。
如果 Cancel 和 Wait 都为 TRUE,则如果无法立即删除计时器对象, 则 ExDeleteTimer 会阻止调用线程。 ExDeleteTimer 会在必要时等待计时器完成过期,并等待驱动程序实现的 ExTimerCallback 例程的任何回调完成。 接下来,如果驱动程序实现此例程, ExDeleteTimer 将删除计时器对象并调用 ExTimerDeleteCallback 例程。 最后, ExDeleteTimer 返回。
驱动程序可以从驱动程序的 ExTimerCallback 例程调用 ExDeleteTimer,该例程在 IRQL = DISPATCH_LEVEL 运行,但驱动程序必须在此调用中将 Wait 参数设置为 FALSE。
作为一个选项,驱动程序可以实现在删除计时器对象后运行的 ExTimerDeleteCallback 回调例程。 通常, ExTimerDeleteCallback 例程释放驱动程序分配用于计时器对象的任何系统资源。
ExDeleteTimer 计划驱动程序实现的 ExTimerDeleteCallback 例程在计时器对象被删除后运行,此时指向此对象的指针不再有效。 如果在 ExDeleteTimer 调用中 Wait 参数为 TRUE,则 ExTimerDeleteCallback 例程的回调将在 ExDeleteTimer 返回之前完成。 如果 Wait 为 FALSE, 则 ExTimerDeleteCallback 例程可能会在 ExDeleteTimer 返回之前或之后运行。
有关详细信息,请参阅 ExXxx计时器例程和EX_TIMER对象。