我有一个应用程序需要扫描内存中的某些数据类型。为了获得一些基准测试,我掀起了这个计划:
long count = 0;
MEMORY_BASIC_INFORMATION meminfo;
unsigned char *addr = 0;
HANDLE hProc = GetCurrentProcess();
while (true){
if ( VirtualQueryEx( hProc, addr, &meminfo, sizeof( meminfo ) ) == 0 ){
break;
}
if ( ( meminfo.State & MEM_COMMIT ) && ( meminfo.Protect & WRITABLE ) ){
addr = (unsigned char*)meminfo.BaseAddress + meminfo.RegionSize;
count++;
printf("%d",count);
}
}
printf("%ld\n",count);
此程序不起作用,它在第一个内存块上阻塞/崩溃。从概念上讲它也失败了,理想情况下我需要指向当前进程中的所有变量,所以我可以检查它们是否与我有任何关系。如果有人能够把我推向正确的方向,那我已经google了一段时间了,但是没有用。
我知道首先这样做通常是一个坏主意,我只想知道如果我需要这样做会怎么做。
答案 0 :(得分:1)
WRITEABLE
(在第二个if
块)不是内存保护常量之一。你是说PAGE_READWRITE
吗?您可以找到选项here的完整列表。
内存访问权限很棘手。其余的功能虽然有效。这可行,但只有在单步执行时才能查看地址:
#include <Windows.h>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
long count = 0;
MEMORY_BASIC_INFORMATION meminfo;
unsigned char *addr = 0;
HANDLE hProc = GetCurrentProcess();
while (true)
{
if (VirtualQueryEx(hProc, addr, &meminfo, sizeof(meminfo)) == 0)
{
// TODO GetLastError
break;
}
// if ((meminfo.State & MEM_COMMIT) && (meminfo.Protect & PAGE_READWRITE))
{
addr = (unsigned char*) meminfo.BaseAddress + meminfo.RegionSize;
count++;
printf("%d", count);
}
}
printf("%ld\n", count);
}