複製鏈接
請複製以下鏈接發送給好友

VirtualAlloc

鎖定
VirtualAlloc是一個Windows API函數,該函數的功能是在調用進程的虛地址空間,預定或者提交一部分頁。
簡單點的意思就是申請內存空間
中文名
VirtualAlloc
類    屬
一個Windows API函數
包含在
windows系統文件Kernel32.dll中
VC聲明
LPVOID VirtualAlloc

VirtualAllocVC概述

VirtualAlloc是一個Windows API函數,它包含在windows系統文件Kernel32.dll中,編程時直接使用就可以了,不需要再下載。
該函數的功能是在調用進程的虛地址空間,預定或者提交一部分頁
如果用於內存分配的話,並且分配類型未指定MEM_RESET,則系統將自動設置為0;

VirtualAllocVC聲明

LPVOID VirtualAlloc
LPVOID lpAddress, // 要分配的內存區域的地址
DWORD dwSize, // 分配的大小
DWORD flAllocationType, // 分配的類型
DWORD flProtect // 該內存的初始保護屬性

VirtualAlloc説明

該函數的功能是在調用進程的虛地址空間,預定或者提交一部分頁
如果用於內存分配的話,並且分配類型未指定MEM_RESET,則該內存自動被初始化為0;

VirtualAlloc參數表説明

LPVOID lpAddress, 分配內存區域的地址。當你使用VirtualAlloc來提交一塊以前保留的內存塊的時候,lpAddress參數可以用來識別以前保留的內存塊。如果這個參數是NULL,系統將會決定分配內存區域的位置,並且按64-KB向上取整(roundup)。
SIZE_T dwSize, 要分配或者保留的區域的大小。這個參數以字節為單位,而不是頁,系統會根據這個大小一直分配到下頁的邊界DWORD
flAllocationType, 分配類型 ,你可以指定或者合併以下標誌:MEM_COMMIT,MEM_RESERVE和MEM_TOP_DOWN。
DWORD flProtect 指定了被分配區域的訪問保護方式
分配類型 功能
可能的數值
含義
MEM_COMMIT 0x1000
為指定地址空間提交物理內存。這個函數初始化內在為零
試圖提交已提交的內存頁不會導致函數失敗。這意味着您可以在不確定當前頁的當前提交狀態的情況下提交一系列頁面。
如果尚未保留內存頁,則設置此值會導致函數同時保留並提交內存頁。
MEM_RESERVE 0x2000
保留指定地址空間,不分配物理內存。
這樣可以阻止其他內存分配函數malloc和LocalAlloc等再使用已保留的內存範圍,直到它被被釋放。
當使用上面的VirtualAlloc函數保留了一段地址空間後,接下還你還可以繼續多次調用同樣的函數提交這段地址空間中的不同頁面。
MEM_RESET0x80000
表示,在所指定的內存範圍內的數據lpAddress的dwSize不再是利益。頁面不應該被讀出或寫入到分頁文件。然而,將再次使用的內存塊後,所以它不應該decommitted的 。這個值不能使用任何其他的價值 。
使用這個值並不保證範圍與經營MEM_RESET將包含零。如果你想的範圍包含零,decommit內存,然後將它重新作出 。
當您指定MEM_RESETVirtualAlloc函數忽略值flProtect。但是,您仍然必須設置flProtect有效的值,比如,PAGE_NOACCESS
如果你使用MEM_RESET的內存範圍映射到一個文件,VirtualAlloc返回一個錯誤。如果它被映射到分頁文件共享視圖是唯一可以接受的的 。
分配類型 也可以是下列值
可能的數值
含義
MEM_LARGE_PAGES0x20000000的
分配內存使用大頁面支持。
大小和對齊必須是一個大頁面的最低多個 。要獲得這個值,使用GetLargePageMinimum
MEM_PHYSICAL0x400000
儲備的地址範圍,可用於內存地址窗口擴展(AWE)的頁面。
此值必須使用MEM_RESERVE,並沒有其他值。
MEM_TOP_DOWN0x100000
在儘可能高的地址分配內存。這可以比普通的分配速度較慢,尤其是當需要許多分配。
MEM_WRITE_WATCH0x200000
導致系統來跟蹤分配的地區,都寫在頁面 。如果指定此值,則還必須指定MEM_RESERVE
要檢索的頁面是否寫入,因為該地區被分配或寫跟蹤狀態被重置地址,調用GetWriteWatch功能。要重置寫跟蹤狀態,調用GetWriteWatchResetWriteWatch。寫跟蹤功能仍然啓用,直到該地區被釋放。
訪問類型
PAGE_READONLY 0x02
該區域為只讀。如果應用程序試圖訪問區域中的頁的時候,將會被拒絕訪問。
PAGE_EXECUTE 0x10
區域包含可被執行的代碼。試圖讀寫該區域的操作將被拒絕。
PAGE_EXECUTE_READ 0x20
區域包含可執行代碼,應用程序只能讀該區域。
PAGE_READWRITE 0x04
區域不可執行代碼,應用程序可以讀寫該區域。
PAGE_EXECUTE_READWRITE 0x40
區域可以執行代碼,應用程序可以讀寫該區域。
PAGE_GUARD 0x100
區域第一次被訪問時進入一個STATUS_GUARD_PAGE異常,這個標誌要和其他保護標誌合併使用,表明區域被第一次訪問的權限
PAGE_NOACCESS 0x01
任何訪問該區域的操作將被拒絕
PAGE_NOCACHE 0x200
RAM中的頁映射到該區域時將不會被微處理器緩存(cached)
注:PAGE_GUARD和PAGE_NOCHACHE標誌可以和其他標誌合併使用以進一步指定頁的特徵。PAGE_GUARD標誌指定了一個防護頁(guard page),即當一個頁被提交時會因第一次被訪問而產生一個one-shot異常,接着取得指定的訪問權限。PAGE_NOCACHE防止當它映射到虛擬頁的時候被微處理器緩存。這個標誌方便設備驅動使用直接內存訪問方式(DMA)來共享內存塊。

VirtualAlloc返回值

如果調用成功,返回分配的首地址,
調用失敗,返回NULL 你可以通過GetLastError函數來獲取錯誤信息

VirtualAlloc筆記

VirtualAlloc可以通過並行多次調用提交一個區域的部分或全部來保留一個大的內存區域。多重調用提交同一塊區域不會引起失敗。這使得一個應用程序保留內存後可以隨意提交將被寫的頁。當這種方式不在有效的時候,它會釋放應用程序通過檢測被保留頁的狀態看它是否在提交調用之前已經被提交