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