Функция KeSetKernelStackSwapEnable (ntifs.h)

Подпрограмма KeSetKernelStackSwapEnable включает и отключает переключение стека вызывающего объекта на диск.

Синтаксис

BOOLEAN KeSetKernelStackSwapEnable(
  [in] BOOLEAN Enable
);

Параметры

[in] Enable

Указывает, следует ли включать переключение стека, принадлежащее вызывающей цепочке. Если задано значение TRUE, переключение включено, а содержимое стека можно вывести на страницы в памяти и за пределы памяти. Если задано значение FALSE, переключение отключено и стек находится в памяти.

Возвращаемое значение

KeSetKernelStackSwapEnable возвращает значение BOOLEAN, указывающее, включено ли переключение стека во время инициации вызова. Это значение равно TRUE , если переключение стека было включено ранее и имеет значение FALSE , если он был отключен.

Комментарии

Драйвер в режиме ядра может вызвать эту подпрограмму для управления возможностью страничного стека или блокировки в памяти.

Переключение стека может происходить только в том случае, если поток находится в состоянии ожидания, вызванном запросом из приложения в пользовательском режиме. Переключение стека никогда не происходит для состояний ожидания, инициированных компонентами режима ядра, независимо от того, включено ли переключение стека.

Обычно не требуется отключать переключение стека. Это можно сделать только в редких случаях. Пример, в котором рассматриваются альтернативы отключению замены стека, см. в разделе "Пример" ниже.

В вызове подпрограммы ожидания в режиме ядра, например KeWaitForSingleObject, вызывающий объект задает параметр WaitMode , указывающий, ожидает ли вызывающий объект в режиме ядра или пользовательском режиме. Если WaitMode UserMode = и продолжительность ожидания достаточно длинна, диспетчер памяти может вывести разделы стека, принадлежащие ожидающему потоку. Однако если стек содержит элементы данных, которые должны оставаться в памяти в течение времени ожидания, поток может предотвратить разбиение стека, вызвав KeSetKernelStackSwapEnable и указав enable = FALSE.

Поток не должен выйти (завершить) во время отключения переключения стека или произойдет проверка системной ошибки.

Пример

В следующем примере кода поток драйвера выделяет событие в своем стеке и вызывает KeSetKernelStackSwap для временной блокировки стека в памяти, пока событие не будет сигнализировать. Драйвер вызывает KeWaitForSingleObject с waitReasonuserRequest , чтобы указать, что его поток находится в состоянии ожидания, вызванном запросом из приложения в пользовательском режиме, и WaitMode имеет значение KernelMode , чтобы указать, что ожидание происходит в режиме ядра. После завершения ожидания поток снова вызывает KeSetKernelStackSwap , если это необходимо, чтобы восстановить исходное состояние замены стека потока.

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

Объект события должен быть резидентом памяти, если он может быть задан в сигнальном или неназначаемом состоянии, или во время ожидания потока события. Дополнительные сведения см. в разделе "Определение и использование объекта события".

Часто использование подпрограммы KeSetKernelStackSwap является ненужным и можно избежать путем выделения только страничных элементов данных в стеке. В предыдущем примере поток драйвера должен заблокировать стек, так как объект события выделяется в стеке. Лучше всего выделить событие из непагружаемого пула.

Требования

   
Минимальная версия клиента Доступно начиная с Windows 2000.
Целевая платформа Универсальное
Заголовок ntifs.h (include Ntifs.h, Fltkernel.h)
Библиотека NtosKrnl.lib
DLL NtosKrnl.exe
IRQL <= APC_LEVEL

См. также раздел

KeInitializeEvent

KeWaitForSingleObject