Функция KeSetKernelStackSwapEnable (ntifs.h)
Подпрограмма KeSetKernelStackSwapEnable включает и отключает переключение стека вызывающего объекта на диск.
Синтаксис
BOOLEAN KeSetKernelStackSwapEnable(
[in] BOOLEAN Enable
);
Параметры
[in] Enable
Указывает, следует ли включить переключение стека, который принадлежит вызывающей цепочке. Если задано значение TRUE, переключение включено, и содержимое стека может быть выложено на страницы в памяти и из него. Если значение РАВНО FALSE, переключение отключено, а стек находится в памяти.
Возвращаемое значение
KeSetKernelStackSwapEnable возвращает значение BOOLEAN, указывающее, было ли включено переключение стека во время инициации вызова. Это значение равно TRUE , если переключение стека было включено ранее, и false , если оно было отключено.
Комментарии
Драйвер режима ядра может вызывать эту подпрограмму для управления тем, является ли его стек страничной или заблокирован в памяти.
Переключение стека может происходить только в том случае, если поток находится в состоянии ожидания, вызванном запросом от приложения пользовательского режима. Переключение стека никогда не происходит для состояний ожидания, инициированных компонентами режима ядра, независимо от того, включено ли переключение стека.
Обычно отключать переключение стека не требуется. Это можно сделать только в редких случаях. Пример, в котором рассматриваются альтернативы отключению переключения стека, см. в разделе Пример ниже.
При вызове подпрограммы ожидания в режиме ядра, например KeWaitForSingleObject, вызывающий объект задает параметр WaitMode , чтобы указать, ожидает ли вызывающий объект в режиме ядра или в пользовательском режиме. Если WaitModeUserMode = и продолжительность ожидания достаточно длинна, диспетчер памяти может вывести разделы стека, принадлежащие ожидающему потоку. Однако если стек содержит элементы данных, которые должны оставаться резидентными в памяти в течение времени ожидания, поток может предотвратить выгружение стека, вызвав 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 (включая Ntifs.h, Fltkernel.h) |
Библиотека | NtosKrnl.lib |
DLL | NtosKrnl.exe |
IRQL | <= APC_LEVEL |