ExQueueWorkItem-Funktion (wdm.h)
ExQueueWorkItem fügt eine bestimmte Arbeitsaufgabe in eine Warteschlange ein, aus der ein Systemarbeitsthread das Element entfernt und der Routine, die der Aufrufer an ExInitializeWorkItembereitgestellt hat.
Warnung
Verwenden Sie diese Routine mit äußerster Vorsicht. Weitere Informationen finden Sie im Abschnitt Anmerkungen weiter unten.
Syntax
void ExQueueWorkItem(
[in, out] __drv_aliasesMem PWORK_QUEUE_ITEM WorkItem,
[in] WORK_QUEUE_TYPE QueueType
);
Parameter
[in, out] WorkItem
Zeiger auf die Arbeitsaufgabe. Diese Arbeitsaufgabe muss durch einen vorherigen Aufruf von ExInitializeWorkItem-initialisiert worden sein.
[in] QueueType
Gibt die Warteschlange an, in die die Arbeitsaufgabe WorkItem- eingefügt werden soll. QueueType- kann eine der folgenden sein:
Wert | Bedeutung |
---|---|
CriticalWorkQueue- | Fügen Sie die WorkItem- in die Warteschlange ein, aus der ein Systemthread mit einem Attribut mit Echtzeitpriorität die Arbeitsaufgabe verarbeitet. |
DelayedWorkQueue | Fügen Sie die WorkItem- in die Warteschlange ein, aus der ein Systemthread mit einem Attribut mit variabler Priorität die Arbeitsaufgabe verarbeitet. |
Der QueueType-wertHyperCriticalWorkQueue für die Systemverwendung reserviert ist.
Rückgabewert
Nichts
Bemerkungen
Gerätetreiber müssen IoQueueWorkItem- anstelle von ExQueueWorkItem-verwenden. Treiber sollten ExQueueWorkItem-und die zugeordneten ExInitializeWorkItem-verwenden, nur in Fällen, in denen die angegebene Arbeitsaufgabe 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 bis zur Verarbeitung der Arbeitsaufgabe verfügbar bleibt.
Die Rückrufroutine, die im parameter Routine angegeben wurde, um ExInitializeWorkItem- wird in einem Systemkontext bei IRQL-PASSIVE_LEVEL aufgerufen. Diese vom Aufrufer bereitgestellte Routine ist für das Freigeben der Arbeitsaufgabe verantwortlich, wenn sie nicht mehr benötigt wird, indem ExFreePool oder ExFreePoolWithTagaufgerufen wird.
Systemarbeitsthreads sind eine begrenzte Ressource. Treiber dürfen eine Arbeitsaufgabe nicht dauerhaft für die Verwendung des Fahrers reservieren. Arbeitsaufgaben sind für Vorgänge konzipiert, die schnell abgeschlossen werden. Treiber sollten alle Arbeitsaufgaben freigeben, die sie so schnell wie möglich zuordnen.
Ein Treiber darf nicht warten, bis seine Rückrufroutine einen Vorgang abgeschlossen hat, wenn er bereits ein Synchronisierungsobjekt enthält und versucht, eine andere abzurufen. Um deadlock zu verhindern, sollte ein Treiber alle derzeit gehaltenen Semaphoren, Mutexes, Ressourcenvariablen usw. freigeben, bevor er ExQueueWorkItem-aufruft.
Der Wert von QueueType bestimmt die Laufzeitpriorität, bei der die Rückrufroutine ausgeführt wird, wie folgt:
Wenn der Rückruf im Systemthread mit einem Attribut für die Echtzeitpriorität ausgeführt wird, kann die Rückrufroutine nicht außer von Threads mit höheren Echtzeitprioritäten vorgebeutet 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 vorgedrängt werden, und der Rückruf wird so geplant, dass Roundrobin mit anderen Threads derselben Priorität für ein Quantum ausgeführt wird.
Threads mit beiden Prioritäten bleiben unterbrechungsfähig.
Anforderungen
Anforderung | Wert |
---|---|
Zielplattform- | Universal |
Header- | wdm.h (include Wdm.h, Ntifs.h, Fltkernel.h) |
Library | NtosKrnl.lib |
DLL- | NtosKrnl.exe |
IRQL- | IRQL-<= DISPATCH_LEVEL |