【winapi】VitualAlloc
概述:VirtualAlloc 函数详解
说明
作用:在指定进程的虚拟地址空间中保留、提交或更改内存区域的状态。该函数将它分配的内存初始化为零。
官方文档:VirtualAllocEx 函数 (memoryapi.h) - Win32 apps | Microsoft Learn
函数原型:
1 |
|
参数说明:
-
hProcess
: 进程的句柄 -
lpAddress
: 要分配内存块的起始地址的指针 -
dwSize
: 要分配内存块的大小 -
flAllocationType
:内存分配的类型
值 | 含义 |
---|---|
MEM_COMMIT0x00001000 | 从指定保留内存页的磁盘) 的总内存大小和分页文件 (分配内存费用。 函数还保证当调用方稍后最初访问内存时,内容将为零。 除非实际访问虚拟地址,否则不会分配实际物理页面。若要在一个步骤中保留和提交页面,请使用 `MEM_COMMIT |
MEM_RESERVE0x00002000 | 保留进程的虚拟地址空间范围,而无需在内存或磁盘上的分页文件中分配任何实际物理存储。使用 MEM_COMMIT 再次调用 VirtualAllocEx 来提交保留页。 若要在一个步骤中保留和提交页面,请使用 `MEM_COMMIT |
MEM_RESET0x00080000 | 指示 lpAddress 和 dwSize 指定的内存范围中的数据不再感兴趣。 不应从分页文件读取或写入页面。 但是,内存块稍后将再次使用,因此不应取消提交。 此值不能与任何其他值一起使用。使用此值并不能保证使用 MEM_RESET 操作的范围将包含零。 如果希望范围包含零,请取消提交内存,然后重新提交。使用 MEM_RESET 时, VirtualAllocEx 函数会忽略 fProtect 的值。 但是,仍必须将 fProtect 设置为有效的保护值,例如 PAGE_NOACCESS。如果使用 MEM_RESET并且内存范围映射到文件,VirtualAllocEx 将返回错误。 仅当共享视图映射到分页文件时,才可接受该视图。 |
MEM_RESET_UNDO0x1000000 | 应 仅对之前成功应用MEM_RESET的地址范围调用 MEM_RESET_UNDO 。 它指示调用方对 lpAddress 和 dwSize 指定的指定内存范围中的数据感兴趣,并尝试反转 MEM_RESET的影响。 如果该函数成功,则表示指定地址范围中的所有数据都保持不变。 如果函数失败,则至少将地址范围中的某些数据替换为零。此值不能与任何其他值一起使用。 如果在之前未MEM_RESET的地址范围上调用MEM_RESET_UNDO,则行为未定义。 指定 MEM_RESET时, VirtualAllocEx 函数将忽略 flProtect 的值。 但是,仍必须将 flProtect 设置为有效的保护值,例如 PAGE_NOACCESS。Windows Server 2008 R2、Windows 7、Windows Server 2008、Windows Vista、Windows Server 2003 和 Windows XP: 在 Windows 8 和 Windows Server 2012 之前,不支持 MEM_RESET_UNDO 标志。 |
flProtect
: 要分配的页区域的内存保护。一般使用PAGE_EXeCUTE_READWRITE
,详见每次保护常量 (WinNT.h) - Win32 apps | Microsoft Learn
示例
如下所示为在目标进程的内存区域中从 0 开始申请大小为 4096 的内存块,权限为可读可写目标内存区域的权限为可读可写,hTarget
为目标进程句柄:
1 |
|
第四个参数常用 MEM_COMMIT | MEM_RESERVE
【winapi】VitualAlloc
https://hodlyounger.github.io/2023/10/27/A_OS/Windows/API/【winapi】VirtualAlloc/