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。 可能的傳回值包括下列錯誤碼。
傳回碼 | 描述 |
---|---|
STATUS_INVALID_PARAMETER_3 | Size 參數大於 MAXIMUM_EXPANSION_SIZE。 |
STATUS_INVALID_PARAMETER_4 | Wait 參數為 TRUE,但例程在 IRQL = DISPATCH_LEVEL呼叫。 |
STATUS_NO_MEMORY | 記憶體不足,無法展開堆疊。 |
STATUS_STACK_OVERFLOW | 如果展開,堆疊將會超過作系統對堆疊空間的內部限制。 |
言論
此例程會先判斷目前堆疊上是否有 Size 位元組的最小可用,以便呼叫 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 中,必須在 IRQL <= APC_LEVEL 呼叫 KeExpandKernelStackAndCalloutEx。 在 Windows 7、Windows Server 2008 R2 和更新版本的 Windows 中,此例程可以在 IRQL <= DISPATCH_LEVEL呼叫。 不過,如果在DISPATCH_LEVEL呼叫例程,Wait 參數必須 FALSE。 如果 WaitTRUE,則呼叫必須發生在 IRQL <= APC_LEVEL。
要求
要求 | 價值 |
---|---|
最低支援的用戶端 | 從 Windows Vista 開始提供。 |
目標平臺 | 普遍 |
標頭 | ntddk.h |
連結庫 | NtosKrnl.lib |
DLL | NtosKrnl.exe |
IRQL | 請參閱一節。 |
另請參閱
ExpandedStackCallKeExpandKernelStackAndCalloutPsTerminateSystemThread