问题标签 [virtualquery]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
271 浏览

performance - 在内存中搜索字符串时出现性能问题

我在 Win32 下开发 DLL,它做了一个简单的工作:它扫描主机的虚拟内存中的子字符串。但由于某种原因,与使用单线程扫描的 Cheat Engine、ArtMoney 甚至 OllyDbg 相比,它的运行速度非常慢。这是我使用 VirtualQuery() 获得的扫描单个内存部分的函数的代码。主机(.exe 应用程序)提交大约 300-400 MiB 的内存,我必须扫描大约 170 个不同大小的内存部分,从 4KiB 到 32MiB。我只扫描 MEM_PRIVATE、MEM_COMMIT 区域,不扫描 PAGE_GUARD、PAGE_NOACCESS、PAGE_READONLY,跳过 DLL 自己的内存。

出于某种原因,性能很糟糕 - 找到单个字符串需要 10-12 秒。例如 OllyDbg 在 ~2-3 秒内找到字符串。

我正在使用 MSVS 2010。

编译器命令行:

链接器命令行:

我究竟做错了什么?我的算法是坏的还是其他内存扫描仪使用了某种“魔法”?

0 投票
1 回答
323 浏览

c++ - MEMORY_BASIC_INFORMATION32 不再合法了?

我正在尝试使用 Windows API 查询内存信息。我想同时针对 x86 和 x64。因此,我阅读了有关 MEMORY_BASIC_INFORMATION 的文档,发现我需要两个来根据目标进程“位数”进行不同的查询。

但是当我查询 x86 进程并使用 MEMORY_BASIC_INFORMATION32 结构时,我得到系统错误代码 24。这表示命令的长度不合法。

但是当我使用 MEMORY_BASIC_INFORMATION64 版本时,该调用适用于 x86 和 x64 进程。那是怎么回事。这不是我理解的文档告诉我的。 https://msdn.microsoft.com/en-us/library/windows/desktop/aa366775(v=vs.85).aspx

这种行为是否可以跨版本移植。任何人都可以解释这种行为。还是只是我的系统完全搞砸了?

这是我使用的代码:

谢谢是提前。

0 投票
1 回答
260 浏览

windows - 不同架构上的 MEMORY_BASIC_INFORMATION 和 VirtualQueryEx

MEMORY_BASIC_INFORMATION的MSDN 页面在备注部分指出 MEMORY_BASIC_INFORMATION32 和 MEMORY_BASIC_INFORMATION64 应在目标进程运行在与查询程序不同的体系结构上的情况下指定(使用VirtualQueryEx时))。我还发现一些 SO 帖子在他们对相关问题的回答中指出了这一点。尽管我发现 VirtualQUEeryEx 传递的 MEMORY_BASIC_INFORMATION 的版本与我的程序架构相同,尽管目标是相同的。我想确保我正确解析来自 VirtualQueryEx 的信息。我真的需要指定我使用的 MEMORY_BASIC_INFORMATION 的版本来匹配目标的体系结构吗?如果是这样,为什么 VirtualQueryEx 只返回我的程序架构的版本,我该如何解决这个问题?

0 投票
2 回答
913 浏览

windows - VirtualProtectEx,ERROR_INVALID_PARAMETER(错误 87)

我正在尝试编写一个可以通过进程内存的函数。我注意到 ReadProcessMemory 在权限设置为 PAGE_NOACCESS 或 PAGE_GUARD 的区域上会失败。我决定使用 VirtualProtectEx 临时更改这些页面的权限,以便能够阅读它们。这似乎在大多数情况下都有效,但总会有少数情况下 VirtualProtectEx 会因 ERROR_INVALID_PARAMETER 而失败。我对所有参数进行了三重检查,它们似乎是正确的,我什至添加了在失败时再次调用 VirtualQueryEx 的代码,以确保传递的参数仍然有效。是什么原因造成的,我该如何解决?我在下面添加了一些最小(尽可能少)的代码来重现问题。

0 投票
1 回答
257 浏览

c++ - C++ 线程的可用堆栈大小

我使用 Windows 10、Visual Studio 2019 程序生成线程。我需要添加功能,指出在任何执行时间内可用的堆栈大小。

我尝试使用 . 但我不确定我该如何继续。我只能查询堆栈的总大小。不是一个可用的。

可能我还可以检查堆栈内是否有一些地址

我看到了几个类似的问题,但没有人 100% 回答这个问题。获得可用堆栈大小的正确方法是什么?

0 投票
0 回答
295 浏览

c++ - C++ - x64 进程的 VirtualQueryEx

这是我用于 x86 进程的内存扫描的代码:

代码正常工作。但是当我使用这段代码对x64进程进行内存扫描时,结果不正确!

我试图更改MEMORY_BASIC_INFORMATIONMEMORY_BASIC_INFORMATION64

我搜索了很多,但不明白如何解决它。

0 投票
1 回答
165 浏览

c++ - C++ winapi VirtualQueryEx 函数给了我“000000”

我正在尝试显示有关系统上每个进程的虚拟内存的信息:

输出如下所示:

输出

我得到基地址和分配等于 0000000 并键入 0 如何获得正常值?我的意思是大小和状态似乎还可以,但其余的是“0000000”我不知道有什么问题