共用方式為


註冊和佇列 CustomTimerDpc 常式

驅動程式可以藉由呼叫下列常式來註冊 CustomTimerDpc 常式,通常是從其 AddDevice 常式:

  1. KeInitializeDpc 註冊其常式

  2. KeInitializeTimerKeInitializeTimerEx 來設定計時器物件

之後,驅動程式可以呼叫 KeSetTimerKeSetTimerEx 來指定到期時間,並將計時器物件新增至系統的計時器佇列。 達到到期時間時,系統會取消佇列計時器物件,並呼叫 CustomTimerDpc 常式。 下圖說明這些呼叫。

說明針對 customtimerdpc 常式使用計時器和 dpc 物件的圖表。

如上圖所示,驅動程式必須同時為 DPC 物件和計時器物件提供儲存體。 大部分的驅動程式會在 裝置擴充功能 或其他驅動程式配置的駐留記憶體中,提供這些物件的儲存體。

在對 KeSetTimer的呼叫中,驅動程式會將指標傳遞至 DpcTimer 物件,以及以 100 奈秒為單位表示 的 DueTime ,如上圖所示。 DueTime的正值指定自 1601 年 1 月 1 日起 (的絕對到期時間,) 應該呼叫CustomTimerDpc常式。 DueTime的負值會指定相對到期時間

因為絕對計時器在特定系統時間到期,所以如果計時器到期之前系統時間變更,則絕對計時器的等候持續時間不會受到影響。 另一方面,不論絕對系統時間的變更為何,相對計時器一律會在指定的時間單位數目過後到期。

若要重複叫用 CustomTimerDpc 常式,請使用 KeSetTimerEx 來設定計時器,並在 Period 參數中指定週期性間隔。 KeSetTimerEx 就像 KeSetTimer ,但這個額外的參數除外。

如上圖所示,呼叫KeSetTimer 或 KeSetTimerEx會將計時器物件排入指定間隔的佇列,如下所示:

  1. DueTime到期時,計時器物件會取消佇列,並設定為 Signaled 狀態。

  2. 如果機器中的每個處理器目前正在 IRQL 上執行大於或等於DISPATCH_LEVEL的程式碼,則與計時器物件相關聯的 DPC 物件會放在 DPC 佇列中。 否則會呼叫 CustomTimerDpc 常式。

  3. 如果 DPC 物件在 DueTime 間隔過期時已經在佇列中,只要機器中任何處理器上的 IRQL 低於DISPATCH_LEVEL, 就會呼叫 CustomTimerDpc 常式。

    注意

    CustomTimerDpc常式就像所有 DPC 常式一樣,會在 IRQL = DISPATCH_LEVEL呼叫。 當 DPC 常式執行時,所有線程都無法在同一個處理器上執行。 驅動程式開發人員應該仔細設計其 CustomTimerDpc 常式,以盡可能短暫地執行。

可以指定給KeSetTimer 和 KeSetTimerEx的最小時間間隔大約是十毫秒,因此當時間比每秒執行一次 IoTimer 常式的較小間隔時,驅動程式可以使用CustomTimerDpc程。

任何時間只能排入一個特定計時器物件的具現化。 使用相同的Timer物件指標再次呼叫KeSetTimer 或 KeSetTimerEx會取消佇列計時器物件並重設它。

設定 CustomTimerDpc 常式與設定 CustomDpc 常式完全相同,另外還有一個步驟來初始化計時器物件。 事實上,其原型完全相同,但 CustomTimerDpc 常式無法使用其原型中所宣告的兩個 SystemArgument 指標。