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,但沒有 WaitContext 參數。 此外, KeExpandKernelStackAndCallout 一律必須在 IRQL <= APC_LEVEL呼叫,而 KeExpandKernelStackAndCalloutEx 則只能在DISPATCH_LEVEL (呼叫,但只有在 WaitFALSE) 時才呼叫。

呼叫線程必須等到線程的 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 。 如果 WaitTRUE,則呼叫必須在 IRQL <= APC_LEVEL發生。

規格需求

需求
最低支援的用戶端 從 Windows Vista 開始提供。
目標平台 Universal
標頭 ntddk.h
程式庫 NtosKrnl.lib
Dll NtosKrnl.exe
IRQL 請參閱一節。

另請參閱

ExpandedStackCallKeExpandKernelStackAndCalloutPsTerminateSystemThread