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。 否则,请将 Wait 设置为 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 参数。 此外,KeExpandKernelStackAndCallout 必须始终在 IRQL <= APC_LEVEL调用,而 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。 如果 等待TRUE,则必须在 IRQL <= APC_LEVEL 进行调用。

要求

要求 价值
最低支持的客户端 从 Windows Vista 开始可用。
目标平台 普遍
标头 ntddk.h
NtosKrnl.lib
DLL NtosKrnl.exe
IRQL 请参阅“备注”部分。

另请参阅

ExpandedStackCallKeExpandKernelStackAndCalloutPsTerminateSystemThread