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 der Austausch des Stapels aktiviert werden soll, der zum aufrufenden Thread gehört. True gibt an, dass der Austausch aktiviert ist und der Inhalt des Stapels ausgelagerungsfähig ist. False gibt an, dass der Austausch deaktiviert ist und der Stapel speicherresident ist.

Rückgabewert

KeSetKernelStackSwapEnable gibt einen BOOLESCHEN Wert zurück, der angibt, ob der Stapelaustausch zum Zeitpunkt der Aufrufinitiiert wurde. 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 sein Stapel auslagerungsfähig oder im Arbeitsspeicher gesperrt ist.

Stapelaustausch kann nur erfolgen, wenn sich der Thread in einem Wartezustand befindet, der durch eine Anforderung von einer Benutzermodusanwendung verursacht wurde. Stapelaustausch findet niemals für Wartezustände statt, die von Kernelmoduskomponenten initiiert werden, unabhängig davon, ob der Stapelaustausch aktiviert ist.

Es ist in der Regel nicht erforderlich, den Stapelaustausch zu deaktivieren. Dies geschieht nur in seltenen Fällen. Ein Beispiel, in dem Alternativen zum Deaktivieren des Stapelaustauschs erläutert werden, finden Sie weiter unten im Abschnitt Beispiel.

Bei einem Aufruf einer Warteroutine im Kernelmodus, z. B. KeWaitForSingleObject, gibt der Aufrufer einen WaitMode-Parameter an, um anzugeben, ob der Aufrufer im Kernel- oder Benutzermodus wartet. Wenn WaitModeUserMode = und die Wartezeit ausreichend lang ist, kann der Speicher-Manager Abschnitte des Stapels ausblättern, die zum wartenden Thread gehören. Wenn der Stapel jedoch Datenelemente enthält, die für die Dauer des Wartezeitraums speicherresident bleiben müssen, kann der Thread verhindern, dass der Stapel ausgelagerungt wird, indem KeSetKernelStackSwapEnable aufgerufen und EnableFALSE = angegeben 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 einer Benutzermodusanwendung verursacht wird, und WaitMode wird auf KernelMode festgelegt, um anzugeben, dass der Wartemodus im Kernelmodus auftritt. Nach Abschluss der Wartezeit ruft der Thread KeSetKernelStackSwap bei Bedarf erneut auf, um den ursprünglichen Stapelaustauschzustand 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 signalisierten oder nicht signalisierten 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 nicht erforderlich und kann vermieden werden, indem nur auslagerungsfähige Datenelemente auf dem Stapel zugewiesen werden. Im vorherigen Beispiel muss der Treiberthread den Stapel sperren, da das Ereignisobjekt auf dem Stapel zugeordnet ist. Eine bessere Alternative ist möglicherweise, einfach das Ereignis aus einem nicht ausgelagerten Pool zuzuordnen.

Anforderungen

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

Weitere Informationen:

KeInitializeEvent

KeWaitForSingleObject