捐助郴维网
感谢您对郴维网的支持,你的支持将是郴维网持续发展的动力!
二维码
×
当前位置:郴维网 >API档案 > 正文
19 2017.06

VirtualAllocEx

点击次数:1536 更新时间:2017-6-19 19:46:06  【打印此页

原文链接 -> 传送门

函数功能:

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 函数在该进程的虚拟地址空间分配内存

2. 该句柄必须拥有 PROCESS_VM_OPERATION 权限。若想了解更多信息,查阅 Process Security and Access Rights

lpAddress

1. 指向您想分配的页面区域起始地址指针

2. 如果您正在申请保留内存,该起始地址向后移动到正在被分配的内存之后

3. 如果您正在提交已经被申请保留的内存,起始地址移动到下一个页面头。调用 GetSystemInfo 函数获取在主机上的页面大小和分配间隔

4. 如果这个参数是 NULL,系统将会自动分配内存区域的位置

5. 如果这个地址处于前后都被分配的区域且没有调用 InitializeEnclave 函数初始化,VirtualAllocEx 函数就会分配一个零的页面给该区域同时起始地址指向该区域。该页面必须之前未提交的,英特尔软件保护的指令扩展编程模型无法测量

6. 如果起始地址在前后都被分配的区域且调用 InitializeEnclave 函数初始化过,分配操作会发生 ERROR_INVALID_ADDRESS 错误

dwSize

1. 表示区域的大小,以字节为单位

2. 如果 lpAddress 参数为 NULL,dwSize 值就是该页面的大小

3. ruguo 被分配的页面就会包含在 lpAddress 到 lpAddress + dwSize 区域内所有含有一个或多个字节的页面。这意味着如果一个 2 字节地址横跨一个页面边界将会引起两页都被包括在分配区域

flAllocationType

表示内存分配的类型。该参数取值如表所列:

含义

MEM_COMMIT
(0x00001000)

1. 分配已经被申请内存页面内存改变(全部内存大小和磁盘上分页文件)。使调用者之后首次访问内存时内容是零。物理内存页不会被分配,除非或者直到虚拟内存被访问

2. 使用 MEM_COMMIT | MEM_RESERVE 参数值可以在一个步骤申请和提交页面

3. 使用 MEM_COMMIT 且没有 MEM_RESERVE 参数值提交特定地址范围。除非整个页面范围已经被申请,不然一个非空的 lpAddress 不会失败。错误代码 ERROR_INVALID_ADDRESS

4. 提交已经被提交的页面不会导致失败。这意味着您可以提交页面不必事先确定当前每个页面的提交状态

5. 如果 lpAddress 指向一个前后都被分配地址,flAllocationType 必须使用 MEM_COMMIT 参数值

MEM_RESERVE
(0x00002000)

1. 表示申请保留该进程虚拟地址空间且不在内存或者磁盘分页文件中分配任何物理存储

2. 您可以后续调用 VirtualAlloc 函数使用 MEM_COMMIT 参数值提交被申请的页面。指定 MEM_COMMIT | MEM_RESERVE 参数值可以在一个步骤申请提交页面。

3. 其他内存分配函数,例如 malloc 和 LocalAlloc 函数,直到被申请保留的内存被释放才可以重新申请保留

MEM_RESET
(0x00080000)

1. 表明在 lpAddress 到 lpAddress + dwSize 内存区域的数据可以被清除。页面不应该对分页文件进行读写操作。但是,该内存区域之后将会再一次被使用,所以它不应该被释放。MEM_RESET 不与其他值一起使用

2. 使用这个值不需要确保 MEM_RESET 操作范围将会包含零。如果你想要该范围包含零,释放内存然后重新提交

3. 当您使用 MEM_RESET 时,VirtualAlloc 函数忽略 flProtect 值。但是您仍然必须给 flProtect 设置一个合法值,例如 PAGE_NOACCESS

4. 如果您使用 MEM_RESET 和内存范围被映射到文件 VirtualAlloc 函数返回错误。如果映射到分页文件共享视图才是可接受的

MEM_RESET_UNDO
(0x1000000)

1. 使用 MEM_RESET 参数成功之后才可以该地址范围使用 MEM_RESET_UNDO 参数。该参数表明从 lpAddress 到 lpAddress  + dwSize 范围内的数据变得重要,尝试去恢复 MEM_RESET 的影响。如果函数调用成功,意味着所有在该内存范围内的数据是完整的。如果函数调用失败,至少在该内存范围内的一些数据被零填充

2. MEM_RESET_UNDO 不与其他值一起使用。如果 MEM_RESET_UNDO 参数值使用在先前没有使用 MEM_RESET 的地址区域,该操作未定义。当您使用 MEM_RESET 参数值,VirtualAlloc 函数忽略 flProtect 参数。但是您仍然必须给 flProtect 设置一个合法值,例如 PAGE_NOACCESS

3. Windows Server 2008 R2, Windows 7,Windows Server 2008,Windows Vista,Windows Server 2003,和 Windows XP 系统 MEM_RESET_UNDO 参数值是不支持的,直到 Windows 8 和 Windows Server 2012 系统才提供支持


分配的类型也可以是下列值:

含义

MEM_LARGE_PAGES
(0x20000000)

1. 使用大页面支持分配内存
2. 它的大小必须是大页面的最小值。调用 GetLargePageMinimum 函数获取该值

MEM_PHYSICAL
(0x00400000)

1. 申请一个能被地址窗口扩展页面映射的地址范围
2. MEM_PHYSICAL 必须与 MEM_RESERVE 一起使用且没有其他备用值

MEM_TOP_DOWN
(0x00100000)

分配尽可能高的地址。完成执行时间将会比正常分配完成时间长,尤其是当需要很多分配时

flProtect

1. 指定被分配页面区域的内存保护。如果该页面正在被提交,您可以指定任何内存保护常量值。

2. 如果 lpAddress 在一个前后被分配的地址,flProtect 不能取以下值:
 

·         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

提示
郴维网为您提供各类专业服务:
软件开发,电脑配件销售,WIFI路由器销售,上门电脑维修,上门安装系统,系统安装,软、硬件安装,电脑除尘清灰,显示器维修,WIFI安装调试,服务器维护,数据恢复,密码破解,网络布线,网络检修,打印机维修,打印机加碳粉,苹果电脑安装系统,苹果电脑安装双系统,监控安装维护,电脑外包,笔记本电脑维修,餐饮、美容行业软件安装 等。。。。。。
点击次数:1536 更新时间:2017-6-19 19:46:06  【打印此页

上一条:MENUINFO 结构

下一条:GetSystemInfo

关键词推荐:郴州电脑城 郴州电脑维修公司 维修电脑公司 郴州软件开发 上门电脑维修 上门安装系统 笔记本电脑维修 郴州打印机维修 打印机加碳粉 电脑安装双系统 苹果电脑双系统 液晶显示器维修 联想笔记本维修 联想笔记本维修电话 戴尔笔记本维修电话 郴州戴尔笔记本维修 戴尔笔记本郴州维修点 华硕笔记本维修点 郴州华硕笔记本维修 郴州笔记本上网维修