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 루틴을 호출하지 않고 반환됩니다. KeExpandKernelStackAndCalloutEx 는 ExpandedStackCall 루틴을 호출할 수 있는 경우에만 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 호출할 수 있지만 Wait 가 FALSE인 경우에만 호출할 수 있습니다.
호출 스레드는 스레드의 ExpandedStackCall 루틴이 반환될 때까지 PsTerminateSystemThread 루틴을 호출하지 않아야 합니다. PsTerminateSystemThread는 ExpandedStackCall 루틴이 여전히 활성 상태인지 확인하고, 이 경우 버그 검사 발생합니다.
Windows Vista 및 Windows Server 2008에서 KeExpandKernelStackAndCalloutEx는 IRQL <= APC_LEVEL 호출해야 합니다. Windows 7, Windows Server 2008 R2 이상 버전의 Windows에서 이 루틴은 IRQL <= DISPATCH_LEVEL 호출할 수 있습니다. 그러나 루틴이 DISPATCH_LEVEL 호출되는 경우 Wait 매개 변수는 FALSE 여야 합니다. Wait가 TRUE이면 IRQL <= APC_LEVEL 호출이 발생해야 합니다.
요구 사항
요구 사항 | 값 |
---|---|
지원되는 최소 클라이언트 | Windows Vista부터 사용할 수 있습니다. |
대상 플랫폼 | 유니버설 |
헤더 | ntddk.h |
라이브러리 | NtosKrnl.lib |
DLL | NtosKrnl.exe |
IRQL | 설명 섹션을 참조하십시오. |
추가 정보
ExpandedStackCallKeExpandKernelStackAndCalloutPsTerminateSystemThread