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 ,以暫時鎖定記憶體中的堆疊,直到事件收到訊號為止。 驅動程式會使用UserRequestWaitReason呼叫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 開始提供。
目標平臺 環球
標頭 ntifs.h (包含 Ntifs.h、Fltkernel.h)
程式庫 NtosKrnl.lib
DLL NtosKrnl.exe
IRQL <= APC_LEVEL

另請參閱

KeInitializeEvent

KeWaitForSingleObject