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,但没有 Wait 和 Context 参数。 此外,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