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 ,以暫時鎖定記憶體中的堆疊,直到事件發出訊號為止。 驅動程式會使用 UserRequest 的 WaitReason 呼叫 KeWaitForSingleObject,以指出其線程處於來自使用者模式應用程式的要求所造成的等候狀態,而 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 |
目標平台 | Universal |
標頭 | ntifs.h (包括 Ntifs.h、Fltkernel.h) |
程式庫 | NtosKrnl.lib |
Dll | NtosKrnl.exe |
IRQL | <= APC_LEVEL |