Compartilhar via


Função KeSetKernelStackSwapEnable (ntifs.h)

A rotina de 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 é necessário habilitar a troca da pilha que pertence ao thread de chamada. Se VERDADEIRO, 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.

Valor de retorno

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á VERDADEIRO se a troca de pilha tiver sido habilitada anteriormente e for FALSE se estiver desabilitada.

Observações

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

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

Normalmente, não é necessário desabilitar a troca de pilhas. 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 = UserModee, se a duração da espera for suficientemente longa, o gerenciador de memória poderá executar a página de 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 excluída chamando KeSetKernelStackSwapEnable e especificando Enable = FALSE.

Um thread não deve sair (encerrar) enquanto a troca de pilha estiver desabilitada ou ocorrerá uma verificação de bug do sistema.

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 uma WaitReason de UserRequest para indicar que seu thread está em um estado de espera causado por uma solicitação de um aplicativo no modo de usuário e WaitMode definido como kernelMode para indicar que a espera está ocorrendo no modo kernel. Após a conclusão da espera, o thread chama 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 no evento. Para obter mais informações, consulte Definindo e usando um objeto de evento.

Frequentemente, o uso da rotina de keSetKernelStackSwap é desnecessário e pode ser evitado alocando apenas itens de dados pagináveis na pilha. No exemplo anterior, o thread do 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
de cliente com suporte mínimo Windows 2000
da Plataforma de Destino Universal
cabeçalho ntifs.h (inclua Ntifs.h, Fltkernel.h)
biblioteca NtosKrnl.lib
de DLL NtosKrnl.exe
IRQL <= APC_LEVEL

Consulte também

KeInitializeEvent

KeWaitForSingleObject