ExQueueWorkItem

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.

Parameters

WorkItem
Points to the work item that was set up by a preceding call to ExInitializeWorkItem.
QueueType
Specifies the queue into which WorkItem is inserted. QueueType can be either of the following:

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.

Comments

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.

See Also

ExFreePool, ExInitializeWorkItem