Функция KeSetKernelStackSwapEnable (ntifs.h)
Программа KeSetKernelStackSwapEnable включает и отключает переключение стека вызывающего объекта на диск.
Синтаксис
BOOLEAN KeSetKernelStackSwapEnable(
[in] BOOLEAN Enable
);
Параметры
[in] Enable
Указывает, следует ли включить переключение стека, принадлежащее вызывающей потоку. Если TRUE, то переключение включено, а содержимое стека можно вывести на страницу и из памяти. Если FALSE, переключение отключено, а стек находится в памяти.
Возвращаемое значение
KeSetKernelStackSwapEnable возвращает логическое значение, указывающее, включена ли переключение стека во время инициированного вызова. Это значение TRUE, если стек переключения ранее был включен и FALSE, если он был отключен.
Замечания
Драйвер в режиме ядра может вызывать эту подпрограмму для управления тем, доступен ли его стек на страницы или заблокирован в памяти.
Переключение стека может происходить только в том случае, если поток находится в состоянии ожидания, вызванном запросом из приложения пользовательского режима. Замена стека никогда не возникает для состояний ожидания, инициируемых компонентами режима ядра, независимо от того, включена ли переключение стека.
Обычно не требуется отключить переключение стека. Это делается только в редких случаях. Пример, в котором рассматриваются альтернативные варианты отключения переключения стека, см. в разделе "Пример" ниже.
При вызове подпрограммы ожидания в режиме ядра, например KeWaitForSingleObject, вызывающий объект задает параметр WaitMode, чтобы указать, ожидает ли вызывающий объект в режиме ядра или в пользовательском режиме. Если WaitMode = UserModeи если продолжительность ожидания достаточно длинна, диспетчер памяти может вывести разделы стека, принадлежащие потоку ожидания. Однако если стек содержит элементы данных, которые должны оставаться резидентными в памяти в течение срока ожидания, поток может предотвратить страницу стека путем вызова KeSetKernelStackSwapEn able и указания Включить = 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 |