ExSetTimer 函数 (wdm.h)
ExSetTimer 例程启动计时器作,并将计时器设置为在指定的到期时间过期。
语法
BOOLEAN ExSetTimer(
[in] PEX_TIMER Timer,
[in] LONGLONG DueTime,
[in] LONGLONG Period,
[in, optional] PEXT_SET_PARAMETERS Parameters
);
参数
[in] Timer
指向 EX_TIMER 结构的指针。 此结构是以前由 ExAllocateTimer 例程分配的计时器对象。
[in] DueTime
计时器到期的绝对或相对时间。 如果 DueTime 参数的值为负值,则过期时间相对于当前系统时间。 否则,过期时间是绝对的。 过期时间以系统时间单位(100 纳秒间隔)表示。 绝对过期时间跟踪系统时间中的任何更改;相对过期时间不受系统时间更改的影响。 绝对时间表示为自 1601 年初以来在系统时间单位中传递的时间量。
高分辨率计时器 的 DueTime 参数必须是相对时间(负值),或例程 bug 检查。
[in] Period
计时器的可选时间段(以系统时间单位为单位(100 纳秒间隔)。 必须小于或等于 MAXLONG。 对于一次性计时器而不是定期计时器,请将 时间段 设置为零。
[in, optional] Parameters
指向 EXT_SET_PARAMETERS 结构的指针。 调用驱动程序以前调用 ExInitializeSetTimerParameters 例程来初始化此结构。
返回值
如果此例程取消调用例程时挂起的计时器,则此例程返回 true TRUE。 否则,例程返回 FALSE。 有关详细信息,请参阅“备注”。
言论
驱动程序可以调用此例程来设置计时器,以便在将来过期。 然后,驱动程序可以等待计时器过期。 或者,驱动程序可以实现在计时器过期时调用的回调例程。
驱动程序调用 ExSetTimer后,驱动程序可以调用例程,例如 KeWaitForSingleObject 或 KeWaitForMultipleObjects 等待计时器过期。 计时器过期时,作系统会向计时器对象发出信号。
作为选项,驱动程序可以实现 ExTimerCallback 回调例程,并将指向此例程的指针作为输入参数提供给 ExAllocateTimer 例程。 计时器过期时,作系统将调用 ExTimerCallback 例程。
ExSetTimer 调用隐式取消 计时器指定的计时器对象上以前启动的任何设置计时器作。 如果驱动程序之前调用 ExSetTimer 设置使用 计时器的计时器,并且当第二次调用 ExSetTimer 时,此计时器尚未过期,则第二次调用将从第一次调用中取消计时器,然后启动新计时器。 在这种情况下,第二个调用返回 true 。 但是,如果第一次调用启动的计时器在第二次调用取消此计时器之前过期,则第二次调用将启动新计时器,并返回 FALSE。
如果 Period 参数为非零,则计时器是定期的。 对于定期计时器,DueTime 参数指定初始计时器到期时间,时间段 指定后续过期之间的间隔。
用于系统时钟的硬件计时器以统一间隔发出中断请求信号,但这些中断的处理可能会因其他设备的中断处理而延迟。 因此,对于定期计时器,从定期过期时间到发出计时器对象的信号时间或 ExTimerCallback 例程运行可能会因一个周期到下一个周期而异。 有关详细信息,请参阅 计时器准确性。
定期计时器在每个系统时钟时钟计时周期中可以过期不超过一次。 将计时器的周期设置为小于系统时钟时钟周期间隔的值不会导致计时器在每个系统时钟时钟周期过期多次,但可能会导致连续过期之间的间隔在系统时钟速率发生更改时有所不同。 例如,作系统可能会暂时增加系统时钟速率,以满足高分辨率计时器的计时要求。 有关详细信息,请参阅 High-Resolution 计时器。
对于不是高分辨率计时器的定期计时器,驱动程序可以通过将 周期 设置为系统时钟时钟周期之间的默认间隔的整数倍,来实现相对统一的定期过期。
为了避免过度消耗电量,驱动程序不应将长时间运行的高分辨率计时器的时间段设置为小于系统时钟时钟周期之间的默认间隔的值。 否则,系统时钟计时器将持续生成最大允许的系统时钟速率的中断。
有关详细信息,请参阅 ExXxxTimer 例程和EX_TIMER对象。
要求
要求 | 价值 |
---|---|
最低支持的客户端 | 从 Windows 8.1 开始可用。 |
目标平台 | 普遍 |
标头 | wdm.h (包括 Wdm.h、Ntddk.h、Ntifs.h) |
库 | Ntoskrnl.lib |
IRQL | <= DISPATCH_LEVEL |