ExXxxTimer 例程和 EX_TIMER 对象

从 Windows 8.1 开始,可以使用一组全面的 ExXxx计时器例程来管理计时器。 这些例程使用基于 EX_TIMER 结构的计时器对象。 ExXxx计时器例程是 KeXxx计时器例程的替代程序,这些例程从 Windows 2000 开始可用。 仅在 Windows 8.1 及更高版本的 Windows 上运行的驱动程序可以使用 ExXxx计时器例程,而不是 KeXxx计时器例程。 Windows 8.1 及更高版本的 Windows 继续支持 KeXxx计时器例程。

ExXxx计时器例程具有 KeXxx计时器例程提供的所有重要功能。 此外,ExXxx计时器例程支持 Ke Xxx 计时器例程不支持的两种计时器类型:高分辨率计时器和无唤醒计时器。 高分辨率计时器是计时器,其到期时间的指定准确度高于精度受系统时钟默认分辨率限制的计时器。 无唤醒计时器是避免不必要地将处理器从低功耗状态唤醒的计时器。 有关详情,请参阅以下主题:

高解析度计时器

无唤醒功能的计时器

从 Windows 8.1 开始,可以使用以下 ExXxx计时器例程:

ExAllocateTimer

ExSetTimer

ExCancelTimer

ExDeleteTimer

可以使用 ExSetTimer 例程代替 KeSetTimerKeSetTimerEx 例程。 可以使用 ExCancelTimer 例程代替 KeCancelTimer 例程。

ExAllocateTimerExDeleteTimer 例程没有直接的 KeXxxTimer 对应项。 这两个例程分配和释放计时器对象。 此计时器对象是系统分配 的EX_TIMER 结构,其成员对驱动程序不透明。 相比之下, KeXxx计时器 例程使用的计时器对象是驱动程序分配的 KTIMER 结构。 驱动程序调用 KeInitializeTimerKeInitializeTimerEx 例程来初始化此对象。 ExAllocateTimer 初始化它分配的计时器对象。 有关 ExDeleteTimer 的详细信息,请参阅 删除System-Allocated计时器对象

EX_TIMERKTIMER 结构是可等待的对象。 在驱动程序调用 ExSetTimerKeSetTimerKeSetTimerEx 来设置计时器后,驱动程序可以调用 KeWaitForSingleObjectKeWaitForMultipleObjects 等例程来等待计时器过期。 计时器对象在计时器过期时发出信号。 作为一个选项,驱动程序可以提供指向驱动程序实现的 ExTimerCallbackCustomTimerDpc 回调例程的指针,操作系统在计时器过期后调用该例程。

KeXxx计时器例程具有 Ex Xxx 计时器例程不提供的两项功能,但大多数驱动程序不需要这些功能。

首先,KeXxx计时器例程用作计时器对象的 KTIMER 结构由驱动程序分配。 驱动程序可以预先分配此对象,以确保即使在资源受限且内存分配可能失败的情况下,该对象也可用。 相比之下,在资源受限的环境中,调用 ExAllocateTimer 来分配计时器对象可能会失败。 但是,很少有驱动程序需要设计为在内存分配失败的环境中运行,并且大多数驱动程序受益于分配和初始化计时器对象的 ExAllocateTimer 例程的便利性。

其次,没有与 KeReadStateTimer 例程等效的 ExXxxTimer,该例程指示计时器对象是否处于信号状态。 但是,很少使用此例程。 如有必要,使用 ExXxxTimer 例程的驱动程序可以通过读取由驱动程序提供给 ExAllocateTimer 例程的 ExTimerCallback 回调例程设置的布尔值来检查计时器对象是否处于信号状态。