Condividi tramite


Funzione KeSetKernelStackSwapEnable (ntifs.h)

La routine KeSetKernelStackSwapEnable abilita e disabilita lo scambio dello stack del chiamante su disco.

Sintassi

BOOLEAN KeSetKernelStackSwapEnable(
  [in] BOOLEAN Enable
);

Parametri

[in] Enable

Specifica se abilitare lo scambio dello stack appartenente al thread chiamante. Se TRUE, lo scambio è abilitato e il contenuto dello stack può essere impaginato in e fuori memoria. Se FALSE, lo scambio è disabilitato e lo stack è residente in memoria.

Valore restituito

KeSetKernelStackSwapEnable restituisce un valore BOOLEAN che indica se lo scambio dello stack è stato abilitato al momento dell'avvio della chiamata. Questo valore è TRUE se lo scambio dello stack è stato abilitato in precedenza ed è false se è stato disabilitato.

Osservazioni

Un driver in modalità kernel può chiamare questa routine per controllare se lo stack è impaginabile o bloccato in memoria.

Lo scambio dello stack può verificarsi solo se il thread è in uno stato di attesa causato da una richiesta da un'applicazione in modalità utente. Lo scambio dello stack non si verifica mai per gli stati di attesa avviati dai componenti in modalità kernel, indipendentemente dal fatto che lo scambio dello stack sia abilitato.

In genere non è necessario disabilitare lo scambio dello stack. Eseguire questa operazione solo in rari casi. Per un esempio che illustra le alternative alla disabilitazione dello scambio dello stack, vedere la sezione Esempio di seguito.

In una chiamata a una routine di attesa in modalità kernel, ad esempio KeWaitForSingleObject, il chiamante specifica un parametro WaitMode per indicare se il chiamante attende in modalità kernel o in modalità utente. Se WaitMode = UserModee se la durata di attesa è sufficientemente lunga, gestione memoria potrebbe uscire dalle sezioni dello stack che appartiene al thread in attesa. Tuttavia, se lo stack contiene elementi di dati che devono rimanere residenti in memoria per la durata dell'attesa, il thread può impedire che lo stack venga sottoposto a paging chiamando KeSetKernelStackSwapEnable e specificando Enable = FALSE.

Un thread non deve uscire (terminare) mentre lo scambio dello stack è disabilitato o si verificherà un controllo dei bug di sistema.

Esempio

Nell'esempio di codice seguente, un thread del driver alloca un evento nello stack e chiama KeSetKernelStackSwap per bloccare temporaneamente lo stack in memoria finché l'evento non viene segnalato. Il driver chiama KeWaitForSingleObject con un WaitReason di UserRequest per indicare che il thread è in stato di attesa causato da una richiesta da un'applicazione in modalità utente e WaitMode impostato su KernelMode per indicare che l'attesa si sta verificando in modalità kernel. Al termine dell'attesa, il thread chiama KeSetKernelStackSwap, se necessario, per ripristinare lo stato di scambio dello stack originale del thread.

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);
}

Un oggetto evento deve essere residente in memoria mentre può essere impostato su uno stato segnalato o non firmato oppure mentre un thread attende l'evento. Per altre informazioni, vedere Definizione e utilizzo di un oggetto evento.

Spesso, l'uso della routine KeSetKernelStackSwap non è necessario e può essere evitato allocando solo elementi di dati impaginabili nello stack. Nell'esempio precedente, il thread del driver deve bloccare lo stack perché l'oggetto evento viene allocato nello stack. Un'alternativa migliore potrebbe essere quella di allocare semplicemente l'evento da un pool non di paging.

Fabbisogno

Requisito Valore
client minimo supportato Windows 2000
piattaforma di destinazione Universale
intestazione ntifs.h (include Ntifs.h, Fltkernel.h)
libreria NtosKrnl.lib
dll NtosKrnl.exe
IRQL <= APC_LEVEL

Vedere anche

KeInitializeEvent

KeWaitForSingleObject