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




