ExXxxTimer 例程和EX_TIMER物件
從 Windows 8.1 開始,可以使用一組完整的 ExXxxTimer 例程來管理定時器。 這些例程會使用以 EX_TIMER 結構為基礎的定時器物件。 ExXxxTimer 例程會取代 KeXxxTimer 例程,從 Windows 2000 開始提供。 只有在 Windows 8.1 和更新版本的 Windows 上執行的驅動程式 可以使用 exXxxTimer 例程,而不是使用 KeXxxTimer 例程。 Windows 8.1 和更新版本的 Windows 會繼續支援 KeXxx定時器 例程。
ExXxxTimer 例程具有由 KeXxxTimer 例程提供的所有重要功能。 此外,ExXxxTimer 例程支援兩種定時器類型,高解析度定時器 和 非喚醒定時器,KeXxx定時器 例程不支援。 高解析度定時器是定時器,其到期時間的指定精確度高於系統時鐘預設解析度所限制的定時器。 無喚醒定時器是定時器,可避免不必要地從低功率狀態喚醒處理器。 如需詳細資訊,請參閱下列主題:
從 Windows 8.1 開始,可以使用下列 ExXxxTimer 例程:
您可以使用 ExSetTimer 例程,而不是使用 KeSetTimer 或 KeSetTimerEx 例程。 ExCancelTimer 例程可以使用,而不是使用 KeCancelTimer 例程。
ExAllocateTimer 和 ExDeleteTimer 例程沒有直接 KeXxxTimer 對應專案。 這兩個例程會配置並釋放定時器物件。 這個定時器對像是系統配置的 EX_TIMER 結構,其成員對驅動程式不透明。 相反地,KeXxxTimer 例程所使用的定時器對象是驅動程式設定的 KTIMER 結構。 驅動程式會呼叫 KeInitializeTimer 或 KeInitializeTimerEx 例程來初始化這個物件。 ExAllocateTimer 初始化其配置的定時器物件。 如需 ExDeleteTimer的詳細資訊,請參閱 刪除 System-Allocated Timer 物件。
EX_TIMER 和 KTIMER 結構都是可等候的物件。 驅動程式呼叫 ExSetTimer、KeSetTimer或 KeSetTimerEx 來設定定時器之後,驅動程式可以呼叫例程,例如 KeWaitForSingleObject 或 KeWaitForMultipleObjects 等候定時器到期。 定時器物件會在定時器到期時發出訊號。 作為選項,驅動程式可以提供驅動程序實作的指標,ExTimerCallback 或 CustomTimerDpc 定時器到期後呼叫的回呼例程。
KeXxxTimer 例程有兩個功能,ExXxxTimer 例程都不需要這些功能,但大部分驅動程式都不需要這些功能。
首先,KeXxxTimer 例程所使用的 KTIMER 結構會由驅動程式配置。 驅動程式可以預先配置此物件,以確保物件即使在資源受限且記憶體配置可能會失敗的情況下也能使用。 相反地,呼叫 ExAllocateTimer 配置定時器物件,可能會在資源限制的環境中失敗。 不過,少數驅動程式必須設計為在記憶體配置失敗的環境中運作,而且大部分驅動程式都受益於 ExAllocateTimer 同時配置和初始化定時器物件的例程便利。
其次,沒有 ExXxxTimer 相當於 KeReadStateTimer 例程,這表示定時器物件是否處於訊號狀態。 不過,這個例程很少使用。 如有必要,使用 ExXxxTimer 例程的驅動程式,可以讀取驅動程式提供給 ExAllocateTimer 例程所設定 ExTimerCallback 回呼例程的布爾值,來檢查定時器物件是否處於訊號狀態。