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 插入佇列,其中具有變數優先順序屬性的系統線程將處理工作專案。 |
QueueType 值 HyperCriticalWorkQueue 會保留給系統使用。
傳回值
無
備註
設備驅動器必須使用 IoQueueWorkItem ,而不是 ExQueueWorkItem。 驅動程式應該使用 ExQueueWorkItem 和相關聯的 ExInitializeWorkItem,只有在指定的工作專案未與裝置物件或裝置堆疊相關聯的情況下。 在其他所有情況下,驅動程式都應該使用IoAllocateWorkItem、IoFreeWorkItem和IoQueueWorkItem,因為只有這些例程可確保與指定工作專案相關聯的裝置物件仍可使用,直到處理工作項目為止。
在 IRQL PASSIVE_LEVEL的系統內容中,會呼叫 ExInitializeWorkItem之 Routine 參數中指定的回呼例程。 呼叫 ExFreePool 或 ExFreePoolWithTag 時,此呼叫端提供的例程會負責釋放工作專案。
系統背景工作線程是有限的資源。 驅動程式不得永久保留工作專案以供驅動程式使用。 工作專案是專為快速完成的作業所設計。 驅動程式應該儘快釋出其配置的任何工作專案。
如果驅動程式已經持有一個同步處理物件,而且可能嘗試取得另一個同步處理物件,則驅動程式不得等候其回呼例程完成作業。 若要防止死結,驅動程式應該先釋放任何目前持有的號誌、mutex、資源變數等等,再呼叫 ExQueueWorkItem。
QueueType 的值會決定執行回呼例程的運行時間優先順序,如下所示:
如果回呼在具有即時優先順序屬性的系統線程中執行,則回呼例程無法先佔,但具有較高即時優先順序的線程除外。
如果回呼在具有變數優先順序屬性的系統線程中執行,則回呼可由具有較高變數和即時優先順序的線程先佔,而回呼會排程為以相同優先順序的其他線程執行迴圈配置資源。
任一優先順序的線程仍可中斷。
規格需求
需求 | 值 |
---|---|
目標平台 | Universal |
標頭 | wdm.h (包括 Wdm.h、Ntifs.h、Fltkernel.h) |
程式庫 | NtosKrnl.lib |
Dll | NtosKrnl.exe |
IRQL | IRQL <= DISPATCH_LEVEL |