原文链接 -> 传送门
函数功能:
VirtualAlloc 函数用于在调用进程的虚拟地址空间,预定、提交或者改变一部分页的状态。
被分配的内存自动被初始化为 0。
在另一个进程的地址空间中分配内存,请使用 VirtualAllocEx 函数。
API 函数原型:
注释:_In_ 说明该参数是输入的,_In_opt_ 说明该参数是输入同时是可选的。
LPVOID WINAPI VirtualAlloc( _In_opt_ LPVOID lpAddress, _In_ SIZE_T dwSize, _In_ DWORD flAllocationType, _In_ DWORD flProtect );
参数解析:
|
参数 |
含义 |
||||||||||||||||||||
|
lpAddress |
1. 表示分配区域的起始地址。如果该内存正在被申请,该起始地址向后移动到正在被分配的内存后面。如果该内存已经被申请和提交,起始地址移动到下一个页面头。使用 GetSystemInfo 函数可以获取在主机上的页面大小和分配间隔。如果这个参数是NULL,系统将会自动分配内存区域的位置 |
||||||||||||||||||||
|
dwSize |
表示区域的大小,以字节为单位。如果 lpAddress 参数为空,dwSize 值就是该页面的大小。否则,被分配的页面就会包含在 lpAddress 到 lpAddress + dwSize 区域内所有含有一个或多个字节的页面。这意味着如果一个 2 字节地址横跨一个页面边界将会引起两页都被包括在分配区域 |
||||||||||||||||||||
|
flAllocationType |
表示内存分配的类型。该参数取值如表所列:
|
||||||||||||||||||||
|
flProtect |
1. 指定被分配页面区域的内存保护。如果该页面正在被提交,您可以指定任何内存保护常量值。 · PAGE_NOACCESS · PAGE_GUARD · PAGE_NOCACHE · PAGE_WRITECOMBINE |
返回值:
1. 如果函数调用成功,则返回值分配的首地址;
2. 如果函数调用失败,则返回值为 NULL。
若想获得更多的错误信息,请调用 GetLastError 函数。
备注:
1. 每一页都有一个关联的页面状态。VirtualAlloc 函数可以执行以下操作:
· 提交被申请的页面区域
· 申请空闲页面区域
· 同时申请和提交空闲页区域
2. VirtualAlloc 函数不能申请已被申请的页面。可以提交被提交页面。这意味着您可以提交页面的部分区域,无论他们是否曾经被提交,该函数都不会失败。
3. 您可以使用 VirtualAlloc 函数申请页面的一个块,然后追加调用 VirtualAlloc 函数在被申请的块中提交个人页面。允许进程申请它的虚拟地址空间一部分不消耗的物理储存,直到它被需要。
4. 如果 lpAddress 参数不是 NULL,VirtualAlloc 函数使用 lpAddress 和 dwSize 参数来计算分配的页面区域。全部被申请的页面区域必须兼容 flAllocationType 参数指定的分配的类型。否则,函数调用失败且没有任何页面被分配。提交一个已经提交页面也要满足这种兼容性需求,如前所述。
5. 为了可以动态生成的代码,使用 VirtualAlloc 函数分配内存同时使用 VirtualProtect 函数授予 PAGE_EXECUTE 读写权限。
6. 可以使用 VirtualAlloc 函数在一个指定的进程的虚拟地址空间申请内存的地址窗口扩展(AWE)区域。然后应用程序可以用该内存区域做为物理页映射到虚拟内存外。MEM_PHYSICAL 和 MEM_RESERVE 值必须设置在 AllocationType 参数中,但不可以设置为 MEM_COMMIT。页面区域读写权限必须设置为 PAGE_READWRITE。
7. VirtualFree 函数可以先释放被提交的页面然后在释放页面的存储空间,或者直接进行这两个操作。它还可以释放被申请页面,使其变为空闲的页面。
8. 当创建一个将要执行的区域,调用程序应该通过调用对应的 FlushInstructionCache 函数确保缓存一致性和相应的代码是否被编写。否则执行代码超出新可执行区域可能产生不可预知的结果。
需求:
|
Minimum supported client |
Windows xp [仅桌面应用程序] |
|
Minimum supported server |
Windows 2003 服务器版 [仅桌面应用程序] |
|
Header |
WinBase.h (包含于 Windows.h) |
|
Library |
Kernel32.lib |
|
DLL |
Kernel32.dll |




