Função KeSetKernelStackSwapEnable (ntifs.h)

A rotina KeSetKernelStackSwapEnable habilita e desabilita a troca da pilha do chamador para o disco.

Sintaxe

BOOLEAN KeSetKernelStackSwapEnable(
  [in] BOOLEAN Enable
);

Parâmetros

[in] Enable

Especifica se a troca da pilha que pertence ao thread de chamada deve ser habilitada. Se TRUE, a troca será habilitada e o conteúdo da pilha poderá ser paginado dentro e fora da memória. Se FALSE, a troca será desabilitada e a pilha será residente em memória.

Retornar valor

KeSetKernelStackSwapEnable retorna um valor BOOLEAN que indica se a troca de pilha foi habilitada no momento em que a chamada foi iniciada. Esse valor será TRUE se a troca de pilha tiver sido habilitada anteriormente e for FALSE se tiver sido desabilitada.

Comentários

Um driver de modo kernel pode chamar essa rotina para controlar se sua pilha é paginável ou bloqueada na memória.

A troca de pilha só poderá ocorrer se o thread estiver em um estado de espera causado por uma solicitação de um aplicativo de modo de usuário. A troca de pilha nunca ocorre para estados de espera iniciados por componentes do modo kernel, independentemente de a troca de pilha estar habilitada.

Normalmente, não é necessário desabilitar a troca de pilha. Faça isso apenas em casos raros. Para obter um exemplo que discute alternativas para desabilitar a troca de pilhas, consulte a seção Exemplo abaixo.

Em uma chamada para uma rotina de espera no modo kernel, como KeWaitForSingleObject, o chamador especifica um parâmetro WaitMode para indicar se o chamador aguarda no modo kernel ou no modo de usuário. Se WaitMode = UserMode e se a duração da espera for suficientemente longa, o gerenciador de memória poderá paginar seções da pilha que pertence ao thread de espera. No entanto, se a pilha contiver itens de dados que devem permanecer residentes na memória durante a espera, o thread poderá impedir que a pilha seja paginada chamando KeSetKernelStackSwapEnable e especificando Enable = FALSE.

Um thread não deve sair (terminar) enquanto a troca de pilha estiver desabilitada ou ocorrerá um bug do sistema marcar.

Exemplo

No exemplo de código a seguir, um thread de driver aloca um evento em sua pilha e chama KeSetKernelStackSwap para bloquear temporariamente a pilha na memória até que o evento seja sinalizado. O driver chama KeWaitForSingleObject com um WaitReason de UserRequest para indicar que seu thread está em um estado de espera causado por uma solicitação de um aplicativo de modo de usuário e WaitMode definido como KernelMode para indicar que a espera está ocorrendo no modo kernel. Depois que a espera for concluída, o thread chamará KeSetKernelStackSwap novamente, se necessário, para restaurar o estado de troca de pilha original do 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);
}

Um objeto de evento deve ser residente em memória enquanto pode ser definido como um estado sinalizado ou não atribuído ou enquanto um thread aguarda o evento. Para obter mais informações, consulte Definindo e usando um objeto event.

Frequentemente, o uso da rotina KeSetKernelStackSwap é desnecessário e pode ser evitado alocando apenas itens de dados pagináveis na pilha. No exemplo anterior, o thread de driver deve bloquear a pilha porque o objeto de evento é alocado na pilha. Uma alternativa melhor pode ser simplesmente alocar o evento do pool nãopagado.

Requisitos

Requisito Valor
Cliente mínimo com suporte Windows 2000
Plataforma de Destino Universal
Cabeçalho ntifs.h (include Ntifs.h, Fltkernel.h)
Biblioteca NtosKrnl.lib
DLL NtosKrnl.exe
IRQL <= APC_LEVEL

Confira também

KeInitializeEvent

KeWaitForSingleObject