VirtualAllocEx 함수(memoryapi.h)
지정된 프로세스의 가상 주소 공간 내에서 메모리 영역의 상태를 예약, 커밋 또는 변경합니다. 함수는 0에 할당하는 메모리를 초기화합니다.
실제 메모리에 대한 NUMA 노드를 지정하려면 VirtualAllocExNuma참조하세요.
통사론
LPVOID VirtualAllocEx(
[in] HANDLE hProcess,
[in, optional] LPVOID lpAddress,
[in] SIZE_T dwSize,
[in] DWORD flAllocationType,
[in] DWORD flProtect
);
매개 변수
[in] hProcess
프로세스에 대한 핸들입니다. 이 함수는 이 프로세스의 가상 주소 공간 내에 메모리를 할당합니다.
핸들에 PROCESS_VM_OPERATION 액세스 권한이 있어야 합니다. 자세한 내용은 프로세스 보안 및 액세스 권한
[in, optional] lpAddress
할당하려는 페이지 영역에 대해 원하는 시작 주소를 지정하는 포인터입니다.
메모리를 예약하는 경우 함수는 이 주소를 할당 세분성의 가장 가까운 배수로 내림합니다.
이미 예약된 메모리를 커밋하는 경우 함수는 이 주소를 가장 가까운 페이지 경계로 내림합니다. 호스트 컴퓨터에서 페이지의 크기와 할당 세분성을 확인하려면 GetSystemInfo 함수를 사용합니다.
이 주소가 InitializeEnclave호출하여 초기화하지 않은 enclave 내에 있는 경우 VirtualAllocEx 해당 주소의 enclave에 대해 0 페이지를 할당합니다. 이 페이지는 이전에 커밋되지 않았어야 하며 Intel Software Guard 확장 프로그래밍 모델의 EEXTEND 명령으로 측정되지 않습니다.
초기화한 enclave 내의 주소가 있으면 할당 작업이 실패하고 ERROR_INVALID_ADDRESS 오류가 발생합니다. 동적 메모리 관리(예: SGX1)를 지원하지 않는 enclave의 경우 마찬가지입니다. SGX2 enclave는 할당을 허용하며, 할당된 후 Enclave에서 페이지를 수락해야 합니다.
[in] dwSize
할당할 메모리 영역의 크기(바이트)입니다.
[in] flAllocationType
메모리 할당의 유형입니다. 이 매개 변수는 다음 값 중 하나를 포함해야 합니다.
이 매개 변수는 다음 값을 표시된 대로 지정할 수도 있습니다.
값 | 의미 |
---|---|
|
큰 페이지 지원사용하여 메모리를 할당합니다.
크기 및 맞춤은 큰 페이지 최소값의 배수여야 합니다. 이 값을 가져오려면 GetLargePageMinimum 함수를 사용합니다. 이 값을 지정하는 경우 MEM_RESERVE 지정하고 MEM_COMMIT합니다. |
|
AWE(주소 창 확장) 페이지를 이 값은 MEM_RESERVE 함께 사용해야 하며 다른 값은 사용하지 않아야 합니다. |
|
가능한 가장 높은 주소로 메모리를 할당합니다. 이는 특히 할당이 많은 경우 일반 할당보다 느려질 수 있습니다. |
[in] flProtect
할당할 페이지 영역에 대한 메모리 보호입니다. 페이지가 커밋되는 경우
lpAddress enclave 내에서 주소를 지정하는 경우 flProtect 다음 값이 될 수 없습니다.
- PAGE_NOACCESS
- PAGE_GUARD
- PAGE_NOCACHE
- PAGE_WRITECOMBINE
enclave에 동적 메모리를 할당할 때 flProtect 매개 변수는 PAGE_READWRITE 또는 PAGE_EXECUTE_READWRITE합니다.
반환 값
함수가 성공하면 반환 값은 할당된 페이지 영역의 기본 주소입니다.
함수가 실패하면 반환 값은 NULL
발언
각 페이지에는 연결된 페이지 상태. VirtualAllocEx 함수는 다음 작업을 수행할 수 있습니다.
- 예약된 페이지의 영역 커밋
- 무료 페이지 영역 예약
- 무료 페이지 영역을 동시에 예약 및 커밋
VirtualAllocEx 사용하여 페이지 블록을 예약한 다음, VirtualAllocEx 추가 호출하여 예약된 블록에서 개별 페이지를 커밋할 수 있습니다. 이렇게 하면 프로세스가 필요할 때까지 실제 스토리지를 사용하지 않고도 해당 가상 주소 공간의 범위를 예약할 수 있습니다.
동적으로 생성된 코드를 실행하려면 VirtualAllocEx 사용하여 메모리를 할당하고 VirtualProtectEx 함수를 사용하여 PAGE_EXECUTE 액세스 권한을 부여합니다.
VirtualAllocEx 함수를 사용하여 지정된 프로세스의 가상 주소 공간 내에서 메모리의 AWE(주소 창 확장) 영역을 예약할 수 있습니다. 그런 다음, 이 메모리 영역을 사용하여 애플리케이션에서 요구하는 대로 가상 메모리 내부 및 외부에 실제 페이지를 매핑할 수 있습니다. MEM_PHYSICAL 및 MEM_RESERVE 값은 AllocationType 매개 변수에서 설정해야 합니다. MEM_COMMIT 값을 설정하면 안 됩니다. 페이지 보호는 PAGE_READWRITE설정해야 합니다.
VirtualFreeEx 함수는 커밋된 페이지를 커밋 해제하거나, 페이지의 스토리지를 해제하거나, 커밋된 페이지를 동시에 커밋 해제하고 해제할 수 있습니다. 예약된 페이지를 해제하여 무료 페이지로 만들 수도 있습니다.
실행 가능한 지역을 만들 때 호출 프로그램은 코드가 설정되면 FlushInstructionCache 대한 적절한 호출을 통해 캐시 일관성을 보장해야 합니다. 그렇지 않으면 새로 실행 가능한 지역에서 코드를 실행하려고 시도하면 예기치 않은 결과가 발생할 수 있습니다.
요구 사항
요구 | 값 |
---|---|
지원되는 최소 클라이언트 | Windows XP [데스크톱 앱 | UWP 앱] |
지원되는 최소 서버 | Windows Server 2003 [데스크톱 앱 | UWP 앱] |
대상 플랫폼 | Windows |
헤더 | memoryapi.h(Windows.h, Memoryapi.h 포함) |
라이브러리 | onecore.lib |
DLL | Kernel32.dll |
참고 항목
ReadProcessMemory
가상 메모리 함수