共用方式為


刪除System-Allocated計時器物件

從 Windows 8.1 開始,ExDeleteTimer常式會刪除ExAllocateTimer常式所建立的計時器物件。 這個計時器物件是系統組態的 EX_TIMER 結構,其成員不透明。 刪除計時器物件之前, ExDeleteTimer 會停用物件上的進一步計時器作業,並取消或完成物件上可能正在進行的任何擱置作業。

驅動程式呼叫 ExDeleteTimer之後,此常式會採取數個步驟,以確保它可以安全地刪除計時器物件。 首先, ExDeleteTimer 會將計時器物件標示為已停用,以防止驅動程式啟動使用 物件的新計時器作業。 停用計時器物件之後, 對 ExSetTimerExCancelTimer 常式的呼叫會立即傳回 FALSE 並執行任何作業。 此外, 對 ExDeleteTimer 的第二次呼叫會傳回 FALSE ,而且不會執行任何作業。

接下來, ExDeleteTimer 會檢查計時器是否仍在從先前呼叫 ExDeleteTimer擱置中。 停用計時器物件並不會取消在停用物件之前設定的計時器。 在下列兩種情況下,先前設定的計時器可能會在停用計時器物件之後過期:

  • 計時器是週期性。
  • 計時器是單次 (或非效能) ,尚未過期。

停用計時器物件之後,定期計時器永遠不會過期一次以上。

如果您的驅動程式實作 ExTimerCallback 回 呼常式,則此常式的 Timer 參數保證一律為計時器物件的有效指標, (EX_TIMER 結構) ,即使計時器在停用計時器物件之後到期也一樣。

如果沒有任何計時器擱置中, ExDeleteTimer 會刪除計時器物件,並在不等待的情況下傳回 。

如果呼叫 ExDeleteTimer 時計時器暫止,則驅動程式提供給此常式的 CancelWait 參數值會控制常式的行為。 Cancel參數會告訴ExDeleteTimer是否嘗試解除擱置計時器。 Wait參數會告訴ExDeleteTimer是否要等候傳回,直到刪除計時器物件為止。

如果 CancelFALSE (在此情況下, Wait 必須是 FALSE) 且計時器擱置中, ExDeleteTimer 會讓計時器在刪除計時器物件之前過期。 在此情況下, ExDeleteTimer 會將計時器物件標示為在擱置計時器到期後刪除, (,且 ExTimerCallback 常式的任何最後回呼都會完成) 。 然後 ExDeleteTimer 會傳回 ,而不需要等待計時器完成到期或要刪除的物件。

如果 CancelTRUEExDeleteTimer 會在到期前嘗試解除擱置的計時器。 如果 ExDeleteTimer 成功取消計時器,則會傳回 TRUEExDeleteTimer 如果無法取消計時器,則會傳回 FALSE ,這是一次性計時器已過期或正在到期的情況。 如果 (一次或定期) 計時器在ExDeleteTimer呼叫之前取消,或者從未設定計時器,ExDeleteTimer也會傳回FALSE

如果 CancelTRUEWaitFALSEExDeleteTimer 永遠不會封鎖呼叫執行緒。 如果無法立即刪除計時器物件, ExDeleteTimer 會標記計時器物件,以指出在擱置計時器完成到期後要刪除,並立即傳回,而不需要等待計時器到期或要刪除物件。

如果 CancelWait 都是 TRUE,如果無法立即刪除計時器物件, ExDeleteTimer 會封鎖呼叫執行緒。 ExDeleteTimer 會視需要等候計時器完成到期,以及要完成驅動程式實作 ExTimerCallback 常式的任何回呼。 接下來,如果驅動程式實作此常式, ExDeleteTimer 會刪除計時器物件,並呼叫 ExTimerDeleteCallback 常式。 最後, ExDeleteTimer 會 傳回 。

驅動程式可以從驅動程式的ExTimerCallback常式呼叫ExDeleteTimer,此常式會在 IRQL = DISPATCH_LEVEL執行,但驅動程式必須在此呼叫中將Wait參數設定為FALSE

作為選項,驅動程式可以實作在刪除計時器物件之後執行的 ExTimerDeleteCallback 回 呼常式。 一般而言, ExTimerDeleteCallback 常式會釋放驅動程式配置與計時器物件搭配使用的任何系統資源。

ExDeleteTimer 會排程驅動程式實作的 ExTimerDeleteCallback 常式,在刪除計時器物件之後執行,此時此物件的指標不再有效。 如果ExDeleteTimer呼叫中的Wait參數為TRUE則 ExTimerDeleteCallback常式的回呼會在ExDeleteTimer傳回之前完成。 如果 WaitFALSEExTimerDeleteCallback 常式可能會在 ExDeleteTimer 傳回之前或之後執行。

如需詳細資訊,請參閱 ExXxxTimer 常式和EX_TIMER物件