Condividi tramite


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 assegna il controllo alla routine fornita dal chiamante a ExInitializeWorkItem.

Avvertimento

Utilizzare 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 deve essere inserito l'elemento di lavoro a cui punta WorkItem. QueueType può essere uno dei seguenti:

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

Il valore QueueType HyperCriticalWorkQueue è riservato per l'uso del sistema.

Valore restituito

Nessuno

Osservazioni

I driver di dispositivo devono usare IoQueueWorkItem anziché ExQueueWorkItem. I driver devono usare ExQueueWorkIteme l'ExInitializeWorkItem, 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, IoFreeWorkIteme IoQueueWorkItem perché solo queste routine assicurano che l'oggetto dispositivo associato all'elemento di lavoro specificato rimanga disponibile fino a quando l'elemento di lavoro non viene elaborato.

La routine di callback specificata nel parametro routine per ExInitializeWorkItem viene chiamata in un contesto di sistema in PASSIVE_LEVEL IRQL. 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 in modo permanente un elemento di lavoro per l'uso del driver. Gli elementi di lavoro sono progettati per operazioni che vengono completate rapidamente. I driver devono liberare tutti gli elementi di lavoro che allocano il prima possibile.

Un driver non deve attendere che la routine di callback completi un'operazione se contiene già un oggetto di sincronizzazione e potrebbe tentare di acquisire un altro. Per evitare deadlock, un driver deve rilasciare tutti i semafori, i mutex, le variabili di risorsa e così via prima di chiamare ExQueueWorkItem.

Il valore di QueueType determina la priorità di runtime in cui 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 più elevate e il callback è pianificato per l'esecuzione del round robin con altri thread con la stessa priorità per ogni quantistico.

I thread con entrambe le priorità rimangono interrompibili.

Fabbisogno

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

Vedere anche

exFreePool

exFreePoolWithTag

ExInitializeWorkItem

IoAllocateWorkItem

IoFreeWorkItem

IoQueueWorkItem

WORK_QUEUE_ITEM