共用方式為


KeWaitForSingleObject 函式 (wdm.h)

KeWaitForSingleObject 例程會將目前的線程置於等候狀態,直到指定的發送器物件設定為訊號狀態,或(選擇性地)直到等候逾時為止。

語法

NTSTATUS
KeWaitForSingleObject (
    PVOID Object,
    KWAIT_REASON WaitReason,
    KPROCESSOR_MODE WaitMode,
    BOOLEAN Alertable,
    PLARGE_INTEGER Timeout
    );

參數

[in] Object

初始化發送器物件的指標(事件、mutex、號誌、線程或定時器),呼叫端會提供記憶體。 發送器對象必須位於非分頁的系統記憶體中。 如需詳細資訊,請參閱。

[in] WaitReason

指定等候的原因。 驅動程式應該將此值設定為 Executive,除非它代表使用者執行工作,而且是在使用者線程的內容中執行,在此情況下,它應該將此值設定為 UserRequest

[in] WaitMode

指定呼叫端在 KernelModeUserMode中等候。 最低層級和中繼驅動程式應該指定 KernelMode。 如果指定的 物件 為 mutex,呼叫端必須指定 KernelMode

[in] Alertable

指定布爾值 ,如果等候可發出警示,則為 TRUE,否則為 FALSE

[in, optional] Timeout

指定以 100 奈秒為單位的絕對或相對時間逾時值的指標,等候完成。

正值會指定絕對時間,相對於 1601 年 1 月 1 日。 負值會指定相對於目前時間的間隔。 絕對到期時間會追蹤系統時間中的任何變更;相對到期時間不會受到系統時間變更的影響。

如果 逾時 = 0,則例程會傳回而不等候。 如果呼叫端提供 NULL 指標,則例程會無限期地等候,直到發送器物件設定為訊號狀態為止。 如需詳細資訊,請參閱下列一節。

傳回值

KeWaitForSingleObject 可以傳回下列其中一項。

NT_SUCCESS巨集會將所有這些狀態值辨識為「成功」值。

傳回碼 描述
STATUS_SUCCESS Object 參數指定的發送器物件符合等候。
STATUS_ALERTED 等候中斷,以將警示傳遞至呼叫端線程。
STATUS_USER_APC 等候中斷,以將使用者異步過程調用 (APC) 傳遞給呼叫線程。
STATUS_TIMEOUT 物件設定為訊號狀態之前發生逾時。 當無法立即符合指定的等候條件集,且 逾時 設為零時,就可以傳回此值。

言論

檢查指定之 物件 的目前狀態,以判斷是否可以立即滿足等候。 如果是,則會對對對象執行必要的副作用。 否則,目前的線程會處於等候狀態,並選取新的線程以在目前的處理器上執行。

Alertable 參數會決定線程何時可以發出警示,並因此中止其等候狀態。 如需詳細資訊,請參閱 等候和 APC

當傳遞 至 keWaitForSingleObjectObject 參數為 mutex 時,會特別考慮。 如果等候的發送器對像是 mutex,則 APC 傳遞與等候期間所有其他發送器物件相同。 不過,KeWaitForSingleObject 會傳回 STATUS_SUCCESS,而線程實際上會保留 mutex,只會傳遞特殊的內核模式 APC。 已停用核心模式和使用者模式的所有其他 APC 傳遞。 在釋放 mutex 之前,對 APC 傳遞的限制會持續存在。

Object 參數所指向的發送器對象必須位於非分頁的系統記憶體中。

如果 WaitMode 參數 UserMode,則可以在等候期間交換核心堆棧。 因此,呼叫者絕對不能在使用 userMode 自變數呼叫 KeWaitForSingleObject 時,嘗試在堆棧上傳遞參數。 如果您在堆疊上設定事件,則必須將 waitMode 參數設定為 KernelMode

WaitMode 參數 UserMode或時,檢查 keWaitForSingleObject 的傳回 值特別重要 警示為 TRUE,因為 KeWaitForSingleObject 可能會在STATUS_USER_APC或STATUS_ALERTED狀態早期傳回。

用戶可中止的所有長期等候,都應該 UserMode 等候,可警示 應設定為 FALSE

可能的話,Alertable 應設定為 FALSE,且 WaitMode 應設定為 KernelMode,以減少驅動程式的複雜度。 此作業的主要例外狀況是等候是長期等候的時間。

如果 NULL 指標提供給 逾時,則呼叫線程會維持等候狀態,直到發出 物件 訊號為止。

零的逾時值允許測試一組等候條件,並在可以立即滿足等候時的任何副作用的條件效能,如同取得 Mutex 一樣。

逾時間隔是相對於系統時鐘來測量,而作系統可以偵測逾時間隔結束的正確性會受限於系統時鐘的粒度。 如需詳細資訊,請參閱 定時器精確度

Mutex 只能以遞歸方式取得MINLONG時間。 如果超過此限制,例程會引發STATUS_MUTANT_LIMIT_EXCEEDED例外狀況。

KeWaitForSingleObject 的呼叫端必須在 IRQL <= DISPATCH_LEVEL 執行。 不過,如果 Timeout = NULLTimeout != 0,則呼叫端必須在 IRQL <= APC_LEVEL 和非bitrary 線程內容中執行。 如果 逾時 != NULL,且 逾時 = 0,呼叫端必須在 IRQL <= DISPATCH_LEVEL執行。

KeWaitForMutexObject 是轉換成 KeWaitForSingleObject的巨集,可以改用。

為了提升效能,請使用快速 Mutex 或受防護的 Mutex。 如需詳細資訊,請參閱 Mutex 物件的替代項目

如需 mutex 物件的詳細資訊,請參閱 Mutex Objects

要求

要求 價值
目標平臺 普遍
標頭 wdm.h (包括 Wdm.h、Ntddk.h、Ntifs.h)
連結庫 NtosKrnl.lib
DLL NtosKrnl.exe
IRQL 請參閱一節。
DDI 合規性規則 CompleteRequestStatusCheck(wdm)HwStorPortProhibitedDDIs(storport)IoAllocateIrpSignalEventInCompletionTimeout(wdm)IoBuildDeviceControlWait(wdm)IoBuildDeviceControlWaitTimeout(wdm)IoBuildFsdIrpSignalEventInCompletionTimeout(wdm)IoBuildSynchronousFsdRequestWait(wdm)IoBuildSynchronousFsdRequestWaitTimeout(wdm)IrpProcessingComplete(wdm)IrqlKeWaitForMutexObject(wdm)LowerDriverReturn(wdm)MarkIrpPending2(wdm)PendedCompletedRequest(wdm)PendedCompletedRequest2(wdm)PendedCompletedRequest3(wdm)PendedCompletedRequestEx(wdm)RemoveLockForwardDeviceControl(wdm)RemoveLockForwardDeviceControlInternal(wdm)RemoveLockForwardRead(wdm)RemoveLockForwardWrite(wdm)SpNoWait(storport)StartDeviceWait(wdm)StartDeviceWait2(wdm)StartDeviceWait3(wdm)StartDeviceWait4(wdm)

另請參閱

ExInitializeFastMutex

KeBugCheckEx

KeInitializeEvent

KeInitializeMutex

KeInitializeSemaphore

KeInitializeTimer

KeWaitForMultipleObjects