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 如果展开,堆栈将超过操作系统对堆栈空间的内部限制。

注解

此例程首先确定当前堆栈上是否最小 大小 字节可用于 调用 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 参数。 此外,必须始终在 IRQL <= APC_LEVEL调用 KeExpandKernelStackAndCallout,而 KeExpandKernelStackAndCalloutEx 可在DISPATCH_LEVEL (调用,但前提是 WaitFALSE) 。

在线程的 ExpandedStackCall 例程返回之前,调用线程不得调用 PsTerminateSystemThread 例程。 PsTerminateSystemThread 检查可确定 ExpandedStackCall 例程是否仍处于活动状态,如果仍处于活动状态,则会导致 bug 检查。

在 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
Library NtosKrnl.lib
DLL NtosKrnl.exe
IRQL 请参见“备注”部分。

另请参阅

ExpandedStackCallKeExpandKernelStackAndCalloutPsTerminateSystemThread