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 루틴에 대한 호출을 위해 현재 스택에서 최소 Size 바이트를 사용할 수 있는지 여부를 결정합니다. 그렇지 않은 경우 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 호출할 수 있습니다(하지만 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