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 |