KeRemoveQueue-Funktion (ntifs.h)

Die KeRemoveQueue-Routine gibt dem aufrufenden Thread einen Zeiger auf einen entfernten Eintrag aus dem angegebenen Warteschlangenobjekt oder ermöglicht es 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 Aufrufer wartet, der entweder KernelMode oder UserMode sein kann. Wenn unter IRQL >= DISPATCH_LEVEL auf etwas in seinem Stapel 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 der 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 werden von Systemzeitänderungen nicht beeinflusst. Dieser Zeiger kann NULL sein.

Rückgabewert

KeRemoveQueue gibt eine der folgenden Rückgaben zurück:

  • Ein Zeiger auf einen entfernten Eintrag aus dem angegebenen Warteschlangenobjekt, sofern verfügbar.
  • 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 heruntergefahren wurde

Hinweise

Aufrufer von KeRemoveQueue sollten vor dem Zugriff auf Eintragsmember testen, ob der Rückgabewert STATUS_TIMEOUT oder STATUS_USER_APC ist. Das Testen des Rückgabewerts von KeRemoveQueue auf NULL ist ein Programmierfehler.

Die Angabe eines Nullwerts für Timeout gibt an, dass der Aufrufer nicht bereit ist, auf einen Eintrag zu warten, wenn die Warteschlange derzeit leer ist. Die Angabe eines **NULL-Timeoutzeigers* gibt die Bereitschaft des Aufrufers an, unbegrenzt auf einen Eintrag zu warten.

Wenn der WaitMode-ParameterUserMode ist, kann der Kernelstapel während der Wartezeit ausgetauscht werden. Folglich darf ein Aufrufer niemals versuchen, Parameter für den Stapel zu übergeben, wenn KeRemoveQueue aufgerufen wird, wobei WaitMode auf UserMode festgelegt ist.

Die Angabe von WaitMode als KernelMode in einem Aufruf von KeRemoveQueue verhindert, dass der Kernelstapel des aufrufenden Threads vertauscht wird und die Übermittlung von asynchronen Prozeduraufrufen (APC) im Benutzermodus verhindert wird. Dies verhindert nicht die Bereitstellung von Kernelmodus-APCs, z. B. apCs, die vom E/A-Manager zum Abschließen von IRPs verwendet werden, wenn ein Thread KeRemoveQueue von IRQL PASSIVE_LEVEL aufruft. Die Bereitstellung eines solchen Kernelmodus-APC verhindert nicht, dass der aufrufende Thread auf das Warteschlangenobjekt wartet oder nach der Ausführung des Kernel-APC mit einem Eintrag zur Ausführung weitergeleitet wird.

Weitere Informationen zur Verwendung von vom Treiber verwalteten internen Warteschlangen finden Sie unter Vom Treiber verwaltete Warteschlangen.

Anforderungen

Anforderung Wert
Zielplattform Universell
Header ntifs.h (include Ntifs.h, FltKernel.h)
Bibliothek NtosKrnl.lib
DLL NtosKrnl.exe
IRQL <= DISPATCH_LEVEL
DDI-Complianceregeln HwStorPortProhibitedDIs(storport), PowerIrpDDis(wdm)

Weitere Informationen

KeInsertHeadQueue

KeInsertQueue