NtAllocateVirtualMemory 함수(ntifs.h)
NtAllocateVirtualMemory는 지정된 프로세스의 사용자 모드 가상 주소 공간 내에 있는 페이지 영역을 예약, 커밋 또는 둘 다.
통사론
__kernel_entry NTSYSCALLAPI NTSTATUS NtAllocateVirtualMemory(
[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
할당된 페이지 영역의 기본 주소를 받을 변수에 대한 포인터입니다. BaseAddress 초기 값이NULL이 아닌경우 해당 지역은 다음 호스트 페이지 크기 주소 경계로 반올림된 지정된 가상 주소부터 할당됩니다. BaseAddress 초기 값이 NULL 경우 운영 체제에서 지역을 할당할 위치를 결정합니다.
[in] ZeroBits
섹션 뷰의 기본 주소에서 0이어야 하는 상위 주소 비트 수입니다. BaseAddress*가 NULL 때와 같이 운영 체제에서 지역을 할당할 위치를 결정하는 경우에만 사용됩니다. ZeroBits가 32보다 크면 비트 마스크가 됩니다.
[in, out] RegionSize
할당된 페이지 영역의 실제 크기(바이트)를 받는 변수에 대한 포인터입니다. RegionSize 초기 값은 지역의 크기를 바이트 단위로 지정하고 다음 호스트 페이지 크기 경계로 반올림됩니다. RegionSize 입력에서 0일 수 없습니다.
[in] AllocationType
지정한 페이지 영역에 대해 수행할 할당 유형을 지정하는 플래그가 포함된 비트 마스크입니다. 다음 표에서는 가장 일반적인 플래그를 설명합니다. 가능한 플래그 및 설명의 전체 목록은 VirtualAlloc 참조하세요.
메모
MEM_COMMIT, MEM_RESET 또는 MEM_RESERVE 중 하나를 설정해야 합니다.
[in] Protect
커밋된 페이지 영역에 원하는 보호를 지정하는 페이지 보호 플래그가 포함된 비트 마스크입니다. 다음 표에서는 이러한 플래그에 대해 설명합니다.
기 | 의미 |
---|---|
PAGE_NOACCESS | 커밋된 페이지 영역에 대한 액세스가 허용되지 않습니다. 커밋된 지역을 읽거나 쓰거나 실행하려고 시도하면 GP(일반 보호) 오류라는 액세스 위반 예외가 발생합니다. |
PAGE_READONLY | 페이지의 커밋된 영역에 대한 읽기 전용 및 실행 액세스가 허용됩니다. 커밋된 지역을 쓰려고 시도하면 액세스 위반이 발생합니다. |
PAGE_READWRITE | 커밋된 페이지 영역에 대한 읽기, 쓰기 및 실행 액세스가 허용됩니다. 기본 섹션에 대한 쓰기 액세스가 허용되는 경우 페이지의 단일 복사본이 공유됩니다. 그렇지 않으면 페이지는 쓰기 시 읽기 전용/복사로 공유됩니다. |
PAGE_EXECUTE | 커밋된 페이지 영역에 대한 액세스 실행이 허용됩니다. 커밋된 지역을 읽거나 쓰려고 시도하면 액세스 위반이 발생합니다. |
PAGE_EXECUTE_READ | 커밋된 페이지의 영역에 대한 실행 및 읽기 액세스가 허용됩니다. 커밋된 지역에 쓰려고 시도하면 액세스 위반이 발생합니다. |
PAGE_GUARD | 지역의 페이지는 보호 페이지가 됩니다. 가드 페이지에서 읽거나 쓰려고 하면 시스템에서 STATUS_GUARD_PAGE 예외가 발생합니다. 따라서 가드 페이지는 원샷 액세스 경보 역할을 합니다. 이 플래그는 페이지 보호 한정자이며, PAGE_NOACCESS 이외의 페이지 보호 플래그 중 하나와 함께 사용할 때만 유효합니다. 액세스 시도로 인해 시스템이 보호 페이지 상태를 해제하면 기본 페이지 보호가 인계됩니다. 시스템 서비스 중에 가드 페이지 예외가 발생하는 경우 서비스는 일반적으로 오류 상태 표시기를 반환합니다. |
PAGE_NOCACHE | 페이지 영역은 캐시할 수 없는 것으로 할당되어야 합니다. 섹션에는 PAGE_NOCACHE 허용되지 않습니다. |
PAGE_WRITECOMBINE | 쓰기 결합을 사용하도록 설정합니다. 즉, 쓰기를 캐시에서 주 메모리로 병합하여 하드웨어에서 지원합니다. 이 플래그는 주로 프레임 버퍼 메모리에 사용되므로 디바이스에 기록되기 전에 가능한 경우 동일한 캐시 줄에 쓰기가 결합됩니다. 이렇게 하면 버스에서 비디오 메모리에 대한 쓰기를 크게 줄일 수 있습니다. 하드웨어에서 쓰기 결합을 지원하지 않으면 플래그가 무시됩니다. 이 플래그는 페이지 보호 한정자이며, PAGE_NOACCESS 이외의 페이지 보호 플래그 중 하나와 함께 사용할 때만 유효합니다. |
반환 값
NtAllocateVirtualMemory STATUS_SUCCESS 또는 오류 상태 코드를 반환합니다. 가능한 오류 상태 코드에는 다음이 포함됩니다.
- STATUS_ACCESS_DENIED
- STATUS_ALREADY_COMMITTED
- STATUS_COMMITMENT_LIMIT
- STATUS_CONFLICTING_ADDRESSES
- STATUS_INSUFFICIENT_RESOURCES
- STATUS_INVALID_HANDLE
- STATUS_INVALID_PAGE_PROTECTION
- STATUS_NO_MEMORY
- STATUS_OBJECT_TYPE_MISMATCH
- STATUS_PROCESS_IS_TERMINATING
발언
NtAllocateVirtualMemory 다음 작업을 수행할 수 있습니다.
- 이전 호출로 예약된 페이지 영역을 커밋하여 NtAllocateVirtualMemory.
- 무료 페이지 영역을 예약합니다.
- 체험 페이지 영역을 예약하고 커밋합니다.
커널 모드 드라이버는 NtAllocateVirtualMemory 사용하여 지정된 프로세스에서 애플리케이션에 액세스할 수 있는 가상 주소 범위를 예약한 다음, NtAllocateVirtualMemory 추가로 호출하여 예약된 범위에서 개별 페이지를 커밋할 수 있습니다. 이렇게 하면 프로세스가 필요할 때까지 실제 스토리지를 사용하지 않고도 해당 가상 주소 공간의 범위를 예약할 수 있습니다.
프로세스의 가상 주소 공간의 각 페이지는 다음 표에 설명된 세 가지 상태 중 하나에 있습니다.
상태 | 의미 |
---|---|
무료 | 이 페이지는 커밋되거나 예약되어 있지 않으며 프로세스에 액세스할 수 없습니다. NtAllocateVirtualMemory 무료 페이지를 예약하거나 동시에 예약하고 커밋할 수 있습니다. |
예약 | 주소 범위는 다른 할당 함수에서 사용할 수 없지만 페이지에는 프로세스에 액세스할 수 없으며 연결된 실제 스토리지가 없습니다. NtAllocateVirtualMemory 예약된 페이지를 커밋할 수 있지만 두 번째로 예약할 수는 없습니다. NtFreeVirtualMemory 예약된 페이지를 해제하여 무료 페이지로 만들 수 있습니다. |
최선을 다하고 | 물리적 스토리지는 페이지에 할당되고 액세스는 보호 코드에 의해 제어됩니다. 시스템은 커밋된 각 페이지를 초기화하고 해당 페이지에 쓰려는 첫 번째 시도에서만 실제 메모리로 로드합니다. 프로세스가 종료되면 시스템에서 커밋된 페이지에 대한 스토리지를 해제합니다. NtAllocateVirtualMemory 이미 커밋된 페이지를 커밋할 수 있습니다. 즉, 이미 커밋되었는지 여부에 관계없이 다양한 페이지를 커밋할 수 있으며 함수가 실패하지 않습니다. NtFreeVirtualMemory 커밋된 페이지를 커밋 해제하거나, 페이지의 스토리지를 해제하거나, 커밋된 페이지를 동시에 커밋 해제하고 해제할 수 있습니다. |
NtAllocateVirtualMemory 호출하여 할당된 메모리는 NtFreeVirtualMemory호출하여 해제되어야 합니다.
메모리 관리에 대한 자세한 내용은 Windows 드라이버 메모리 관리를 참조하세요.
참고NtAllocateVirtualMemory 함수에 대한 호출이 사용자 모드에서 발생하는 경우 "ZwAllocateVirtualMemory" 대신 "NtAllocateVirtualMemory" 이름을 사용해야 합니다.
커널 모드 드라이버의 호출의 경우 NtXxx 및 ZwXxx 버전의 Windows Native System Services 루틴은 입력 매개 변수를 처리하고 해석하는 방식으로 다르게 동작할 수 있습니다. NtXxxZwXxx 루틴 버전 간의 관계에 대한 자세한 내용은 네이티브 시스템 서비스 루틴 Nt 및 Zw 버전 사용참조하세요.
요구 사항
요구 | 값 |
---|---|
지원되는 최소 클라이언트 | Windows 2000 |
대상 플랫폼 | 보편적 |
헤더 | ntifs.h(Ntifs.h 포함) |
라이브러리 | NtosKrnl.lib |
DLL | NtosKrnl.exe |
IRQL | PASSIVE_LEVEL |
DDI 규정 준수 규칙 | HwStorPortProhibitedDDIs, PowerIrpDDis, SpNoWait, StorPortStartIo |