KeSetKernelStackSwapEnable-Funktion (ntifs.h)

Die KeSetKernelStackSwapEnable-Routine aktiviert und deaktiviert den Austausch des Stapels des Aufrufers auf den Datenträger.

Syntax

BOOLEAN KeSetKernelStackSwapEnable(
  [in] BOOLEAN Enable
);

Parameter

[in] Enable

Gibt an, ob das Swapping des Stapels aktiviert werden soll, der zum aufrufenden Thread gehört. Wenn TRUE aktiviert ist, ist das Swapping aktiviert, und der Inhalt des Stapels kann in und außerhalb des Arbeitsspeichers angezeigt werden. Wenn FALSCH, ist die Swapping deaktiviert, und der Stapel ist speicherresidiert.

Rückgabewert

KeSetKernelStackSwapEnable gibt einen BOOLEAN-Wert zurück, der angibt, ob stapeltauschen zu dem Zeitpunkt, zu dem der Aufruf initiiert wurde, aktiviert wurde. Dieser Wert ist TRUE , wenn der Stapeltausch zuvor aktiviert wurde und FALSCH ist, wenn er deaktiviert wurde.

Bemerkungen

Ein Kernelmodustreiber kann diese Routine aufrufen, um zu steuern, ob der Stapel seitenfähig oder im Arbeitsspeicher gesperrt ist.

Stapeltausch kann nur auftreten, wenn sich der Thread in einem Wartezustand befindet, der durch eine Anforderung aus einer Benutzermodusanwendung verursacht wurde. Stapeltausch tritt niemals für Wartenzustände auf, die von Kernelmoduskomponenten initiiert werden, unabhängig davon, ob die Stapeltauschung aktiviert ist.

Es ist in der Regel nicht erforderlich, die Stapeltauschung zu deaktivieren. Tun Sie dies nur in seltenen Fällen. Ein Beispiel, das Alternativen zum Deaktivieren des Stapeltauschs erläutert, finden Sie im folgenden Beispielabschnitt.

Bei einem Aufruf einer Kernelmodus-Warteroutine, z. B . KeWaitForSingleObject, gibt der Aufrufer einen WaitMode-Parameter an, der angibt, ob der Aufrufer im Kernelmodus oder im Benutzermodus wartet. Wenn WaitMode = UserMode und die Wartezeit ausreichend lang ist, kann der Speicher-Manager Abschnitte des Stapels ausblättern, der zum Wartethread gehört. Wenn der Stapel jedoch Datenelemente enthält, die für die Dauer der Wartezeit speicherresidieren müssen, kann der Thread verhindern, dass der Stapel ausgelagert wird, indem Er KeSetKernelStackSwapEnable aufruft und "False" = angibt.

Ein Thread darf nicht beendet (beendet) werden, während der Stapeltausch deaktiviert ist, oder eine Systemfehlerprüfung tritt auf.

Beispiel

Im folgenden Codebeispiel weist ein Treiberthread ein Ereignis auf seinem Stapel zu und ruft KeSetKernelStackSwap auf, um den Stapel vorübergehend im Arbeitsspeicher zu sperren, bis das Ereignis signalisiert wird. Der Treiber ruft KeWaitForSingleObject mit einem WaitReason of UserRequest auf, um anzugeben, dass sich sein Thread in einem Wartezustand befindet, der durch eine Anforderung einer Benutzermodusanwendung verursacht wird, und WaitMode auf KernelMode festgelegt, um anzugeben, dass die Wartezeit im Kernelmodus auftritt. Nach Abschluss der Wartezeit ruft der Thread KeSetKernelStackSwap bei Bedarf erneut auf, um den ursprünglichen Stapeltauschstatus des Threads wiederherzustellen.

KEVENT event;
BOOLEAN oldSwapEnable;
NTSTATUS status;

oldSwapEnable = KeSetKernelStackSwapEnable(FALSE);

KeInitializeEvent(&event, SynchronizationEvent, FALSE);

//
// TO DO: Insert code here to pass the event to another thread
// that will set the event to the signaled state.
//
...

status = KeWaitForSingleObject(&event, UserRequest, KernelMode, FALSE, NULL);

if (oldSwapEnable)
{
    KeSetKernelStackSwapEnable(TRUE);
}

Ein Ereignisobjekt muss speicherintern sein, während es auf einen signalierten oder nicht signalierten Zustand festgelegt werden kann, oder während ein Thread auf das Ereignis wartet. Weitere Informationen finden Sie unter Definieren und Verwenden eines Ereignisobjekts.

Häufig ist die Verwendung der KeSetKernelStackSwap-Routine unnötig und kann vermieden werden, indem nur seitenfähige Datenelemente auf dem Stapel zugeordnet werden. Im vorherigen Beispiel muss der Treiberthread den Stapel sperren, da das Ereignisobjekt auf dem Stapel zugeordnet ist. Eine bessere Alternative könnte sein, das Ereignis einfach aus einem nicht seitenseitigen Pool zuzuweisen.

Anforderungen

   
Unterstützte Mindestversion (Client) Ab Windows 2000 verfügbar.
Zielplattform Universell
Header ntifs.h (include Ntifs.h, Fltkernel.h)
Bibliothek NtosKrnl.lib
DLL NtosKrnl.exe
IRQL <= APC_LEVEL

Siehe auch

KeInitializeEvent

KeWaitForSingleObject