ExQueueWorkItem-Funktion (wdm.h)

ExQueueWorkItem fügt ein bestimmtes Arbeitselement in eine Warteschlange ein, aus der ein Systemarbeitsthread das Element entfernt, und gibt der Routine die Kontrolle, die der Aufrufer für ExInitializeWorkItem bereitgestellt hat.

Warnung

Verwenden Sie diese Routine mit äußerster Vorsicht. Weitere Informationen finden Sie weiter unten im Abschnitt "Hinweise ".

Syntax

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

Parameter

[in, out] WorkItem

Zeiger auf das Arbeitselement. Dieses Arbeitselement muss durch einen vorherigen Aufruf von ExInitializeWorkItem initialisiert worden sein.

[in] QueueType

Gibt die Warteschlange an, in die das Arbeitselement eingefügt werden soll, auf das von WorkItem verwiesen wird. QueueType kann eine der folgenden Optionen sein:

Wert Bedeutung
CriticalWorkQueue Fügen Sie das WorkItem in die Warteschlange ein, aus der ein Systemthread mit einem Echtzeitprioritätsattribut das Arbeitselement verarbeitet.
DelayedWorkQueue Fügen Sie das WorkItem in die Warteschlange ein, aus der ein Systemthread mit einem Variablenprioritätsattribut das Arbeitselement verarbeitet.

Der QueueType-WertHyperCriticalWorkQueue ist für die Systemverwendung reserviert.

Rückgabewert

Keine

Bemerkungen

Gerätetreiber müssen IoQueueWorkItem anstelle von ExQueueWorkItem verwenden. Treiber sollten ExQueueWorkItem und das zugeordnete ExInitializeWorkItem nur in Fällen verwenden, in denen das angegebene Arbeitselement keinem Geräteobjekt oder Gerätestapel zugeordnet ist. In allen anderen Fällen sollten Treiber IoAllocateWorkItem, IoFreeWorkItem und IoQueueWorkItem verwenden, da nur diese Routinen sicherstellen, dass das dem angegebenen Arbeitselement zugeordnete Geräteobjekt verfügbar bleibt, bis das Arbeitselement verarbeitet wurde.

Die Rückrufroutine, die im Routine-Parameter für ExInitializeWorkItem angegeben wurde, wird in einem Systemkontext bei IRQL PASSIVE_LEVEL aufgerufen. Diese vom Aufrufer bereitgestellte Routine ist dafür verantwortlich, das Arbeitselement freizugeben, wenn es nicht mehr benötigt wird, indem ExFreePool oder ExFreePoolWithTag aufgerufen wird.

Systemworkerthreads sind eine begrenzte Ressource. Fahrer dürfen ein Arbeitselement nicht dauerhaft für den Fahrer reservieren. Arbeitselemente sind für Vorgänge konzipiert, die schnell abgeschlossen werden. Treiber sollten alle Arbeitselemente, die sie zuordnen, so bald wie möglich freigeben.

Ein Treiber darf nicht warten, bis seine Rückrufroutine einen Vorgang abgeschlossen hat, wenn er bereits ein Synchronisierungsobjekt enthält und möglicherweise versucht, ein anderes abzurufen. Um deadlocks zu verhindern, sollte ein Treiber alle derzeit gehaltenen Semaphore, Mutexe, Ressourcenvariablen usw. freigeben, bevor ExQueueWorkItem aufgerufen wird.

Der Wert von QueueType bestimmt die Laufzeitpriorität, mit der die Rückrufroutine wie folgt ausgeführt wird:

  • Wenn der Rückruf im Systemthread mit einem Prioritätsattribut in Echtzeit ausgeführt wird, kann die Rückrufroutine nur durch Threads mit höheren Echtzeitprioritäten vorzeitig entfernt werden.

  • Wenn der Rückruf im Systemthread mit einem Attribut mit variabler Priorität ausgeführt wird, kann der Rückruf von Threads mit höheren Variablen- und Echtzeitprioritäten vorzeitig entfernt werden, und der Rückruf wird für die Ausführung eines Roundrobins mit anderen Threads mit der gleichen Priorität für jeweils ein Quantum geplant.

Threads mit beiden Prioritäten bleiben unterbrechungsfähig.

Anforderungen

Anforderung Wert
Zielplattform Universell
Header wdm.h (include Wdm.h, Ntifs.h, Fltkernel.h)
Bibliothek NtosKrnl.lib
DLL NtosKrnl.exe
IRQL IRQL <= DISPATCH_LEVEL

Weitere Informationen

ExFreePool

ExFreePoolWithTag

ExInitializeWorkItem

IoAllocateWorkItem

IoFreeWorkItem

IoQueueWorkItem

WORK_QUEUE_ITEM