KeSetKernelStackSwapEnable 함수(ntifs.h)

KeSetKernelStackSwapEnable 루틴은 호출자의 스택을 디스크로 교환할 수 있도록 설정하고 사용하지 않도록 설정합니다.

구문

BOOLEAN KeSetKernelStackSwapEnable(
  [in] BOOLEAN Enable
);

매개 변수

[in] Enable

호출 스레드에 속하는 스택의 교환을 사용할지 여부를 지정합니다. TRUE이면 교환이 활성화되고 스택의 내용을 메모리 내/외부로 페이징할 수 있습니다. FALSE이면 교환이 비활성화되고 스택이 메모리 상주합니다.

반환 값

KeSetKernelStackSwapEnable 은 호출이 시작될 때 스택 교환이 활성화되었는지 여부를 나타내는 BOOLEAN 값을 반환합니다. 스택 교환을 이전에 사용하도록 설정한 경우 이 값은 TRUE 이고 사용하지 않도록 설정된 경우 FALSE 입니다.

설명

커널 모드 드라이버는 이 루틴을 호출하여 스택이 메모리에서 페이저닝 가능한지 또는 잠겨 있는지 여부를 제어할 수 있습니다.

스택 교환은 스레드가 사용자 모드 애플리케이션의 요청으로 인해 발생한 대기 상태인 경우에만 발생할 수 있습니다. 스택 교환이 사용되는지 여부에 관계없이 커널 모드 구성 요소에서 시작하는 대기 상태에 대해서는 스택 교환이 발생하지 않습니다.

일반적으로 스택 교환을 사용하지 않도록 설정할 필요는 없습니다. 드문 경우에만 이 작업을 수행합니다. 스택 교환을 사용하지 않도록 설정하는 대안을 설명하는 예제는 아래 예제 섹션을 참조하세요.

KeWaitForSingleObject와 같은 커널 모드 대기 루틴에 대한 호출에서 호출자는 호출자가 커널 모드 또는 사용자 모드에서 대기하는지 여부를 나타내는 WaitMode 매개 변수를 지정합니다. WaitMode = UserMode이고 대기 기간이 충분히 긴 경우 메모리 관리자는 대기 스레드에 속하는 스택의 섹션을 페이아웃할 수 있습니다. 그러나 스택에 대기 기간 동안 메모리 상주 상태로 유지되어야 하는 데이터 항목이 포함된 경우 스레드는 KeSetKernelStackSwapEnable을 호출하고FALSE사용을 = 지정하여 스택이 페이징되지 않도록 방지할 수 있습니다.

스택 교환을 사용하지 않도록 설정하거나 시스템 버그 검사 발생하는 동안 스레드가 종료(종료)되어서는 안 됩니다.

예제

다음 코드 예제에서 드라이버 스레드는 스택에 이벤트를 할당하고 KeSetKernelStackSwap 을 호출하여 이벤트가 신호를 수신할 때까지 일시적으로 메모리에서 스택을 잠급니다. 드라이버는 UserRequestWaitReason을 사용하여 KeWaitForSingleObject를 호출하여 스레드가 사용자 모드 애플리케이션의 요청으로 인한 대기 상태임을 나타내고 WaitMode는 커널 모드에서 대기가 발생함을 나타내기 위해 KernelMode로 설정합니다. 대기가 완료되면 스레드는 필요한 경우 KeSetKernelStackSwap 을 다시 호출하여 스레드의 원래 스택 교환 상태를 복원합니다.

KEVENT event;
BOOLEAN oldSwapEnable;
NTSTATUS status;

oldSwapEnable = KeSetKernelStackSwapEnable(FALSE);

KeInitializeEvent(&event, SynchronizationEvent, FALSE);

//
// TO DO: Insert code here to pass the event to another thread
// that will set the event to the signaled state.
//
...

status = KeWaitForSingleObject(&event, UserRequest, KernelMode, FALSE, NULL);

if (oldSwapEnable)
{
    KeSetKernelStackSwapEnable(TRUE);
}

이벤트 개체는 신호 또는 서명되지 않은 상태로 설정할 수 있거나 스레드가 이벤트를 기다리는 동안 메모리 상주해야 합니다. 자세한 내용은 이벤트 개체 정의 및 사용을 참조하세요.

일반적으로 KeSetKernelStackSwap 루틴을 사용할 필요가 없으며 스택에서 페이징 가능한 데이터 항목만 할당하여 방지할 수 있습니다. 이전 예제에서는 이벤트 개체가 스택에 할당되어 있으므로 드라이버 스레드가 스택을 잠가야 합니다. 더 나은 대안은 단순히 비페이지 풀에서 이벤트를 할당하는 것입니다.

요구 사항

요구 사항
지원되는 최소 클라이언트 Windows 2000
대상 플랫폼 유니버설
헤더 ntifs.h(Ntifs.h, Fltkernel.h 포함)
라이브러리 NtosKrnl.lib
DLL NtosKrnl.exe
IRQL <= APC_LEVEL

추가 정보

KeInitializeEvent

KeWaitForSingleObject