我需要在另一个进程的内存中找到一个模式,我正在使用ReadProcessMemory。由于我使用rabin karp或similars(模式匹配)等算法,并且由于ReadProcessMemory将内存(ram - > ram)复制到缓冲区,因此涉及到一些轻微的开销。我想知道读取的最佳内存量是多少每次履行职责
我的意思是:ReadProcessMemory(each_byte)听起来耗费了大量时间,而ReadProcessMemory(all_the_process_memory)的声音空间非常昂贵。是否有最佳权衡或更好的方法来设置读数的粒度?
答案 0 :(得分:0)
在外部存储器上进行图案扫描时,应一次读取一个区域。区域和大小应通过使用VirtualQueryEx()来检索。您还应该过滤掉不是MEM_COMMIT或PAGE_NOACCESS区域的区域。
这是一个逻辑示例:
char* buffer{ nullptr };
char* addr{ nullptr };
char* match{ nullptr };
SIZE_T bytesRead;
MEMORY_BASIC_INFORMATION mbi{ 0 };
while (VirtualQueryEx(hProc, addr, &mbi, sizeof(mbi)))
{
if (mbi.State == MEM_COMMIT && mbi.Protect != PAGE_NOACCESS)
{
delete[] buffer;
buffer = new char[mbi.RegionSize];
ReadProcessMemory(hProc, mbi.BaseAddress, buffer, mbi.RegionSize, &bytesRead);
char* internalAddr = Compare(pattern, mask, buffer, bytesRead);
if (internalAddr != nullptr)
{
//calculate from internal relative buffer to external absolute
match = mbi.BaseAddress + (internalAddr - buffer);
break;
}
}
addr += mbi.RegionSize;
}
return match;
此过程通常少于2秒,即使是非常大的过程也不应超过10秒。