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 |