【winapi】VitualAlloc

概述:VirtualAlloc 函数详解

说明

作用:在指定进程的虚拟地址空间中保留、提交或更改内存区域的状态。该函数将它分配的内存初始化为零。

官方文档:VirtualAllocEx 函数 (memoryapi.h) - Win32 apps | Microsoft Learn

函数原型:

1
2
3
4
5
6
7
LPVOID VirtualAllocEx(
[in] HANDLE hProcess,
[in, optional] LPVOID lpAddress,
[in] SIZE_T dwSize,
[in] DWORD flAllocationType,
[in] DWORD flProtect
);

参数说明:

  • hProcess: 进程的句柄

  • lpAddress: 要分配内存块的起始地址的指针

  • dwSize: 要分配内存块的大小

  • flAllocationType:内存分配的类型

含义
MEM_COMMIT0x00001000 从指定保留内存页的磁盘) 的总内存大小和分页文件 (分配内存费用。 函数还保证当调用方稍后最初访问内存时,内容将为零。 除非实际访问虚拟地址,否则不会分配实际物理页面。若要在一个步骤中保留和提交页面,请使用 `MEM_COMMIT
MEM_RESERVE0x00002000 保留进程的虚拟地址空间范围,而无需在内存或磁盘上的分页文件中分配任何实际物理存储。使用 MEM_COMMIT 再次调用 VirtualAllocEx 来提交保留页。 若要在一个步骤中保留和提交页面,请使用 `MEM_COMMIT
MEM_RESET0x00080000 指示 lpAddressdwSize 指定的内存范围中的数据不再感兴趣。 不应从分页文件读取或写入页面。 但是,内存块稍后将再次使用,因此不应取消提交。 此值不能与任何其他值一起使用。使用此值并不能保证使用 MEM_RESET 操作的范围将包含零。 如果希望范围包含零,请取消提交内存,然后重新提交。使用 MEM_RESET 时, VirtualAllocEx 函数会忽略 fProtect 的值。 但是,仍必须将 fProtect 设置为有效的保护值,例如 PAGE_NOACCESS。如果使用 MEM_RESET并且内存范围映射到文件,VirtualAllocEx 将返回错误。 仅当共享视图映射到分页文件时,才可接受该视图。
MEM_RESET_UNDO0x1000000 仅对之前成功应用MEM_RESET的地址范围调用 MEM_RESET_UNDO 。 它指示调用方对 lpAddressdwSize 指定的指定内存范围中的数据感兴趣,并尝试反转 MEM_RESET的影响。 如果该函数成功,则表示指定地址范围中的所有数据都保持不变。 如果函数失败,则至少将地址范围中的某些数据替换为零。此值不能与任何其他值一起使用。 如果在之前未MEM_RESET的地址范围上调用MEM_RESET_UNDO,则行为未定义。 指定 MEM_RESET时, VirtualAllocEx 函数将忽略 flProtect 的值。 但是,仍必须将 flProtect 设置为有效的保护值,例如 PAGE_NOACCESSWindows Server 2008 R2、Windows 7、Windows Server 2008、Windows Vista、Windows Server 2003 和 Windows XP: 在 Windows 8 和 Windows Server 2012 之前,不支持 MEM_RESET_UNDO 标志。

示例

如下所示为在目标进程的内存区域中从 0 开始申请大小为 4096 的内存块,权限为可读可写目标内存区域的权限为可读可写,hTarget 为目标进程句柄:

1
2
3
4
5
6
7
8
9
// 在目标进程申请内存
void* pLoadLibFuncParam = nullptr;
pLoadLibFuncParam = VirtualAllocEx(hTarget, 0, 4096, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);
if (pLoadLibFuncParam == nullptr)
{
cout << "alloc memery failed" << endl;
CloseHandle(hTarget);
return 0;
}

第四个参数常用 MEM_COMMIT | MEM_RESERVE


【winapi】VitualAlloc
https://hodlyounger.github.io/A_OS/Windows/API/【winapi】VirtualAlloc/
作者
mingming
发布于
2023年10月27日
许可协议