Функция ExInitializeWorkItem (wdm.h)

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

Предупреждение

Используйте эту процедуру с особой осторожностью. См. раздел Примечания ниже.

Синтаксис

void ExInitializeWorkItem(
  [in] PWORK_QUEUE_ITEM       Item,
  [in] PWORKER_THREAD_ROUTINE Routine,
  [in] PVOID                  Context
);

Параметры

[in] Item

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

[in] Routine

Указатель на определяемую вызывающим элементом подпрограмму, которая будет вызываться для обработки рабочего элемента. Эта подпрограмма будет вызываться в контексте системного потока на PASSIVE_LEVEL IRQL. Эта подпрограмма объявляется следующим образом:

VOID
(*PWORKER_THREAD_ROUTINE)(
    IN PVOID Parameter
    );

Параметр

Указатель сведений о контексте, переданный в параметре Context .

[in] Context

Указатель на предоставленные вызывающим объектом сведения о контексте для передачи в подпрограмму обратного вызова, указанную в параметре Routine .

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

None

Remarks

ExInitializeWorkItem инициализирует рабочий элемент с указанной подпрограммой обратного вызова, указателем контекста и указателями списка NULL .

Чтобы добавить рабочий элемент в системную рабочую очередь, вызовите ExQueueWorkItem.

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

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

Требования

Требование Значение
Целевая платформа Персональный компьютер
Верхняя часть wdm.h (включает FltKernel.h, Ntifs.h, Ntddk.h, Wdm.h)
IRQL Любой уровень

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

ExFreePool

ExFreePoolWithTag

ExQueueWorkItem

IoAllocateWorkItem

IoFreeWorkItem

IoQueueWorkItem

WORK_QUEUE_ITEM