gpt4 book ai didi

c++ - 为什么我需要使用 VirtualAlloc/VirtualAllocEx?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:57:22 26 4
gpt4 key购买 nike

我需要使用 VirtualAlloc/VirtualAllocEx 做什么?

举个例子,我发现的一个案例——如果我分配了 4 GB 的虚拟内存,那么如果我不使用所有虚拟内存,那么我就不会花费物理内存,如果我调整数组大小,我 不需要做新的分配和复制旧数据到新数组。

struct T_custom_allocator; // which using VirtualAllocEx()
std::vector<int, T_custom_allocator> vec;
vec.reserve(4*1024*1024*1024); // allocated virtual memory (physical memory is not used)
vec.resize(16384); // allocated 16KB of physical memory
// ...
vec.resize(32768); // allocated 32KB of physical memory
// (no need to copy of first 16 KB of data)

如果我使用标准分配器,我在调整大小时需要复制数据:

std::vector<int> vec;
vec.resize(16384); // allocated 16KB of physical memory
// ...
vec.resize(32768); // allocated 32KB of physical memory
// and need to copy of first 16 KB of data

或者使用标准分配器,我必须花费 4GB 物理内存:

std::vector<int> vec;
vec.reserve(4*1024*1024*1024); // allocated 4GB of physical memory
vec.resize(16384); // no need to do, except changing a local variable of size
// ...
vec.resize(32768); // no need to do, except changing a local variable of size

但是,为什么这比 realloc() 更好? http://www.cplusplus.com/reference/cstdlib/realloc/

还有其他使用 VirtualAlloc[Ex] 的案例吗?

最佳答案

尚未提及的 VirtualAllocEx 的另一个用途是在另一个进程的地址空间中分配内存。请注意,第一个参数是进程的句柄 - 该函数在该进程的虚拟地址空间内分配内存。

我之前在将代码注入(inject)另一个进程时使用过它,方法是在目标进程中强制调用 LoadLibrary。基本步骤如下:

  1. 获取目标进程的进程 ID(例如使用 GetWindowThreadProcessId)。
  2. 使用 OpenProcess 获取具有适当权限的进程句柄。
  3. 使用 VirtualAllocEx 在该进程中分配一些内存。
  4. 使用 WriteProcessMemory 将 DLL 的名称复制到该内存中。
  5. 使用 GetProcAddress 获取 LoadLibrary 函数的地址。
  6. 调用 CreateRemoteThread 以在目标进程中启动 LoadLibrary 调用,线程参数是您使用 VirtualAllocEx 分配的内存 (包含 DLL 的名称)。

并不是说您需要了解所有这些,但我认为这是一个有趣的用例。

关于c++ - 为什么我需要使用 VirtualAlloc/VirtualAllocEx?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17513363/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com