ZwAllocateVirtualMemory 함수(ntifs.h)

ZwAllocateVirtualMemory 루틴은 지정된 프로세스의 사용자 모드 가상 주소 공간 내의 페이지 영역을 예약, 커밋 또는 둘 다 예약합니다.

구문

NTSYSAPI NTSTATUS ZwAllocateVirtualMemory(
  [in]      HANDLE    ProcessHandle,
  [in, out] PVOID     *BaseAddress,
  [in]      ULONG_PTR ZeroBits,
  [in, out] PSIZE_T   RegionSize,
  [in]      ULONG     AllocationType,
  [in]      ULONG     Protect
);

매개 변수

[in] ProcessHandle

매핑을 수행해야 하는 프로세스에 대한 핸들입니다. Ntddk.h에 정의된 NtCurrentProcess 매크로를 사용하여 현재 프로세스를 지정합니다.

[in, out] BaseAddress

할당된 페이지 영역의 기본 주소를 받을 변수에 대한 포인터입니다. 이 매개 변수의 초기 값이 NULL이 아닌 경우 지역은 다음 호스트 페이지 크기 주소 경계로 반올림된 지정된 가상 주소부터 할당됩니다. 이 매개 변수의 초기 값이 NULL이면 운영 체제에서 지역을 할당할 위치를 결정합니다.

[in] ZeroBits

섹션 보기의 기본 주소에서 0이어야 하는 상위 주소 비트의 수입니다. 이 값은 21 미만이어야 하며, BaseAddressNULL인 경우와 같이 운영 체제에서 지역을 할당할 위치를 결정하는 경우에만 사용됩니다.

[in, out] RegionSize

할당된 페이지 영역의 실제 크기(바이트)를 수신할 변수에 대한 포인터입니다. 이 매개 변수의 초기 값은 지역의 크기(바이트)를 지정하고 다음 호스트 페이지 크기 경계로 반올림됩니다. *RegionSize는 입력에서 0일 수 없습니다.

[in] AllocationType

수행할 할당 유형을 지정하는 플래그가 포함된 비트 마스크입니다. 다음 표에서는 이러한 플래그에 대해 설명합니다.

플래그 의미
MEM_COMMIT 지정된 페이지 영역은 커밋됩니다. MEM_COMMIT, MEM_RESET 또는 MEM_RESERVE 중 하나를 설정해야 합니다.
MEM_PHYSICAL 실제 메모리를 할당합니다. 이 플래그는 AWE(주소 창 확장) 메모리에만 사용됩니다. MEM_PHYSICAL 설정되면 MEM_RESERVE 설정해야 하고, 다른 플래그를 설정할 수 없으며, Protect 를 PAGE_READWRITE 설정해야 합니다.
MEM_RESERVE 지정한 페이지 영역은 예약되어야 합니다. MEM_COMMIT, MEM_RESET 또는 MEM_RESERVE 중 하나를 설정해야 합니다.
MEM_RESET 페이지가 페이징 파일에 있는 경우 삭제되고 0 페이지가 가져오도록 지정된 영역의 상태를 다시 설정합니다. 페이지가 메모리에 있고 수정된 경우 페이징 파일에 기록되지 않도록 수정되지 않은 것으로 표시됩니다. 콘텐츠가 0이 아닙니다 . Protect 매개 변수는 사용되지 않지만 유효한 값으로 설정해야 합니다. MEM_COMMIT, MEM_RESET 또는 MEM_RESERVE 중 하나를 설정해야 합니다. MEM_RESET 설정되면 다른 플래그를 설정할 수 없습니다.
MEM_TOP_DOWN 지정된 지역은 ZeroBits를 기반으로 가능한 가장 높은 가상 주소로 만들어야 합니다.

[in] Protect

커밋된 페이지 영역에 원하는 보호를 지정하는 페이지 보호 플래그가 포함된 비트 마스크입니다. 다음 표에서는 이러한 플래그에 대해 설명합니다.

플래그 의미
PAGE_NOACCESS 커밋된 페이지 영역에 대한 액세스는 허용되지 않습니다. 커밋된 지역을 읽거나 쓰거나 실행하려고 시도하면 GP(일반 보호) 오류라는 액세스 위반 예외가 발생합니다.
PAGE_READONLY 페이지의 커밋된 영역에 대한 읽기 전용 및 실행 액세스가 허용됩니다. 커밋된 지역을 작성하려고 시도하면 액세스 위반이 발생합니다.
PAGE_READWRITE 페이지의 커밋된 영역에 대한 읽기, 쓰기 및 실행 액세스가 허용됩니다. 기본 섹션에 대한 쓰기 액세스가 허용되는 경우 페이지의 단일 복사본이 공유됩니다. 그렇지 않으면 페이지는 쓰기 시 읽기 전용/복사 공유됩니다.
PAGE_EXECUTE 커밋된 페이지 영역에 대한 액세스 실행이 허용됩니다. 커밋된 지역을 읽거나 쓰려고 시도하면 액세스 위반이 발생합니다.
PAGE_EXECUTE_READ 커밋된 페이지 영역에 대한 실행 및 읽기 액세스가 허용됩니다. 커밋된 지역에 쓰려고 시도하면 액세스 위반이 발생합니다.
PAGE_EXECUTE_READWRITE 커밋된 페이지 영역에 대한 실행, 읽기 및 쓰기 권한이 허용됩니다.
PAGE_GUARD 지역의 페이지는 보호 페이지가 됩니다. 가드 페이지에서 읽거나 쓰려고 하면 시스템에서 STATUS_GUARD_PAGE 예외가 발생합니다. 따라서 가드 페이지는 원샷 액세스 경보 역할을 합니다. 이 플래그는 페이지 보호 한정자이며 PAGE_NOACCESS 이외의 페이지 보호 플래그 중 하나와 함께 사용할 때만 유효합니다. 액세스 시도로 인해 시스템에서 보호 페이지 상태 해제하면 기본 페이지 보호가 인계됩니다. 시스템 서비스 중에 가드 페이지 예외가 발생하는 경우 서비스는 일반적으로 오류 상태 표시기를 반환합니다.
PAGE_NOCACHE 페이지 영역은 비캐시 가능으로 할당되어야 합니다. 섹션에는 PAGE_NOCACHE 허용되지 않습니다.
PAGE_WRITECOMBINE 쓰기 결합을 사용하도록 설정합니다. 즉, 쓰기를 캐시에서 기본 메모리로 병합합니다. 여기서 하드웨어는 이를 지원합니다. 이 플래그는 주로 프레임 버퍼 메모리에 사용되므로 디바이스에 기록되기 전에 가능한 경우 동일한 캐시 줄에 대한 쓰기가 결합됩니다. 이렇게 하면 버스에서 비디오 메모리에 대한 쓰기를 크게 줄일 수 있습니다. 하드웨어에서 쓰기 결합을 지원하지 않으면 플래그가 무시됩니다. 이 플래그는 페이지 보호 한정자이며 PAGE_NOACCESS 이외의 페이지 보호 플래그 중 하나와 함께 사용할 때만 유효합니다.

반환 값

ZwAllocateVirtualMemory는 STATUS_SUCCESS 또는 오류 상태 코드를 반환합니다. 가능한 오류 상태 코드에는 다음이 포함됩니다.

설명

ZwAllocateVirtualMemory 는 다음 작업을 수행할 수 있습니다.

  • ZwAllocateVirtualMemory에 대한 이전 호출로 예약된 페이지 영역을 커밋합니다.

  • 무료 페이지 영역을 예약합니다.

  • 무료 페이지 영역을 예약하고 커밋합니다.

커널 모드 드라이버는 ZwAllocateVirtualMemory 를 사용하여 지정된 프로세스에서 애플리케이션에 액세스할 수 있는 가상 주소 범위를 예약한 다음 ZwAllocateVirtualMemory 를 추가로 호출하여 예약된 범위에서 개별 페이지를 커밋할 수 있습니다. 이렇게 하면 프로세스가 필요할 때까지 실제 스토리지를 사용하지 않고도 해당 가상 주소 공간의 범위를 예약할 수 있습니다.

프로세스의 가상 주소 공간의 각 페이지는 다음 표에 설명된 세 가지 상태 중 하나에 있습니다.

시스템 상태 의미
FREE 이 페이지는 커밋되거나 예약되어 있지 않으며 프로세스에 액세스할 수 없습니다. ZwAllocateVirtualMemory 는 무료 페이지를 예약하거나 동시에 예약하고 커밋할 수 있습니다.
RESERVED 주소 범위는 다른 할당 함수에서 사용할 수 없지만 페이지에는 프로세스에 액세스할 수 없으며 연결된 실제 스토리지가 없습니다. ZwAllocateVirtualMemory 는 예약된 페이지를 커밋할 수 있지만 두 번째로 예약할 수는 없습니다. ZwFreeVirtualMemory 는 예약된 페이지를 해제하여 무료 페이지로 만들 수 있습니다.
최선을 다하고 물리적 스토리지는 페이지에 할당되고 액세스는 보호 코드에 의해 제어됩니다. 시스템은 해당 페이지를 읽거나 쓰려는 첫 번째 시도에서만 커밋된 각 페이지를 실제 메모리로 초기화하고 로드합니다. 프로세스가 종료되면 시스템은 커밋된 페이지에 대한 스토리지를 해제합니다. ZwAllocateVirtualMemory 는 이미 커밋된 페이지를 커밋할 수 있습니다. 즉, 이미 커밋되었는지 여부에 관계없이 페이지 범위를 커밋할 수 있으며 함수는 실패하지 않습니다. ZwFreeVirtualMemory 는 커밋된 페이지를 커밋 해제하거나, 페이지의 스토리지를 해제하거나, 커밋된 페이지를 동시에 커밋 해제하고 해제할 수 있습니다.

ZwAllocateVirtualMemory를 호출하여 할당된 메모리는 ZwFreeVirtualMemory를 호출하여 해제해야 합니다.

메모리 관리에 대한 자세한 내용은 Windows 드라이버용 메모리 관리를 참조하세요.

참고

ZwAllocateVirtualMemory 함수에 대한 호출이 사용자 모드에서 발생하는 경우 "ZwAllocateVirtualMemory" 대신 "NtAllocateVirtualMemory" 이름을 사용해야 합니다.

커널 모드 드라이버에서 호출하는 경우 Windows 네이티브 시스템 서비스 루틴의 NtXxxZwXxx 버전은 입력 매개 변수를 처리하고 해석하는 방식으로 다르게 동작할 수 있습니다. 루틴의 NtXxx 버전과 ZwXxx 버전 간의 관계에 대한 자세한 내용은 네이티브 시스템 서비스 루틴의 Nt 및 Zw 버전 사용을 참조하세요.

요구 사항

요구 사항
지원되는 최소 클라이언트 Windows 2000
대상 플랫폼 유니버설
헤더 ntifs.h(Ntifs.h 포함)
라이브러리 NtosKrnl.lib
DLL NtosKrnl.exe
IRQL PASSIVE_LEVEL
DDI 규정 준수 규칙 HwStorPortProhibitedDDIs(storport), PowerIrpDDis(wdm), SpNoWait(storport), StorPortStartIo(storport)

추가 정보

네이티브 시스템 서비스 루틴의 Nt 및 Zw 버전 사용

ZwFreeVirtualMemory