VOID
ExQueueWorkItem(
IN PWORK_QUEUE_ITEM WorkItem,
IN WORK_QUEUE_TYPE QueueType
);
ExQueueWorkItem inserts a given work item into a queue from which a system worker thread removes the item and gives control to the routine that the caller supplied to ExInitializeWorkItem.
Value |
Meaning |
CriticalWorkQueue |
Insert the WorkItem into the queue from which a system thread with a real-time priority attribute will dequeue the entry. |
DelayedWorkQueue |
Insert the WorkItem into the queue from which a system thread with a variable priority attribute will dequeue the entry. |
The QueueType value HyperCriticalWorkQueue is reserved for system use.
Highest-level drivers can call ExQueueWorkItem.
The callback is run within a system thread context at IRQL PASSIVE_LEVEL. This caller-supplied routine is responsible for calling ExFreePool to reclaim the storage allocated for WorkItem.
A driver must not wait for its callback routine to complete an operation if it is already holding one synchronization object and might attempt to acquire another. For example, a driver should release any currently held semaphores, mutexes, resource variables, and so forth before it calls ExQueueWorkItem. Releasing synchronization resources before queueing a synchronous worker-thread operation prevents deadlocks.
The value of QueueType determines the runtime priority at which the callback routine is run, as follows:
Threads at either priority remain interruptible.
Callers of ExQueueWorkItem must be running at IRQL <= DISPATCH_LEVEL.