【问题标题】:Check if VirtualFreeEx has been completed/executed检查 VirtualFreeEx 是否已完成/执行
【发布时间】:2013-02-04 02:51:39
【问题描述】:

我在远程进程上使用 VirtualAllocEx 来保留一些空间,如下所示:

VirtualAllocEX (RemoteProcessHandle, nil, SizeInBytes, MEM_COMMIT or MEM_RESERVE, PAGE_EXECUTE_READWRITE);

然后我用WriteProcessMemory“填充”/写入分配的地址空间

那我正确使用

VirtualFreeEx (RemoteProcessHandle, Address, 0, MEM_RELEASE);

释放分配的空间。

是否可以检查VirtualAllocEx的地址调用VirtualFreeEx以检查VirtualFreeEx是否成功?

【问题讨论】:

  • VirtualFreeEx 函数返回 BOOL,因此只需在调用时检查该值。
  • 很抱歉我不够精确。我的意思是可以在调用 VirtualFreeEx 后检查它。 (比如说另一个线程想要检查这个空间是否最近被 VirtualFreeEx 释放了
  • 你可以使用VirtualQueryEx来判断地址是分配的还是空闲的。但是如果地址分配的,则无法判断这是您的分配还是其他人的分配。

标签: windows delphi winapi memory-management


【解决方案1】:

一旦您将该地址返回给系统,该地址的任何未来引用都是无效的。成功调用VirtualFreeEx 后,不得再次引用Address。一旦您将地址返回给系统,系统就拥有它。该地址在未来生效的唯一方法是再次调用VirtualAllocEx

【讨论】:

  • 谢谢。我只是不知道系统将来实际上拥有该地址:/
  • @BenjaminWeiss 任何未被任何进程或资源使用的内存实际上都归系统所有,实际上 MMU 处理并跟踪所有提交/保留或释放回系统的内存,以便系统可以管理有效地记忆。
猜你喜欢
  • 1970-01-01
  • 2014-07-22
  • 1970-01-01
  • 1970-01-01
  • 2017-05-20
  • 2022-01-02
  • 2011-02-15
  • 1970-01-01
  • 2011-10-18
相关资源
最近更新 更多