Função KeExpandKernelStackAndCalloutEx (ntddk.h)

A rotina KeExpandKernelStackAndCalloutEx chama uma rotina e garante que uma quantidade especificada de espaço de pilha esteja disponível para essa chamada.

Sintaxe

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

Parâmetros

Callout

Um ponteiro de função para uma rotina ExpandedStackCall . KeExpandKernelStackAndCalloutEx expande a pilha, se necessário, antes de chamar essa rotina.

Parameter

Especifica o valor do parâmetro a ser passado para a rotina ExpandedStackCall .

Size

Especifica o número de bytes de espaço de pilha para fornecer a chamada para a rotina ExpandedStackCall . Esse valor deve ser grande o suficiente para acomodar o uso da pilha da rotina ExpandedStackCall e de qualquer chamada que essa rotina possa fazer. O valor Tamanho não deve exceder MAXIMUM_EXPANSION_SIZE.

Wait

Especifica se a rotina deve aguardar para alocar o espaço de pilha necessário se esse espaço não estiver disponível imediatamente. Defina Aguardar como TRUE se a rotina puder aguardar a alocação de uma pilha expandida. Caso contrário, defina Wait como FALSE. Esse parâmetro deverá ser FALSE se KeExpandKernelStackAndCalloutEx for chamado em IRQL = DISPATCH_LEVEL.

Context

Reservado. Sempre defina esse parâmetro como NULL.

Retornar valor

KeExpandKernelStackAndCalloutEx retornará STATUS_SUCCESS se a chamada for bem-sucedida. Os possíveis valores retornados incluem os seguintes códigos de erro.

Código de retorno Descrição
STATUS_INVALID_PARAMETER_3 O parâmetro Size é maior que MAXIMUM_EXPANSION_SIZE.
STATUS_INVALID_PARAMETER_4 O parâmetro Wait é TRUE, mas a rotina foi chamada em IRQL = DISPATCH_LEVEL.
STATUS_NO_MEMORY Não há memória suficiente disponível para expandir a pilha.
STATUS_STACK_OVERFLOW A pilha, se expandida, excederia os limites internos do sistema operacional no espaço de pilha.

Comentários

Essa rotina primeiro determina se um mínimo de bytes de tamanho está disponível na pilha atual para a chamada para a rotina ExpandedStackCall . Caso contrário, KeExpandKernelStackAndCalloutEx tenta expandir a pilha atual por Bytes de tamanho . Se a pilha atual não puder ser expandida por esse valor, KeExpandKernelStackAndCalloutEx alocará temporariamente um novo segmento de pilha de kernel. Se uma pilha do tamanho necessário estiver disponível, KeExpandKernelStackAndCalloutEx usará essa pilha para chamar a rotina ExpandedStackCall .

Se KeExpandKernelStackAndCalloutEx não conseguir obter o espaço de pilha necessário, ele retornará sem chamar a rotina ExpandedStackCall . KeExpandKernelStackAndCalloutEx retornará STATUS_SUCCESS somente se puder chamar a rotina ExpandedStackCall . Caso contrário, ele retornará um código de erro.

KeExpandKernelStackAndCalloutEx não é declarado em um arquivo de cabeçalho. Para usar essa rotina no driver, inclua a seguinte declaração de função no código do driver:

#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

A rotina KeExpandKernelStackAndCallout é semelhante a KeExpandKernelStackAndCalloutEx , mas não tem parâmetros Wait e Context . Além disso, KeExpandKernelStackAndCallout sempre deve ser chamado em IRQL <= APC_LEVEL, enquanto KeExpandKernelStackAndCalloutEx pode ser chamado em DISPATCH_LEVEL (mas somente se Wait for FALSE).

O thread de chamada não deve chamar a rotina PsTerminateSystemThread até que a rotina ExpandedStackCall do thread retorne. PsTerminateSystemThread verifica se a rotina ExpandedStackCall ainda está ativa e, se estiver, causa um bug marcar.

No Windows Vista e no Windows Server 2008, KeExpandKernelStackAndCalloutEx deve ser chamado em IRQL <= APC_LEVEL. No Windows 7, Windows Server 2008 R2 e versões posteriores do Windows, essa rotina pode ser chamada em IRQL <= DISPATCH_LEVEL. No entanto, o parâmetro Wait deverá ser FALSE se a rotina for chamada em DISPATCH_LEVEL. Se Wait for TRUE, a chamada deverá ocorrer em IRQL <= APC_LEVEL.

Requisitos

Requisito Valor
Cliente mínimo com suporte Disponível a partir do Windows Vista.
Plataforma de Destino Universal
Cabeçalho ntddk.h
Biblioteca NtosKrnl.lib
DLL NtosKrnl.exe
IRQL Consulte a seção Observações.

Confira também

ExpandedStackCallKeExpandKernelStackAndCalloutPsTerminateSystemThread