Поделиться через


Функция 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. Этот параметр должен иметь значение FALSE , если keExpandKernelStackAndCalloutEx вызывается по адресу IRQL = DISPATCH_LEVEL.

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 возвращает STATUS_SUCCESS, только если он может вызвать подпрограмму ExpandedStackCall . В противном случае возвращается код ошибки.

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).

Вызывающий поток не должен вызывать подпрограмму PsTerminateSystemThread до тех пор, пока не будет возвращена подпрограмма ExpandedStackCall потока. PsTerminateSystemThread проверяет, активна ли подпрограмма ExpandedStackCall и вызывает ли она ошибку проверка.

В Windows Vista и Windows Server 2008 метод KeExpandKernelStackAndCalloutEx должен вызываться по адресу IRQL <= APC_LEVEL. В Windows 7, Windows Server 2008 R2 и более поздних версиях Windows эту подпрограмму можно вызывать по адресу IRQL <= DISPATCH_LEVEL. Однако параметр Wait должен иметь значение FALSE , если подпрограмма вызывается в DISPATCH_LEVEL. Если значение Wait имеет значение TRUE, вызов должен выполняться по адресу IRQL <= APC_LEVEL.

Требования

Требование Значение
Минимальная версия клиента Доступно начиная с Windows Vista.
Целевая платформа Универсальное
Верхняя часть ntddk.h
Библиотека NtosKrnl.lib
DLL NtosKrnl.exe
IRQL См. раздел "Примечания".

См. также раздел

ExpandedStackCallKeExpandKernelStackAndCalloutPsTerminateSystemThread