等候和 APC

注意

此頁面上針對使用者 APC 描述的行為適用于一般使用者模式 APC,以及特殊的使用者模式 APC。

代表使用者模式呼叫端等候發送器物件的執行緒必須準備好,才能由使用者 APC 或執行緒終止中斷該等候。 當執行緒呼叫 KeWaitForSingleObjectKeWaitForMultipleObjectsKeWaitForMutexObjectKeDelayExecutionThread時,作業系統可以將執行緒置於等候狀態。 一般而言,執行緒會維持在等候狀態,直到作業系統可以完成呼叫端要求的作業為止。 不過,如果呼叫端指定 WaitMode = UserMode ,作業系統可能會中斷等候。 在此情況下,常式會以 NTSTATUS 值為 STATUS_USER_APC 結束。

任何使用 WaitMode = UserMode 呼叫上述四個常式之一的驅動程式都必須準備好接收STATUS_USER_APC的傳回值。 驅動程式必須使用STATUS_USER_APC來完成其目前作業,並將控制權傳回至使用者模式。

作業系統中斷等候的確切情況取決於常式的 Alertable 參數值。 如果為 Alertable = TRUE,則等候是可警示的等候。 否則,等候是不可警示的等候。 作業系統只會中斷可警示的等候,以傳遞使用者 APC。 作業系統會中斷這兩種等候,以終止執行緒。

下表說明不同參數設定、等候和使用者 APC 傳遞之間的關聯性。

參數 等候中斷嗎? 使用者 APC 已傳遞?
= 警示TRUEWaitMode = UserMode
= 警示TRUEWaitMode = KernelMode
= 警示FALSEWaitMode = UserMode 是,適用于執行緒終止。 否,適用于使用者 APC。
= 警示FALSEWaitMode = KernelMode

您可以停用執行緒的核心 APC。 如果您停用執行緒的核心 APC,也會停用該執行緒的使用者 APC 傳遞和執行緒終止。 如需如何停用 APC 的詳細資訊,請參閱 停用 APC

警示是作業系統內部很少使用的機制,也可以中斷可警示的等候狀態。 不論WaitMode參數的值為何,警示都可以在Alertable = TRUE時中斷等候。 等候常式會傳回值 STATUS_ALERTED。

請注意,核心 APC 會先占執行,而且不會造成KeWaitForXxxKeDelayExecutionThread傳回。 系統會中斷並繼續內部等候。 驅動程式通常不會受到此程式的影響,但驅動程式可能會遺漏暫時性狀況的發送器物件訊號,例如 呼叫 KePulseEvent