我正在编写一个内存扫描程序,它可以工作,但我的代码的这一部分正在减慢扫描速度
if (ReadProcessMemory(phandle,(void*)currentAddress,&value,sizeof(value),0) != 0)
{
if (value == searchfor)
{
DWORD newdatasize = sizeof(newdata);
found += 1;
printf(" FOUND %d at 0x%08X!", searchfor, currentAddress);
liste[currentAddress] = searchfor;
}
total += 1;
}
我如何解决这个问题?
答案 0 :(得分:1)
@fritzone描述,ReadProcessMemory
非常慢(与进程内存读取相比),因为它必须为每个请求执行所有开销工作。
目前,您正在使用ReadProcessMemory
一次读取单个值(最多可能是4或8个字节)。您可以通过一次读取大块内存(几KB或MB)来提高应用程序的性能,以分摊开销。
答案 1 :(得分:0)
读取另一个进程的内存并不是最快的操作。 MSDN说:
在进行任何数据传输之前,系统会验证基本地址和指定大小的内存中的所有数据是否都可供读取访问
然后:
ReadProcessMemory将指定地址范围内的数据从指定进程的地址空间复制到当前进程的指定缓冲区
根据您尝试读取的内存的位置,这可能需要一些时间。试想一下,它被分页到页面文件。然后操作系统需要从页面文件重新读取数据,需要将其放在进程的内存中,可能需要将其他内容写入页面文件。这"搞乱其他流程的内部事务"感觉就像触摸他们亲密的部分。除非你真的需要,否则不要这样做,如果你必须这么做的话。