Función KeSetKernelStackSwapEnable (ntifs.h)

La rutina KeSetKernelStackSwapEnable habilita y deshabilita el intercambio de la pila del autor de la llamada al disco.

Sintaxis

BOOLEAN KeSetKernelStackSwapEnable(
  [in] BOOLEAN Enable
);

Parámetros

[in] Enable

Especifica si se va a habilitar el intercambio de la pila que pertenece al subproceso que llama. Si es TRUE, el intercambio está habilitado y el contenido de la pila se puede paginar dentro y fuera de memoria. Si es FALSE, el intercambio está deshabilitado y la pila es residente en memoria.

Valor devuelto

KeSetKernelStackSwapEnable devuelve un valor BOOLEAN que indica si se habilitó el intercambio de pila en el momento en que se inició la llamada. Este valor es TRUE si el intercambio de pila se ha habilitado anteriormente y es FALSE si se ha deshabilitado.

Comentarios

Un controlador en modo kernel puede llamar a esta rutina para controlar si su pila es paginable o bloqueada en memoria.

El intercambio de pila solo puede producirse si el subproceso está en un estado de espera causado por una solicitud de una aplicación en modo de usuario. El intercambio de pila nunca se produce para los estados de espera iniciados por los componentes en modo kernel, independientemente de si el intercambio de pila está habilitado.

Normalmente, no es necesario deshabilitar el intercambio de pila. Haz esto solo en raras ocasiones. Para ver un ejemplo en el que se describen alternativas a la deshabilitación del intercambio de pila, consulte la sección Ejemplo siguiente.

En una llamada a una rutina de espera en modo kernel, como KeWaitForSingleObject, el autor de la llamada especifica un parámetro WaitMode para indicar si el autor de la llamada espera en modo kernel o modo de usuario. Si WaitMode UserMode = y si la duración de la espera es suficientemente larga, el administrador de memoria podría paginar secciones de la pila que pertenece al subproceso en espera. Sin embargo, si la pila contiene elementos de datos que deben permanecer residentes en memoria durante la espera, el subproceso puede impedir que se pagina la pila llamando a KeSetKernelStackSwapEnable y especificando Enable = FALSE.

Un subproceso no debe salir (finalizar) mientras se deshabilita el intercambio de pila o se producirá una comprobación de errores del sistema.

Ejemplo

En el ejemplo de código siguiente, un subproceso de controlador asigna un evento en su pila y llama a KeSetKernelStackSwap para bloquear temporalmente la pila en memoria hasta que se señale el evento. El controlador llama a KeWaitForSingleObject con waitReason de UserRequest para indicar que su subproceso está en un estado de espera causado por una solicitud de una aplicación en modo de usuario y WaitMode establecido en KernelMode para indicar que la espera se está produciendo en modo kernel. Una vez completada la espera, el subproceso llama de nuevo a KeSetKernelStackSwap , si es necesario, para restaurar el estado de intercambio de pila original del subproceso.

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 objeto de evento debe ser residente en memoria mientras se puede establecer en un estado señalado o no asignado, o mientras un subproceso espera en el evento. Para obtener más información, vea Definición y uso de un objeto de evento.

Con frecuencia, el uso de la rutina KeSetKernelStackSwap no es necesario y se puede evitar asignando solo elementos de datos paginables en la pila. En el ejemplo anterior, el subproceso del controlador debe bloquear la pila porque el objeto de evento se asigna en la pila. Una alternativa mejor podría ser asignar simplemente el evento desde un grupo no paginado.

Requisitos

   
Cliente mínimo compatible Disponible a partir de Windows 2000.
Plataforma de destino Universal
Header ntifs.h (incluya Ntifs.h, Fltkernel.h)
Library NtosKrnl.lib
Archivo DLL NtosKrnl.exe
IRQL <= APC_LEVEL

Vea también

KeInitializeEvent

KeWaitForSingleObject