할당할 지역의 시작 주소입니다. 메모리를 예약하는 경우 지정된 주소는 할당 세분성의 가장 가까운 배수로 반올림됩니다. 메모리가 이미 예약되어 있고 커밋 중인 경우 주소는 다음 페이지 경계로 반올림됩니다. 호스트 컴퓨터에서 페이지의 크기와 할당 세분성을 확인하려면 GetSystemInfo 함수를 사용합니다. 이 매개 변수가 NULL경우 시스템은 지역을 할당할 위치를 결정합니다.
[in] Size
지역 크기(바이트)입니다. BaseAddress 매개 변수가 NULL경우 이 값은 다음 페이지 경계로 반올림됩니다. 그렇지 않으면 할당된 페이지에는 BaseAddress부터 BaseAddress+크기범위에서 하나 이상의 바이트가 포함된 모든 페이지가 포함됩니다. 즉, 페이지 경계에 걸쳐 있는 2 바이트 범위로 인해 두 페이지가 할당된 영역에 포함됩니다.
[in] AllocationType
메모리 할당의 유형입니다. 이 매개 변수는 다음 값 중 하나를 포함해야 합니다.
값
의미
MEM_COMMIT
0x00001000
지정된 예약된 메모리 페이지에 대한 메모리 요금(전체 메모리 크기 및 디스크의 페이징 파일)을 할당합니다. 또한 이 함수는 나중에 호출자가 처음에 메모리에 액세스할 때 콘텐츠가 0이 되도록 보장합니다. 실제 실제 페이지는 가상 주소에 실제로 액세스하지 않는 한 할당되지 않습니다.
한 단계에서 페이지를 예약하고 커밋하려면 MEM_COMMIT | MEM_RESERVE사용하여 VirtualAllocFromApp 호출합니다.
전체 범위가 이미 예약되지 않은 경우 MEM_RESERVE 없는 MEM_COMMIT 지정하고NULLBaseAddress 지정하여 특정 주소 범위를 커밋하려고 시도하면 실패합니다. 결과 오류 코드가 ERROR_INVALID_ADDRESS.
이미 커밋된 페이지를 커밋하려고 하면 함수가 실패하지 않습니다. 즉, 각 페이지의 현재 약정 상태를 먼저 결정하지 않고도 페이지를 커밋할 수 있습니다.
MEM_RESERVE
0x00002000
메모리 또는 디스크의 페이징 파일에 실제 실제 스토리지를 할당하지 않고 프로세스의 가상 주소 공간 범위를 예약합니다.
VirtualAllocFromApp 함수에 대한 후속 호출에서 예약된 페이지를 커밋할 수 있습니다. 한 단계에서 페이지를 예약하고 커밋하려면 MEM_COMMIT | MEM_RESERVEVirtualAllocFromApp 호출합니다.
malloc 및 localAlloc같은 다른 메모리 할당 함수는 릴리스될 때까지 예약된 메모리 범위를 사용할 수 없습니다.
MEM_RESET
0x00080000
BaseAddress 및 크기 지정한 메모리 범위의 데이터가 더 이상 관심이 없음을 나타냅니다. 페이지를 페이징 파일에서 읽거나 쓸 수 없습니다. 그러나 메모리 블록은 나중에 다시 사용되므로 커밋을 해제해서는 안 됩니다. 이 값은 다른 값과 함께 사용할 수 없습니다.
이 값을 사용하면 MEM_RESET 함께 작동하는 범위에 0이 포함되지 않습니다. 범위에 0이 포함되도록 하려면 메모리를 커밋 해제한 다음 다시 커밋합니다.
MEM_RESET지정하면 VirtualAllocFromApp 함수는 Protection값을 무시합니다. 그러나 ProtectionPAGE_NOACCESS같은 유효한 보호 값으로 설정해야 합니다.
VirtualAllocFromAppMEM_RESET 사용하고 메모리 범위가 파일에 매핑되는 경우 오류를 반환합니다. 공유 뷰는 페이징 파일에 매핑된 경우에만 허용됩니다.
MEM_RESET_UNDO
0x1000000
MEM_RESET_UNDOMEM_RESET 이전에 성공적으로 적용된 주소 범위에서만 호출해야 합니다. 이는 BaseAddress 및 Size 지정된 메모리 범위의 데이터가 호출자에게 관심을 가지며 MEM_RESET효과를 되돌리려고 시도했음을 나타냅니다. 함수가 성공하면 지정된 주소 범위의 모든 데이터가 그대로 유지됩니다. 함수가 실패하면 주소 범위의 일부 데이터가 0으로 바뀌었습니다.
이 값은 다른 값과 함께 사용할 수 없습니다. 이전에 MEM_RESET 않은 주소 범위에서 MEM_RESET_UNDO 호출되면 동작이 정의되지 않습니다.
MEM_RESET지정하면 VirtualAllocFromApp 함수는 Protection값을 무시합니다. 그러나 ProtectionPAGE_NOACCESS같은 유효한 보호 값으로 설정해야 합니다.
가능한 가장 높은 주소로 메모리를 할당합니다. 이는 특히 할당이 많은 경우 일반 할당보다 느려질 수 있습니다.
MEM_WRITE_WATCH
0x00200000
시스템이 할당된 지역에 기록된 페이지를 추적하도록 합니다. 이 값을 지정하는 경우 MEM_RESERVE지정해야 합니다.
지역이 할당되었거나 쓰기 추적 상태가 다시 설정된 이후 기록된 페이지의 주소를 검색하려면 GetWriteWatch 함수를 호출합니다. 쓰기 추적 상태를 다시 설정하려면 GetWriteWatch 호출하거나 ResetWriteWatch. 쓰기 추적 기능은 영역이 해제될 때까지 메모리 영역에 대해 사용하도록 설정된 상태로 유지됩니다.
[in] Protection
할당할 페이지 영역에 대한 메모리 보호입니다. 페이지를 커밋하는 경우메모리 보호 상수 중 하나를 지정할 수 있습니다. 다음 상수는 오류를 생성합니다.
PAGE_EXECUTE
PAGE_EXECUTE_READ
PAGE_EXECUTE_READWRITE
PAGE_EXECUTE_WRITECOPY
반환 값
함수가 성공하면 반환 값은 할당된 페이지 영역의 기본 주소입니다.
함수가 실패하면 반환 값은 NULL. 확장 오류 정보를 얻으려면 GetLastError호출합니다.
발언
JIT(Just-In-Time) 기능을 사용하여 Windows 스토어 앱에서 VirtualAllocFromApp 호출하여 JIT 기능을 사용할 수 있습니다. 앱은 JIT 기능을 사용하려면 앱 매니페스트 파일에 codeGeneration 기능을 포함해야 합니다.
각 페이지에는 연결된 페이지 상태.
VirtualAllocFromApp 함수는 다음 작업을 수행할 수 있습니다.
예약된 페이지의 영역 커밋
무료 페이지 영역 예약
무료 페이지 영역을 동시에 예약 및 커밋
VirtualAllocFromApp 예약된 페이지를 예약할 수 없습니다. 이미 커밋된 페이지를 커밋할 수 있습니다. 즉, 이미 커밋되었는지 여부에 관계없이 다양한 페이지를 커밋할 수 있으며 함수가 실패하지 않습니다.
VirtualAllocFromApp 사용하여 페이지 블록을 예약한 다음, VirtualAllocFromApp 추가 호출하여 예약된 블록에서 개별 페이지를 커밋할 수 있습니다. 이렇게 하면 프로세스가 필요할 때까지 실제 스토리지를 사용하지 않고도 해당 가상 주소 공간의 범위를 예약할 수 있습니다.
BaseAddress 매개 변수가 NULL않으면 함수는 BaseAddress 및 Size 매개 변수를 사용하여 할당할 페이지 영역을 계산합니다. 전체 페이지 범위의 현재 상태는 AllocationType 매개 변수에 지정된 할당 유형과 호환되어야 합니다. 그렇지 않으면 함수가 실패하고 페이지가 할당되지 않습니다. 이 호환성 요구 사항은 앞에서 설명한 대로 이미 커밋된 페이지를 커밋하는 것을 배제하지 않습니다.
VirtualAllocFromApp 실행 파일 페이지를 만들 수 없습니다.
VirtualAllocFromApp 함수를 사용하여 지정된 프로세스의 가상 주소 공간 내에서 메모리의 AWE(Address Windowing Extensions) 영역을 예약할 수 있습니다. 그런 다음, 이 메모리 영역을 사용하여 애플리케이션에서 요구하는 대로 가상 메모리 내부 및 외부에 실제 페이지를 매핑할 수 있습니다.
MEM_PHYSICAL 및 MEM_RESERVE 값은 AllocationType 매개 변수에서 설정해야 합니다.
MEM_COMMIT 값을 설정하면 안 됩니다. 페이지 보호는 PAGE_READWRITE설정해야 합니다.
VirtualFree 함수는 커밋된 페이지를 커밋 해제하거나, 페이지의 스토리지를 해제하거나, 커밋된 페이지를 동시에 커밋 해제하고 해제할 수 있습니다. 예약된 페이지를 해제하여 무료 페이지로 만들 수도 있습니다.
실행 가능한 지역을 만들 때 호출 프로그램은 코드가 설정되면 FlushInstructionCache 대한 적절한 호출을 통해 캐시 일관성을 보장해야 합니다. 그렇지 않으면 새로 실행 가능한 지역에서 코드를 실행하려고 시도하면 예기치 않은 결과가 발생할 수 있습니다.