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

呼叫端正在等候的處理器模式,可以是 KernelModeUserMode。 如果可以在 IRQL >= DISPATCH_LEVEL存取其堆疊上的任何專案,呼叫端必須指定 KernelMode

[in, optional] Timeout

指定絕對或相對時間的變數指標,單位為100奈秒,等候到期。 如果 Timeout 的值是負數,則到期時間相對於目前的系統時間;否則,它是絕對的。 絕對到期時間會追蹤系統時間的任何變更;相對到期時間不會受到系統時間變更的影響。 此指標可以是 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 時,嘗試在堆疊上傳遞參數。

在對 KeRemoveQueue 的呼叫中將 WaitMode 指定為 KernelMode,可防止呼叫線程的核心堆疊遭到交換,以及防止傳遞使用者模式異步過程呼叫 (APC) 。 當線程從 IRQL PASSIVE_LEVEL呼叫 KeRemoveQueue 時,不會防止傳遞核心模式 AP,例如 I/O 管理員用來完成 IRP 的 API。 這類核心模式 APC 的傳遞不會防止呼叫線程在佇列物件上等候,也不會在執行核心 APC 之後,以專案分派執行。

如需使用驅動程式管理的內部佇列的詳細資訊,請參閱 驅動程式管理的佇列

規格需求

需求
目標平台 Universal
標頭 ntifs.h (包括 Ntifs.h、FltKernel.h)
程式庫 NtosKrnl.lib
Dll NtosKrnl.exe
IRQL <= DISPATCH_LEVEL
DDI 合規性規則 HwStorPortProhibitedDDIs (storport) PowerIrpDDis (wdm)

另請參閱

KeInsertHeadQueue

KeInsertQueue