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 미만이어야 하며
[in, out] RegionSize
할당된 페이지 영역의 실제 크기(바이트)를 받는 변수에 대한 포인터입니다. 이 매개 변수의 초기 값은 영역의 크기(바이트)를 지정하고 다음 호스트 페이지 크기 경계로 반올림됩니다. * RegionSize 입력에서 0일 수 없습니다.
[in] AllocationType
수행할 할당 유형을 지정하는 플래그가 포함된 비트 마스크입니다. 다음 표에서는 이러한 플래그에 대해 설명합니다.
기 | 의미 |
---|---|
MEM_COMMIT | 지정한 페이지 영역은 커밋됩니다. MEM_COMMIT, MEM_RESET 또는 MEM_RESERVE 중 하나를 설정해야 합니다. |
MEM_PHYSICAL | 실제 메모리를 할당합니다. 이 플래그는 AWE(Address Windowing Extensions) 메모리에만 사용됩니다. MEM_PHYSICAL 설정되면 MEM_RESERVE 설정해야 하고, 다른 플래그를 설정할 수 없으며, 보호 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 추가 호출할 수 있습니다. 이렇게 하면 프로세스가 필요할 때까지 실제 스토리지를 사용하지 않고도 해당 가상 주소 공간의 범위를 예약할 수 있습니다.
프로세스의 가상 주소 공간의 각 페이지는 다음 표에 설명된 세 가지 상태 중 하나에 있습니다.
상태 | 의미 |
---|---|
무료 | 이 페이지는 커밋되거나 예약되어 있지 않으며 프로세스에 액세스할 수 없습니다. ZwAllocateVirtualMemory 무료 페이지를 예약하거나 동시에 예약하고 커밋할 수 있습니다. |
예약 | 주소 범위는 다른 할당 함수에서 사용할 수 없지만 페이지에는 프로세스에 액세스할 수 없으며 연결된 실제 스토리지가 없습니다. ZwAllocateVirtualMemory 예약된 페이지를 커밋할 수 있지만 두 번째로 예약할 수는 없습니다. ZwFreeVirtualMemory 예약된 페이지를 해제하여 무료 페이지로 만들 수 있습니다. |
최선을 다하고 | 물리적 스토리지는 페이지에 할당되고 액세스는 보호 코드에 의해 제어됩니다. 시스템은 커밋된 각 페이지를 초기화하고 해당 페이지에 쓰려는 첫 번째 시도에서만 실제 메모리로 로드합니다. 프로세스가 종료되면 시스템에서 커밋된 페이지에 대한 스토리지를 해제합니다. ZwAllocateVirtualMemory 이미 커밋된 페이지를 커밋할 수 있습니다. 즉, 이미 커밋되었는지 여부에 관계없이 다양한 페이지를 커밋할 수 있으며 함수가 실패하지 않습니다. ZwFreeVirtualMemory 커밋된 페이지를 커밋 해제하거나, 페이지의 스토리지를 해제하거나, 커밋된 페이지를 동시에 커밋 해제하고 해제할 수 있습니다. |
ZwAllocateVirtualMemory 호출하여 할당된 메모리는 ZwFreeVirtualMemory호출하여 해제되어야 합니다.
메모리 관리에 대한 자세한 내용은 Windows 드라이버
메모
ZwAllocateVirtualMemory 함수에 대한 호출이 사용자 모드에서 발생하는 경우 "ZwAllocateVirtualMemory" 대신 "NtAllocateVirtualMemory" 이름을 사용해야 합니다.
커널 모드 드라이버의 호출의 경우 NtXxx 및 ZwXxx 버전의 Windows Native System Services 루틴은 입력 매개 변수를 처리하고 해석하는 방식으로 다르게 동작할 수 있습니다.
요구 사항
요구 | 값 |
---|---|
지원되는 최소 클라이언트 | 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 버전 사용