KeRemoveQueue 函式 (ntifs.h)
KeRemoveQueue 例程會為呼叫線程提供指定佇列物件中已清除佇列專案的指標,或允許呼叫端在佇列物件上等候最多選擇性的逾時間隔。
語法
PLIST_ENTRY KeRemoveQueue(
[in, out] PRKQUEUE Queue,
[in] KPROCESSOR_MODE WaitMode,
[in, optional] PLARGE_INTEGER Timeout
);
參數
[in, out] Queue
初始化佇列物件的指標,呼叫端會在非分頁集區中提供常駐記憶體。
[in] WaitMode
呼叫者正在等候的處理器模式,可以是 KernelMode 或 UserMode。 如果在 IRQL >= DISPATCH_LEVEL 存取其堆疊上的任何項目,呼叫端必須指定 KernelMode。
[in, optional] Timeout
指定絕對時間或相對時間的變數指標,單位為100奈秒,等候即將到期。 如果 逾時值 為負值,則到期時間會相對於目前的系統時間;否則,它是絕對的。 絕對到期時間會追蹤系統時間的任何變更;相對到期時間不會受到系統時間變更的影響。 此指標可以是 NULL。
傳回值
KeRemoveQueue 會傳回下列其中一項:
- 如果有可用的佇列物件,則為從指定佇列物件清除佇列專案的指標。
- STATUS_TIMEOUT,如果指定的逾時間隔在專案可用前過期
- STATUS_USER_APC,如果在呼叫線程的內容中傳遞使用者模式 APC
- STATUS_ABANDONED,如果佇列已執行
言論
KeRemoveQueue 呼叫者應該先測試其傳回值是否為STATUS_TIMEOUT或STATUS_USER_APC,再存取任何項目成員。 針對 NULL 測試 KeRemoveQueue 的傳回值是程式設計錯誤。
為 Timeout 指定零值 表示如果佇列目前是空的,呼叫端不願意等候專案。指定 **NULL*逾時 指標表示呼叫端願意無限期等候專案。
如果 WaitMode 參數 UserMode,則可以在等候期間交換核心堆棧。 因此,呼叫者絕對不會在呼叫 KeRemoveQueue 時嘗試在堆疊上傳遞參數,且 WaitMode 設定為 UserMode。
將 WaitMode 指定為 KernelMode,KeRemoveQueue 可防止呼叫線程的核心堆疊被交換,以及防止傳遞使用者模式異步過程調用 (APC)。 當線程從 IRQL PASSIVE_LEVEL呼叫 KeRemoveQueue 時,不會防止傳遞核心模式 APC,例如 I/O 管理員用來完成 IRP 的人員。 這類內核模式 APC 的傳遞不會防止呼叫線程在佇列物件上等候,也不會在核心 APC 執行之後分派執行專案。
如需使用驅動程式管理的內部佇列的詳細資訊,請參閱 Driver-Managed 佇列。
要求
要求 | 價值 |
---|---|
目標平臺 | 普遍 |
標頭 | ntifs.h (include Ntifs.h, FltKernel.h) |
連結庫 | NtosKrnl.lib |
DLL | NtosKrnl.exe |
IRQL | <= DISPATCH_LEVEL |
DDI 合規性規則 | HwStorPortProhibitedDIs(storport),PowerIrpDDis(wdm) |