Функция 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 в очередь, из которой системный поток с переменным атрибутом приоритета будет обрабатывать рабочий элемент.

Значение QueueTypeHyperCriticalWorkQueue зарезервировано для использования системой.

Возвращаемое значение

None

Remarks

Драйверы устройств должны использовать IoQueueWorkItem вместо ExQueueWorkItem. Драйверы должны использовать ExQueueWorkItem и связанный ExInitializeWorkItem только в тех случаях, когда указанный рабочий элемент не связан с объектом устройства или стеком устройств. Во всех остальных случаях драйверы должны использовать IoAllocateWorkItem, IoFreeWorkItem и IoQueueWorkItem , так как только эти подпрограммы гарантируют, что объект устройства, связанный с указанным рабочим элементом, остается доступным до обработки рабочего элемента.

Подпрограмма обратного вызова, указанная в параметре Routine для ExInitializeWorkItem , вызывается в системном контексте в PASSIVE_LEVEL IRQL. Эта подпрограмма, предоставляемая вызывающим абонентом, отвечает за освобождение рабочего элемента, когда он больше не нужен, вызывая ExFreePool или ExFreePoolWithTag.

Системные рабочие потоки являются ограниченным ресурсом. Водители не должны постоянно резервировать рабочий элемент для использования водителем. Рабочие элементы предназначены для операций, которые выполняются быстро. Водители должны как можно скорее освободить все рабочие элементы, которые они выделяют.

Драйвер не должен ждать завершения процедуры обратного вызова, если он уже содержит один объект синхронизации и может попытаться получить другой. Чтобы предотвратить взаимоблокировку, драйвер должен освободить все текущие семафоры, мьютексы, переменные ресурсов и т. д., прежде чем вызывать ExQueueWorkItem.

Значение QueueType определяет приоритет среды выполнения, с которой выполняется подпрограмма обратного вызова, следующим образом:

  • Если обратный вызов выполняется в системном потоке с атрибутом приоритета в режиме реального времени, подпрограмма обратного вызова не может быть вытеснена только потоками с более высокими приоритетами в режиме реального времени.

  • Если обратный вызов выполняется в системном потоке с атрибутом переменной приоритета, обратный вызов может быть вытеснено потоками с более высокими переменными и приоритетами в режиме реального времени, а обратный вызов запланирован для выполнения циклического перебора с другими потоками с таким же приоритетом для квантовых.

Потоки с обоими приоритетами остаются прерываемыми.

Требования

Требование Значение
Целевая платформа Универсальное
Верхняя часть wdm.h (включая Wdm.h, Ntifs.h, Fltkernel.h)
Библиотека NtosKrnl.lib
DLL NtosKrnl.exe
IRQL IRQL <= DISPATCH_LEVEL

См. также раздел

ExFreePool

ExFreePoolWithTag

ExInitializeWorkItem

IoAllocateWorkItem

IoFreeWorkItem

IoQueueWorkItem

WORK_QUEUE_ITEM