Функция 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 зарезервировано для использования системы.
Возвращаемое значение
Никакой
Замечания
Драйверы устройств должны использовать IoQueueWorkItem вместо ExQueueWorkItem. Драйверы должны использовать ExQueueWorkItemи связанные ExInitializeWorkItem, только в тех случаях, когда указанный рабочий элемент не связан с объектом устройства или стеком устройств. Во всех других случаях драйверы должны использовать IoAllocateWorkItem, IoFreeWorkItemи IoQueueWorkItem, так как только эти подпрограммы гарантируют, что объект устройства, связанный с указанным рабочим элементом, остается доступным до обработки рабочего элемента.
Подпрограмма обратного вызова, указанная в параметре подпрограммы для ExInitializeWorkItem, вызывается в системном контексте в IRQL PASSIVE_LEVEL. Эта подпрограмма, предоставляемая вызывающим абонентом, отвечает за освобождение рабочего элемента, если он больше не нужен путем вызова ExFreePool или ExFreePoolWithTag.
Системные рабочие потоки — это ограниченный ресурс. Водители не должны постоянно резервировать рабочий элемент для использования драйвера. Рабочие элементы предназначены для операций, которые выполняются быстро. Водители должны освободить все рабочие элементы, которые они выделяют как можно скорее.
Драйвер не должен ожидать завершения операции обратного вызова, если он уже содержит один объект синхронизации и может попытаться получить другой. Чтобы предотвратить взаимоблокировку, драйвер должен освободить все семафоры, мьютекси, переменные ресурсов и т. д. перед вызовом ExQueueWorkItem.
Значение QueueType определяет приоритет среды выполнения, с которым выполняется подпрограмма обратного вызова, как показано ниже.
Если обратный вызов выполняется в системном потоке с атрибутом приоритета в режиме реального времени, подпрограмма обратного вызова не может быть преумножена за исключением потоков с более высокими приоритетами в режиме реального времени.
Если обратный вызов выполняется в системном потоке с атрибутом приоритета переменной, обратный вызов может быть упрежден потоками с более высокими переменными и приоритетами в режиме реального времени, а обратный вызов планируется выполнить циклический перебор с другими потоками того же приоритета для квантового каждого.
Потоки по обоим приоритетам остаются прерванными.
Требования
Требование | Ценность |
---|---|
целевая платформа | Всеобщий |
заголовка | wdm.h (include Wdm.h, Ntifs.h, Fltkernel.h) |
библиотеки | NtosKrnl.lib |
DLL | NtosKrnl.exe |
IRQL | IRQL <= DISPATCH_LEVEL |