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 Austauschen des Stapels aktiviert werden soll, der zum aufrufenden Thread gehört. Wenn TRUE-, ist der Austausch aktiviert, und der Inhalt des Stapels kann in und außerhalb des Arbeitsspeichers ausgelagert werden. Wenn FALSE-, ist der Austausch deaktiviert, und der Stapel ist speicherresident.
Rückgabewert
KeSetKernelStackSwapEnable gibt einen BOOLESCHEN Wert zurück, der angibt, ob stapeltauschen zu dem Zeitpunkt aktiviert wurde, zu dem der Aufruf initiiert wurde. Dieser Wert ist TRUE, wenn das Stapeltauschen zuvor aktiviert war und FALSE ist, wenn er deaktiviert wurde.
Bemerkungen
Ein Kernelmodustreiber kann diese Routine aufrufen, um zu steuern, ob sein Stapel seitenfähig oder im Arbeitsspeicher gesperrt ist.
Stapeltausch kann nur auftreten, wenn sich der Thread in einem Wartezustand befindet, der durch eine Anforderung von einer Benutzermodusanwendung verursacht wurde. Stapel-Swapping tritt niemals für Wartezustände auf, die von Kernelmoduskomponenten initiiert werden, unabhängig davon, ob stack swapping aktiviert ist.
Es ist in der Regel nicht erforderlich, stapeltauschen zu deaktivieren. Tun Sie dies nur in seltenen Fällen. Ein Beispiel, in dem Alternativen zum Deaktivieren des Stapeltauschs erläutert werden, finden Sie unten im Abschnitt "Beispiel".
In einem Aufruf einer Kernelmodus-Warteroutine, z. B. KeWaitForSingleObject, gibt der Aufrufer einen WaitMode Parameter an, um anzugeben, ob der Aufrufer im Kernelmodus oder im Benutzermodus wartet. Wenn WaitMode = UserMode-und wenn 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 des Wartens speicherresident bleiben müssen, kann der Thread verhindern, dass der Stapel ausgelagert wird, indem er KeSetKernelStackSwapEnable aufruft und Enable = FALSEangibt.
Ein Thread darf nicht beendet (beendet) werden, während der Stapeltausch deaktiviert ist oder eine Systemfehlerprüfung auftritt.
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-UserRequest- auf, um anzugeben, dass sich der Thread in einem Wartezustand befindet, der durch eine Anforderung einer Anwendung im Benutzermodus verursacht wird, und WaitMode auf KernelMode- festgelegt ist, um anzugeben, dass die Wartezeit im Kernelmodus auftritt. Nach Abschluss der Wartezeit ruft der Thread KeSetKernelStackSwap 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 speicherresident sein, während es auf einen Signal- oder nicht signalgesteuerten 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 das einfache Zuordnen des Ereignisses aus einem nicht seitenfreien Pool sein.
Anforderungen
Anforderung | Wert |
---|---|
mindestens unterstützte Client- | Windows 2000 |
Zielplattform- | Universal |
Header- | ntifs.h (einschließlich Ntifs.h, Fltkernel.h) |
Library | NtosKrnl.lib |
DLL- | NtosKrnl.exe |
IRQL- | <= APC_LEVEL |