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