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 로 설정합니다. 그렇지 않으면 대기를 FALSE로 설정합니다. KeExpandKernelStackAndCalloutEx가 IRQL = DISPATCH_LEVEL 호출되는 경우 이 매개 변수는 FALSE여야 합니다.

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 루틴을 호출하지 않고 반환됩니다. KeExpandKernelStackAndCalloutExExpandedStackCall 루틴을 호출할 수 있는 경우에만 STATUS_SUCCESS 반환합니다. 그렇지 않으면 오류 코드를 반환합니다.

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 호출할 수 있지만 WaitFALSE인 경우에만 호출할 수 있습니다.

호출 스레드는 스레드의 ExpandedStackCall 루틴이 반환될 때까지 PsTerminateSystemThread 루틴을 호출하지 않아야 합니다. PsTerminateSystemThreadExpandedStackCall 루틴이 여전히 활성 상태인지 확인하고, 이 경우 버그 검사 발생합니다.

Windows Vista 및 Windows Server 2008에서 KeExpandKernelStackAndCalloutEx는 IRQL <= APC_LEVEL 호출해야 합니다. Windows 7, Windows Server 2008 R2 이상 버전의 Windows에서 이 루틴은 IRQL <= DISPATCH_LEVEL 호출할 수 있습니다. 그러나 루틴이 DISPATCH_LEVEL 호출되는 경우 Wait 매개 변수는 FALSE 여야 합니다. WaitTRUE이면 IRQL <= APC_LEVEL 호출이 발생해야 합니다.

요구 사항

요구 사항
지원되는 최소 클라이언트 Windows Vista부터 사용할 수 있습니다.
대상 플랫폼 유니버설
헤더 ntddk.h
라이브러리 NtosKrnl.lib
DLL NtosKrnl.exe
IRQL 설명 섹션을 참조하십시오.

추가 정보

ExpandedStackCallKeExpandKernelStackAndCalloutPsTerminateSystemThread