Share via


Función ExQueueWorkItem (wdm.h)

ExQueueWorkItem inserta un elemento de trabajo determinado en una cola desde la que un subproceso de trabajo del sistema quita el elemento y proporciona control a la rutina que el autor de la llamada proporcionó a ExInitializeWorkItem.

Advertencia

Use esta rutina con extrema precaución. Consulte la sección Comentarios a continuación.

Sintaxis

void ExQueueWorkItem(
  [in, out] __drv_aliasesMem PWORK_QUEUE_ITEM WorkItem,
  [in]      WORK_QUEUE_TYPE                   QueueType
);

Parámetros

[in, out] WorkItem

Puntero al elemento de trabajo. Este elemento de trabajo debe haberse inicializado mediante una llamada anterior a ExInitializeWorkItem.

[in] QueueType

Especifica la cola en la que se va a insertar el elemento de trabajo al que apunta WorkItem . QueueType puede ser cualquiera de los siguientes:

Valor Significado
CriticalWorkQueue Inserte workItem en la cola desde la que un subproceso del sistema con un atributo de prioridad en tiempo real procesará el elemento de trabajo.
DelayedWorkQueue Inserte workItem en la cola desde la que un subproceso del sistema con un atributo de prioridad variable procesará el elemento de trabajo.

El valor QueueTypeHyperCriticalWorkQueue está reservado para uso del sistema.

Valor devuelto

None

Observaciones

Los controladores de dispositivo deben usar IoQueueWorkItem en lugar de ExQueueWorkItem. Los controladores deben usar ExQueueWorkItem y exInitializeWorkItem asociado, solo en los casos en los que el elemento de trabajo especificado no está asociado a un objeto de dispositivo o a una pila de dispositivos. En todos los demás casos, los controladores deben usar IoAllocateWorkItem, IoFreeWorkItem e IoQueueWorkItem porque solo estas rutinas garantizan que el objeto de dispositivo asociado al elemento de trabajo especificado permanezca disponible hasta que se haya procesado el elemento de trabajo.

La rutina de devolución de llamada especificada en el parámetro Routine para ExInitializeWorkItem se llama en un contexto del sistema en IRQL PASSIVE_LEVEL. Esta rutina proporcionada por el autor de la llamada es responsable de liberar el elemento de trabajo cuando ya no es necesario llamando a ExFreePool o ExFreePoolWithTag.

Los subprocesos de trabajo del sistema son un recurso limitado. Los conductores no deben reservar permanentemente un elemento de trabajo para el uso del controlador. Los elementos de trabajo están diseñados para operaciones que se completan rápidamente. Los controladores deben liberar los elementos de trabajo que asignen lo antes posible.

Un controlador no debe esperar a que su rutina de devolución de llamada complete una operación si ya contiene un objeto de sincronización y podría intentar adquirir otro. Para evitar el interbloqueo, un controlador debe liberar los semáforos, las exclusión mutuas, las variables de recursos, etc. antes de llamar a ExQueueWorkItem.

El valor de QueueType determina la prioridad en tiempo de ejecución en la que se ejecuta la rutina de devolución de llamada, como se indica a continuación:

  • Si la devolución de llamada se ejecuta en el subproceso del sistema con un atributo de prioridad en tiempo real, la rutina de devolución de llamada no se puede reemplazar excepto por subprocesos con prioridades en tiempo real más altas.

  • Si la devolución de llamada se ejecuta en el subproceso del sistema con un atributo de prioridad variable, los subprocesos con mayor variable y prioridades en tiempo real, y la devolución de llamada está programada para ejecutar round robin con otros subprocesos de la misma prioridad para cada uno de ellos.

Los subprocesos con cualquier prioridad permanecen interrumpibles.

Requisitos

Requisito Value
Plataforma de destino Universal
Encabezado wdm.h (incluya Wdm.h, Ntifs.h, Fltkernel.h)
Library NtosKrnl.lib
Archivo DLL NtosKrnl.exe
IRQL IRQL <= DISPATCH_LEVEL

Consulte también

ExFreePool

ExFreePoolWithTag

ExInitializeWorkItem

IoAllocateWorkItem

IoFreeWorkItem

IoQueueWorkItem

WORK_QUEUE_ITEM