谢谢
答案 0 :(得分:3)
虚拟内存通常不是连续的。 (实际上,这就是重点。)因此,将进程的整个虚拟内存空间复制到单个连续的缓冲区中没有任何意义,并且实际上是不可能的。虚拟内存中的空白必须在缓冲区中填充一些值。这些差距可能很大,缓冲可能很大。
执行此类操作的工具(例如,出于法医目的)通常会节省范围的内存,而元数据会指示源虚拟内存地址,以便以后重新组装。
您可以首先使用VirtualQueryEx
来发现目标进程的虚拟内存范围。
看到这个问题:Enumerate the pages in a memory range
然后使用ReadProcessMemory
将数据从远程进程的虚拟内存复制到本地进程的缓冲区中。
当然,这些动作都不是原子的。如果目标进程正在运行,则在您工作时虚拟内存空间可能会更改。
也提供“工具帮助” API:Taking a Snapshot and Viewing Processes
答案 1 :(得分:1)
听起来您正在寻找MiniDumpWriteDump
和相关功能。不要自己发明轮子。
答案 2 :(得分:0)
就像我几个月前发现的那样,您可以在Google上轻松找到解决方案。简而言之,您可以使用EnumProcesses,GetProcessMemoryInfo和GetProcessImageFileName函数来实现。
您可以像这样获得的进程标识符列表:
DWORD adwProcesses[1024], dwNeeded, dwProcesses;
if (!EnumProcesses(adwProcesses, sizeof(adwProcesses), &dwNeeded)) { return 1; }
您将在其中获取所有进程标识符。所以您需要知道确切的数目,返回了多少个进程
dwProcesses = dwNeeded / sizeof(DWORD);
打印或保存内存使用次数为您拥有的进程的次数
HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, adwProcesses[k]);
PROCESS_MEMORY_COUNTERS pmc;
//Get process memory info and path to process
GetProcessMemoryInfo(hProcess, &pmc, sizeof(pmc));
GetProcessImageFileName(hProcess, szProcessName, sizeof(szProcessName) / sizeof(TCHAR));
因此您可以获得数据 对于过程路径:
strProcessName.Format(_T("PATH: %s"), szProcessName);
页面文件的内存使用情况:
strProcessPFMemory.Format(_T("%u K"), (pmc.PagefileUsage / 1024));
高峰页文件的内存使用情况:
strProcessPPFMemory.Format(_T("%u K"), (pmc.PeakPagefileUsage / 1024));
以此类推。