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


Функция KeExpandKernelStackAndCalloutEx (ntddk.h)

Подпрограмма KeExpandKernelStackAndCalloutEx вызывает подпрограмму и гарантирует, что для этого вызова доступно указанное количество пространства стека.

Синтаксис

NTSTATUS KeExpandKernelStackAndCalloutEx(
  PEXPAND_STACK_CALLOUT Callout,
  PVOID                 Parameter,
  SIZE_T                Size,
  BOOLEAN               Wait,
  PVOID                 Context
);

Параметры

Callout

Указатель функции на подпрограмму ExpandedStackC all. KeExpandKernelStackAndCalloutEx развертывает стек при необходимости, прежде чем вызывать эту подпрограмму.

Parameter

Указывает значение параметра для передачи в подпрограмму ExpandedStackCall.

Size

Указывает количество байтов пространства стека для вызова подпрограммы ExpandedStackCall. Это значение должно быть достаточно большим, чтобы разместить использование стека ExpandedStackCall подпрограммы и любого вызова, который может сделать эта подпрограмма. Значение размера не должно превышать MAXIMUM_EXPANSION_SIZE.

Wait

Указывает, должна ли подпрограмма ждать выделения требуемого пространства стека, если это пространство не доступно немедленно. Задайте значение wait to TRUE, если подпрограмма может ожидать выделения развернутого стека. В противном случае задайте значение Wait to 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, но не имеет параметров ожиданий и контекста. Кроме того, KeExpandKernelStackAndCallout всегда вызываться в IRQL <= APC_LEVEL, в то время как KeExpandKernelStackAndCalloutEx можно вызывать по DISPATCH_LEVEL (но только если ожиданиеfalse).

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

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

Требования

Требование Ценность
минимальные поддерживаемые клиентские Доступно начиная с Windows Vista.
целевая платформа Всеобщий
заголовка ntddk.h
библиотеки NtosKrnl.lib
DLL NtosKrnl.exe
IRQL См. раздел "Примечания".

См. также

ExpandedStackCallKeExpandKernelStackAndCalloutPsTerminateSystemThread