KeSetKernelStackSwapEnable 函式 (ntifs.h)
KeSetKernelStackSwapEnable 例程會啟用和停用呼叫端堆疊交換至磁碟。
語法
BOOLEAN KeSetKernelStackSwapEnable(
[in] BOOLEAN Enable
);
參數
[in] Enable
指定是否要啟用屬於呼叫線程的堆疊交換。 如果 TRUE,則會啟用交換,而且堆疊的內容可以分頁進出記憶體。 如果 FALSE,則會停用交換,而且堆疊是記憶體駐地。
傳回值
KeSetKernelStackSwapEnable 會傳回 BOOLEAN 值,指出是否在起始呼叫時啟用堆棧交換。 如果先前已啟用堆棧交換,且在停用堆疊交換時,此值會 TRUE,且為 FALSE。
言論
內核模式驅動程式可以呼叫此例程來控制其堆疊是否可分頁或鎖定在記憶體中。
只有在線程處於使用者模式應用程式要求所造成的等候狀態時,才會發生堆棧交換。 不論是否啟用堆疊交換,堆疊交換永遠不會發生由內核模式元件起始的等候狀態。
通常不需要停用堆疊交換。 只有在罕見的情況下才這麼做。 如需討論停用堆疊交換替代方案的範例,請參閱下方的一節。
在核心模式等候例程的呼叫中,例如 KeWaitForSingleObject,呼叫者會指定 WaitMode 參數,以指出呼叫者在內核模式或使用者模式中等候。 如果 WaitMode = UserMode,而且如果等候持續時間足夠長,記憶體管理員可能會分頁出屬於等候線程的堆疊區段。 不過,如果堆疊包含在等候期間必須保留記憶體駐地的數據項,線程就可以呼叫 KeSetKernelStackSwapEnable 並 指定 [啟用] = FALSE來防止堆疊分頁。
停用堆疊交換時,線程不得結束(終止),否則會發生系統錯誤檢查。
例
在下列程式代碼範例中,驅動程式線程會在其堆疊上配置事件,並呼叫 KeSetKernelStackSwap,以暫時鎖定記憶體中的堆疊,直到事件收到訊號為止。 驅動程式會呼叫 KeWaitForSingleObjectWaitReasonUserRequest,表示其線程處於使用者模式應用程式要求所造成的等候狀態,並將 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 |