Funzione ExQueueWorkItem (wdm.h)

ExQueueWorkItem inserisce un determinato elemento di lavoro in una coda da cui un thread di lavoro di sistema rimuove l'elemento e fornisce il controllo alla routine fornita dal chiamante a ExInitializeWorkItem.

Avviso

Usare questa routine con estrema cautela. Vedere la sezione Osservazioni di seguito.

Sintassi

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

Parametri

[in, out] WorkItem

Puntatore all'elemento di lavoro. Questo elemento di lavoro deve essere stato inizializzato da una chiamata precedente a ExInitializeWorkItem.

[in] QueueType

Specifica la coda in cui l'elemento di lavoro puntato da WorkItem deve essere inserito. QueueType può essere uno dei seguenti:

Valore Significato
CriticalWorkQueue Inserire WorkItem nella coda da cui un thread di sistema con un attributo di priorità in tempo reale elabora l'elemento di lavoro.
RitardatoWorkQueue Inserire WorkItem nella coda da cui un thread di sistema con un attributo di priorità variabile elabora l'elemento di lavoro.

Il valore QueueTypeHyperCriticalWorkQueue è riservato per l'uso del sistema.

Valore restituito

nessuno

Osservazioni

I driver di dispositivo devono usare IoQueueWorkItem anziché ExQueueWorkItem. I driver devono usare ExQueueWorkItem e l'oggetto ExInitializeWorkItem associato, solo nei casi in cui l'elemento di lavoro specificato non è associato a un oggetto dispositivo o a uno stack di dispositivi. In tutti gli altri casi, i driver devono usare IoAllocateWorkItem, IoFreeWorkItem e IoQueueWorkItem perché solo queste routine garantiscono che l'oggetto dispositivo associato all'elemento di lavoro specificato rimanga disponibile finché l'elemento di lavoro non è stato elaborato.

La routine di callback specificata nel parametro Routine in ExInitializeWorkItem viene chiamata in un contesto di sistema in IRQL PASSIVE_LEVEL. Questa routine fornita dal chiamante è responsabile della liberazione dell'elemento di lavoro quando non è più necessaria chiamando ExFreePool o ExFreePoolWithTag.

I thread di lavoro di sistema sono una risorsa limitata. I driver non devono riservare definitivamente un elemento di lavoro per l'uso del driver. Gli elementi di lavoro sono progettati per le operazioni che vengono completate rapidamente. I driver devono liberare tutti gli elementi di lavoro allocati il prima possibile.

Un driver non deve attendere il completamento della routine di callback se è già in possesso di un oggetto di sincronizzazione e potrebbe tentare di acquisire un altro. Per evitare deadlock, un driver deve rilasciare eventuali semafori, mutex, variabili di risorsa e così via prima di chiamare ExQueueWorkItem.

Il valore di QueueType determina la priorità di runtime in corrispondenza della quale viene eseguita la routine di callback, come indicato di seguito:

  • Se il callback viene eseguito nel thread di sistema con un attributo di priorità in tempo reale, la routine di callback non può essere preceduta da thread con priorità in tempo reale più elevate.

  • Se il callback viene eseguito nel thread di sistema con un attributo di priorità variabile, il callback può essere preceduto da thread con priorità variabili e in tempo reale superiori e il callback viene pianificato per eseguire round robin con altri thread della stessa priorità per ogni quantistico.

I thread con una priorità rimangono interrotti.

Requisiti

Requisito Valore
Piattaforma di destinazione Universale
Intestazione wdm.h (include Wdm.h, Ntifs.h, Fltkernel.h)
Libreria NtosKrnl.lib
DLL NtosKrnl.exe
IRQL IRQL <= DISPATCH_LEVEL

Vedi anche

ExFreePool

ExFreePoolWithTag

ExInitializeWorkItem

IoAllocateWorkItem

IoFreeWorkItem

IoQueueWorkItem

WORK_QUEUE_ITEM