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 |