Функция 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