共用方式為


ExQueueWorkItem 函式 (wdm.h)

ExQueueWorkItem 將指定的工作專案插入佇列中,系統背景工作線程會從佇列中移除專案,並將控制權提供給呼叫者提供給 exInitializeWorkItem 的例程。

警告

請謹慎使用此例程。 請參閱下方的<<備註> 一節。

語法

void ExQueueWorkItem(
  [in, out] __drv_aliasesMem PWORK_QUEUE_ITEM WorkItem,
  [in]      WORK_QUEUE_TYPE                   QueueType
);

參數

[in, out] WorkItem

工作專案的指標。 此工作項目必須由先前呼叫 ExInitializeWorkItem初始化。

[in] QueueType

指定要插入工作專案 WorkItem 所指向的佇列QueueType 可以是下列其中一項:

價值 意義
CriticalWorkQueue WorkItem 插入佇列中,系統線程具有即時優先權屬性會處理工作專案。
DelayedWorkQueue WorkItem 插入佇列中,其中具有變數優先順序屬性的系統線程將處理工作專案。

QueueTypeHyperCriticalWorkQueue 保留供系統使用。

傳回值

沒有

言論

設備驅動器必須使用 IoQueueWorkItem,而不是 ExQueueWorkItem。 驅動程式應該使用 ExQueueWorkItem,以及相關聯的 ExInitializeWorkItem,只有在指定的工作專案與裝置物件或裝置堆疊沒有關聯的情況下。 在其他所有情況下,驅動程式應該使用 IoAllocateWorkItemIoFreeWorkItem,以及 IoQueueWorkItem,因為這些例程可確保與指定工作專案相關聯的裝置對象在處理工作專案之前仍可使用。

在 IRQL PASSIVE_LEVEL 的系統內容中呼叫 exInitializeWorkItem例程中所指定的回呼例程 參數。 呼叫 exFreePool ExFreePoolWithTag 時,此呼叫端提供的例程會負責釋放工作專案。

系統背景工作線程是有限的資源。 驅動程式不得永久保留工作專案以供驅動程式使用。 工作專案是專為快速完成的作業所設計。 驅動程式應儘快釋放其配置的任何工作專案。

如果驅動程式已經持有一個同步處理物件,且可能嘗試取得另一個同步處理物件,則驅動程式不得等候其回呼例程完成作業。 若要防止死結,驅動程式應該在呼叫 exQueueWorkItem 之前釋放目前持有的任何旗號、mutex、資源變數等等。

QueueType 的值 決定執行回呼例程的運行時間優先順序,如下所示:

  • 如果回呼是以即時優先順序屬性在系統線程中執行,則回呼例程不能先佔,但具有較高即時優先順序的線程除外。

  • 如果回呼在系統線程中以變數優先順序屬性執行,則回呼可由具有較高變數和即時優先順序的線程先佔,而回呼則排程為與其他相同量子優先順序的線程執行迴圈配置資源。

優先順序為任一的線程仍可中斷。

要求

要求 價值
目標平臺 普遍
標頭 wdm.h (包括 Wdm.h、Ntifs.h、Fltkernel.h)
連結庫 NtosKrnl.lib
DLL NtosKrnl.exe
IRQL IRQL <= DISPATCH_LEVEL

另請參閱

ExFreePool

ExFreePoolWithTag

ExInitializeWorkItem

IoAllocateWorkItem

IoFreeWorkItem

IoQueueWorkItem

WORK_QUEUE_ITEM