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 ,因为只有这些例程可确保与指定工作项关联的设备对象在处理工作项之前保持可用。
在 ExInitializeWorkItem 的例程参数中指定的回调例程在 IRQL PASSIVE_LEVEL的系统上下文中调用。 当不再需要工作项时,调用方提供的此例程负责通过调用 ExFreePool 或 ExFreePoolWithTag 来释放工作项。
系统工作线程是有限的资源。 驱动程序不得永久保留工作项供驱动程序使用。 工作项专为快速完成的操作而设计。 驱动程序应尽快释放其分配的任何工作项。
如果驱动程序已持有一个同步对象,并且可能尝试获取另一个同步对象,则不得等待其回调例程完成操作。 若要防止死锁,驱动程序应在调用 ExQueueWorkItem 之前释放任何当前持有的信号灯、互斥体、资源变量等。
QueueType 的值确定运行回调例程的运行时优先级,如下所示:
如果回调在具有实时优先级属性的系统线程中运行,则无法抢占回调例程,实时优先级较高的线程除外。
如果回调在具有变量优先级属性的系统线程中运行,则具有较高变量和实时优先级的线程可能会抢占回调,并且计划回调与每个量子线程具有相同优先级的其他线程运行轮循机制。
具有任一优先级的线程都保持可中断。
要求
要求 | 值 |
---|---|
目标平台 | 通用 |
标头 | wdm.h (包括 Wdm.h、Ntifs.h、Fltkernel.h) |
Library | NtosKrnl.lib |
DLL | NtosKrnl.exe |
IRQL | IRQL <= DISPATCH_LEVEL |