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,但没有 Wait 和 Context 参数。 此外,必须始终在 IRQL <= APC_LEVEL调用 KeExpandKernelStackAndCallout,而 KeExpandKernelStackAndCalloutEx 可在DISPATCH_LEVEL (调用,但前提是 Wait 为 FALSE) 。
在线程的 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 。 如果 Wait 为 TRUE,则必须在 IRQL <= APC_LEVEL 进行调用。
要求
要求 | 值 |
---|---|
最低受支持的客户端 | 从 Windows Vista 开始可用。 |
目标平台 | 通用 |
标头 | ntddk.h |
Library | NtosKrnl.lib |
DLL | NtosKrnl.exe |
IRQL | 请参见“备注”部分。 |
另请参阅
ExpandedStackCallKeExpandKernelStackAndCalloutPsTerminateSystemThread