KeExpandKernelStackAndCalloutEx 函式 (ntddk.h)
KeExpandKernelStackAndCalloutEx 例程會呼叫例程,並保證此呼叫可以使用指定的堆棧空間量。
語法
NTSTATUS KeExpandKernelStackAndCalloutEx(
PEXPAND_STACK_CALLOUT Callout,
PVOID Parameter,
SIZE_T Size,
BOOLEAN Wait,
PVOID Context
);
參數
Callout
ExpandedStackCall 例程的函式指標。 KeExpandKernelStackAndCalloutEx 會視需要擴充堆棧,再呼叫此例程。
Parameter
指定要傳遞至 ExpandedStackCall 例程的參數值。
Size
指定要為 ExpandedStackCall 例程呼叫提供的堆疊空間位元組數目。 這個值必須夠大,才能容納 ExpandedStackCall 例程的堆疊使用量,以及此例程可能進行的任何呼叫。 Size 值不能超過 MAXIMUM_EXPANSION_SIZE。
Wait
指定例程是否應該等候在此空間立即可用時配置所需的堆疊空間。 如果例程可以等候已展開的堆疊配置,請將 [等候] 設定為 TRUE 。 否則,請將 [等候] 設定為 [FALSE]。 如果在 IRQL = DISPATCH_LEVEL呼叫 KeExpandKernelStackAndCalloutEx,則此參數必須為 FALSE。
Context
保留的。 一律將此參數設定為 NULL。
傳回值
如果呼叫成功,KeExpandKernelStackAndCalloutEx 會傳回STATUS_SUCCESS。 可能的傳回值包括下列錯誤碼。
傳回碼 | Description |
---|---|
STATUS_INVALID_PARAMETER_3 | Size 參數大於 MAXIMUM_EXPANSION_SIZE。 |
STATUS_INVALID_PARAMETER_4 | Wait 參數為 TRUE,但在 IRQL = DISPATCH_LEVEL呼叫例程。 |
STATUS_NO_MEMORY | 記憶體不足,無法擴充堆疊。 |
STATUS_STACK_OVERFLOW | 如果展開,堆疊會超過操作系統對堆疊空間的內部限制。 |
備註
此例程會先判斷目前堆疊上是否提供 大小 位元組下限,以便呼叫 ExpandedStackCall 例程。 如果沒有, KeExpandKernelStackAndCalloutEx 會嘗試依 大小 位元組展開目前的堆疊。 如果此數量無法擴充目前的堆疊, KeExpandKernelStackAndCalloutEx 會暫時配置新的核心堆棧區段。 如果需要大小的堆疊可用, KeExpandKernelStackAndCalloutEx 會使用此堆棧來呼叫 ExpandedStackCall 例程。
如果 KeExpandKernelStackAndCalloutEx 無法取得所需的堆疊空間,則會傳回而不呼叫 ExpandedStackCall 例程。 只有在 KeExpandKernelStackAndCalloutEx 能夠呼叫 ExpandedStackCall 例程時,才會傳回STATUS_SUCCESS。 否則,它會傳回錯誤碼。
KeExpandKernelStackAndCalloutEx 未在頭檔中宣告。 若要在驅動程式中使用這個例程,請在驅動程式程式代碼中包含下列函式宣告:
#if (NTDDI_VERSION >= NTDDI_VISTA)
__checkReturn
__drv_minIRQL(PASSIVE_LEVEL)
__drv_maxIRQL(DISPATCH_LEVEL)
__drv_reportError("DISPATCH_LEVEL is only supported on Windows 7 or later versions of Windows.")
NTKERNELAPI
NTSTATUS
KeExpandKernelStackAndCalloutEx (
__in PEXPAND_STACK_CALLOUT Callout,
__in_opt PVOID Parameter,
__in SIZE_T Size,
__in BOOLEAN Wait,
__in_opt PVOID Context
);
#endif
KeExpandKernelStackAndCallout 例程類似於 KeExpandKernelStackAndCalloutEx,但沒有 Wait 和 Context 參數。 此外, KeExpandKernelStackAndCallout 一律必須在 IRQL <= APC_LEVEL呼叫,而 KeExpandKernelStackAndCalloutEx 則只能在DISPATCH_LEVEL (呼叫,但只有在 Wait 為 FALSE) 時才呼叫。
呼叫線程必須等到線程的 ExpandedStackCall 例程傳回之後,才呼叫 PsTerminateSystemThread 例程。 PsTerminateSystemThread 會檢查,以判斷 ExpandedStackCall 例程是否仍在使用中,如果為 ,則會導致錯誤檢查。
在 Windows Vista 和 Windows Server 2008 中, KeExpandKernelStackAndCalloutEx 必須在 IRQL <= APC_LEVEL呼叫。 在 Windows 7、Windows Server 2008 R2 和更新版本的 Windows 中,您可以在 IRQL <= DISPATCH_LEVEL呼叫此例程。 不過,如果在DISPATCH_LEVEL呼叫例程, 則 Wait 參數必須是 FALSE 。 如果 Wait 為 TRUE,則呼叫必須在 IRQL <= APC_LEVEL發生。
規格需求
需求 | 值 |
---|---|
最低支援的用戶端 | 從 Windows Vista 開始提供。 |
目標平台 | Universal |
標頭 | ntddk.h |
程式庫 | NtosKrnl.lib |
Dll | NtosKrnl.exe |
IRQL | 請參閱一節。 |
另請參閱
ExpandedStackCallKeExpandKernelStackAndCalloutPsTerminateSystemThread