gpt4 book ai didi

c++ - BaseAddres 从 0 开始的 VirtualQueryEx

转载 作者:太空宇宙 更新时间:2023-11-04 04:43:42 25 4
gpt4 key购买 nike

我试图在我的流程中保留有关所有区域的信息。为此,我使用了 VirtualQueryEx。我的主要在哪里`

int _tmain(int argc, _TCHAR* argv[])
{
MEMORY_BASIC_INFORMATION mem;
unsigned long addr = 0;

while (VirtualQueryEx(GetCurrentProcess(), (PVOID)addr, &mem, sizeof(mem))) {
addr = (unsigned long)mem.BaseAddress + mem.RegionSize;
printRegionInfo(mem);
}

if (GetLastError() == ERROR_BAD_LENGTH)
_tprintf(_T("--- Reading SUCESSFULL ---\n"));
else
_tprintf(_T("--- ERROR: Read stopped ---\n\tGETLASTERROR = %u\n"), GetLastError());

_tprintf(_T("Prima qualquer tecla para terminar\n"));
getchar();
return 0;
}

`:

pringRegion 只是访问结构和打印结果。

在 VirtualQueryEx 的第一次执行中,addr 是 0,因此它应该转到当前进程的基地址,但它始终将 mem.BaseAddress 显示为 0,我很确定它是正确的,或者只是没有做我想做的正在期待。此外,循环经过的区域太多,以至于它不适合 Visual Studio 的控制台,我几乎可以肯定,当唯一要验证的进程是当前进程时,它不应该这样做。

有谁知道为什么会这样或者如何解决?

编辑:

当 while 结束并且我正在检查 GetLastError 时,它总是显示为 ERROR_INVALID_PARAMETER,而它应该是 ERROD_BAD_LENGTH,因为它表明我已到达该进程的页面末尾。

最佳答案

我看了这个,它很有趣,但并不令人惊讶。当可执行文件加载时,它会为自己创建内存部分。一些用于包含可执行代码,另一些用于加载全局数据元素,另一些则为其提供一些用于 mallocs 的起始地址空间。有一些部分允许可执行文件将 vector 创建到其他 DLL 中。这些只是调用外部函数的地址区域,并不是程序可执行代码的一部分。

查看每个区域的 mem->State 字段 - 特别是 mem->State == MEM_COMMIT 区域。它们描述了这些地址空间的可访问性。此外,任何区域都不是真正的物理内存,而是预留的虚拟地址空间,以备程序需要时使用。

不要被区域的数量所淹没。它们都没有真正描述应用程序的新物理空间,而是您的应用程序可以使用的虚拟地址集。

关于c++ - BaseAddres 从 0 开始的 VirtualQueryEx,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23305987/

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