Freigeben über


KeSetKernelStackSwapEnable-Funktion (ntifs.h)

Die KeSetKernelStackSwapEnable-Routine aktiviert und deaktiviert das Austauschen des Aufrufersstapels 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. Bei TRUE ist das Austauschen aktiviert, und der Inhalt des Stapels kann in und aus dem Arbeitsspeicher ausgelagert werden. Bei FALSE ist das Austauschen deaktiviert, und der Stapel ist speicherresident.

Rückgabewert

KeSetKernelStackSwapEnable gibt einen BOOLEAN-Wert zurück, der angibt, ob der Stapelaustausch zum Zeitpunkt der Aufrufinitiierung aktiviert war. Dieser Wert ist TRUE , wenn der Stapelaustausch zuvor aktiviert war, und false , wenn er deaktiviert wurde.

Hinweise

Ein Kernelmodustreiber kann diese Routine aufrufen, um zu steuern, ob der Stapel ausgelagert 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. Stapelaustausch findet für Wartezustände, die von Kernelmoduskomponenten initiiert werden, nie statt, unabhängig davon, ob Stapelaustausch aktiviert ist.

Es ist in der Regel nicht erforderlich, das 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 im Abschnitt Beispiel unten.

In einem Aufruf einer Warteroutine im Kernelmodus, 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 wartenden Thread gehört. Wenn der Stapel jedoch Datenelemente enthält, die für die Dauer der Wartezeit speicherresident bleiben müssen, kann der Thread verhindern, dass der Stapel ausgelagert wird, indem KeSetKernelStackSwapEnable aufgerufen und FALSE aktiviert = wird.

Ein Thread darf nicht beendet (beendet) werden, während der Stapelaustausch deaktiviert ist, oder es wird eine Systemfehlerüberprüfung durchgeführt.

Beispiel

Im folgenden Codebeispiel ordnet 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 von UserRequest auf, um anzugeben, dass sich der Thread in einem Wartezustand befindet, der durch eine Anforderung von einer Benutzermodusanwendung verursacht wurde, 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 Stapelaustauschstatus 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 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 ausgelagerte Datenelemente auf dem Stapel zugewiesen werden. Im vorherigen Beispiel muss der Treiberthread den Stapel sperren, da das Ereignisobjekt im Stapel zugeordnet ist. Eine bessere Alternative könnte das einfache Zuordnen des Ereignisses aus einem nicht ausseitigen Pool sein.

Anforderungen

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

Weitere Informationen

KeInitializeEvent

KeWaitForSingleObject