KeRemoveQueue-Funktion (ntifs.h)
Die KeRemoveQueue Routine gibt dem aufrufenden Thread einen Zeiger auf einen dequeuierten Eintrag aus dem angegebenen Warteschlangenobjekt oder ermöglicht dem Aufrufer, bis zu einem optionalen Timeoutintervall, auf das Warteschlangenobjekt zu warten.
Syntax
PLIST_ENTRY KeRemoveQueue(
[in, out] PRKQUEUE Queue,
[in] KPROCESSOR_MODE WaitMode,
[in, optional] PLARGE_INTEGER Timeout
);
Parameter
[in, out] Queue
Zeiger auf ein initialisiertes Warteschlangenobjekt, für das der Aufrufer residenten Speicher im nicht ausgelagerten Pool bereitstellt.
[in] WaitMode
Der Prozessormodus, in dem der Anrufer wartet, der entweder KernelMode- oder UserMode-sein kann. Wenn bei IRQL >= DISPATCH_LEVEL auf etwas zugegriffen werden kann, muss der Aufrufer KernelMode-angeben.
[in, optional] Timeout
Zeiger auf eine Variable, die die absolute oder relative Zeit in Einheiten von 100 Nanosekunden angibt, bei denen die Wartezeit abläuft. Wenn der Wert von Timeout negativ ist, ist die Ablaufzeit relativ zur aktuellen Systemzeit; andernfalls ist es absolut. Absolute Ablaufzeiten verfolgen alle Änderungen der Systemzeit; Relative Ablaufzeiten sind von Systemzeitänderungen nicht betroffen. Dieser Zeiger kann NULL sein.
Rückgabewert
KeRemoveQueue gibt eine der folgenden Werte zurück:
- Ein Zeiger auf einen dequeuierten Eintrag aus dem angegebenen Warteschlangenobjekt, falls vorhanden.
- STATUS_TIMEOUT, wenn das angegebene Timeoutintervall abgelaufen ist, bevor ein Eintrag verfügbar wurde
- STATUS_USER_APC, wenn ein Benutzermodus-APC im Kontext des aufrufenden Threads übermittelt wurde
- STATUS_ABANDONED, wenn die Warteschlange heruntergelaufen ist
Bemerkungen
Anrufer von KeRemoveQueue sollten testen, ob der Rückgabewert STATUS_TIMEOUT oder STATUS_USER_APC ist, bevor auf Eintragsmitglieder zugegriffen wird. Das Testen des Rückgabewerts von KeRemoveQueue anhand NULL- ist ein Programmierfehler.
Gibt einen Nullwert für Timeout- an, dass der Aufrufer nicht bereit ist, auf einen Eintrag zu warten, wenn die Warteschlange zurzeit leer ist. Das Angeben eines **NULL-*Timeout- Zeigers gibt die Bereitschaft des Aufrufers an, auf unbestimmte Zeit für einen Eintrag zu warten.
Wenn der parameter WaitModeUserModeist, kann der Kernelstapel während der Wartezeit vertauscht werden. Folglich darf ein Aufrufer niemals versuchen, Parameter im Stapel zu übergeben, wenn KeRemoveQueue aufgerufen wird, wobei WaitMode auf UserMode-festgelegt ist.
Das Angeben von WaitMode als KernelMode- in einem Aufruf von KeRemoveQueue verhindert, dass der Kernelstapel des aufrufenden Threads ausgetauscht wird, und verhindert, dass asynchrone Prozeduraufrufe im Benutzermodus (APC) bereitgestellt werden. Sie verhindert nicht die Übermittlung von Kernelmodus-APCs, z. B. die vom I/O-Manager zum Abschließen von IRPs verwendet werden, wenn ein Thread KeRemoveQueue von IRQL-PASSIVE_LEVEL aufruft. Die Übermittlung eines solchen Kernelmodus-APC verhindert nicht, dass der aufrufende Thread auf das Warteschlangenobjekt wartet oder für die Ausführung mit einem Eintrag verteilt wird, nachdem der Kernel-APC ausgeführt wurde.
Weitere Informationen zur Verwendung von vom Treiber verwalteten internen Warteschlangen finden Sie unter Driver-Managed Warteschlangen.
Anforderungen
Anforderung | Wert |
---|---|
Zielplattform- | Universal |
Header- | ntifs.h (einschließlich Ntifs.h, FltKernel.h) |
Library | NtosKrnl.lib |
DLL- | NtosKrnl.exe |
IRQL- | <= DISPATCH_LEVEL |
DDI-Complianceregeln | HwStorPortProhibitedDIs(storport), PowerIrpDDis(wdm) |