请高手指教:如何实时地查询其他进程所分配的内存的状态,并根据状态控制串口输出? 我想做的是在运行赛车类游戏的时候查询游戏速度(动态)所在的内存,并根据状态控制串口输出。好像FPE只能把游戏进程暂停之后查内存,我希望我的程序不影响游戏进程的运行。并且赛车游戏也是由我的程序调用。用进程间通信?HOOK?我比较弱,请高手指教!刚来的,如果给分少了请原谅! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 先用Toolhelp32Snapshot家族函数列出所有的进程然后OpenProcess(),然后VirtualQueryEx()就可以得到目标进程内存分配的具体情况,从GetSystemInfo返回的lpMinimumApplicationAddress开始查 我不是已经说过用VirtualQueryEx()吗?它就是用来查询其它进程的内存块(4KB为单位)的状态,就只有这个函数。你自己查查MSDN内它的用法。下面的函数的作用是查出目标进程可写内存的总大小:SYSTEM_INFO infoSys; LPVOID lpBlock; MEMORY_BASIC_INFORMATION infoMem; MEM_BLOCK bkNew; if (hProcess==NULL) return FALSE; while (!m_lsMemAlloc.IsEmpty()) m_lsMemAlloc.RemoveTail(); GetSystemInfo(&infoSys); lpBlock=infoSys.lpMinimumApplicationAddress; while(1) { if ( VirtualQueryEx(hProcess,lpBlock,&infoMem,sizeof(infoMem))!=sizeof(infoMem) ) break; if (infoMem.State==MEM_FREE || infoMem.State==MEM_RESERVE || infoMem.Protect==PAGE_NOACCESS) { lpBlock=(LPBYTE) lpBlock+infoMem.RegionSize; if (lpBlock>infoSys.lpMaximumApplicationAddress) break; continue; } if (infoMem.Protect==PAGE_READWRITE || infoMem.Protect==PAGE_WRITECOPY || infoMem.Protect==PAGE_EXECUTE_READWRITE || infoMem.Protect==PAGE_EXECUTE_WRITECOPY) { bkNew.m_lpAddress=infoMem.BaseAddress; bkNew.m_dwSize=infoMem.RegionSize; m_lsMemAlloc.AddTail(bkNew); } lpBlock=(LPBYTE) lpBlock+infoMem.RegionSize; if (lpBlock>infoSys.lpMaximumApplicationAddress) break; }附: CList <MEM_BLOCK,MEM_BLOCK&> m_lsMemAlloc; struct MEM_BLOCK{ LPVOID m_lpAddress; DWORD m_dwSize;}; 改读内存用 ReadProcessMemory WriteProcessMemory这个你应该知道 求助:CButtonST类中关于子对话框界面位图的设置问题,解决了立马给分 创建窗口时进入全屏 关于编译选项设置为/MD 真的是个问题 我第一次碰到 真的很紧张 如何在基于对话框的工程中定义一个指向数据库的指针?是ODBC 明天要交,在线等待!母牛生小牛的问题,答对送满分,有原码的. 如何捕获视图文档的图形对象属性?请教了!! ADO 记录查询 您能制造出真正的随机数吗?请发信到[email protected] 100分重赏!!!回答者均可适当得分,(我有1000多可用分,不会不够用的:) 关于SetWindowText的问题。 用过softice的人请进。(100)
然后OpenProcess(),然后VirtualQueryEx()就可以得到目标
进程内存分配的具体情况,从GetSystemInfo返回的
lpMinimumApplicationAddress开始查
内存块(4KB为单位)的状态,就只有这个函数。你自己查查MSDN内它的
用法。下面的函数的作用是查出目标进程可写内存的总大小:SYSTEM_INFO infoSys;
LPVOID lpBlock;
MEMORY_BASIC_INFORMATION infoMem;
MEM_BLOCK bkNew;
if (hProcess==NULL)
return FALSE;
while (!m_lsMemAlloc.IsEmpty())
m_lsMemAlloc.RemoveTail();
GetSystemInfo(&infoSys);
lpBlock=infoSys.lpMinimumApplicationAddress;
while(1)
{
if ( VirtualQueryEx(hProcess,lpBlock,&infoMem,sizeof(infoMem))!=sizeof(infoMem) )
break;
if (infoMem.State==MEM_FREE || infoMem.State==MEM_RESERVE || infoMem.Protect==PAGE_NOACCESS)
{
lpBlock=(LPBYTE) lpBlock+infoMem.RegionSize;
if (lpBlock>infoSys.lpMaximumApplicationAddress)
break;
continue;
}
if (infoMem.Protect==PAGE_READWRITE || infoMem.Protect==PAGE_WRITECOPY || infoMem.Protect==PAGE_EXECUTE_READWRITE || infoMem.Protect==PAGE_EXECUTE_WRITECOPY)
{
bkNew.m_lpAddress=infoMem.BaseAddress;
bkNew.m_dwSize=infoMem.RegionSize;
m_lsMemAlloc.AddTail(bkNew);
}
lpBlock=(LPBYTE) lpBlock+infoMem.RegionSize;
if (lpBlock>infoSys.lpMaximumApplicationAddress)
break;
}
附:
CList <MEM_BLOCK,MEM_BLOCK&> m_lsMemAlloc; struct MEM_BLOCK{
LPVOID m_lpAddress;
DWORD m_dwSize;
};
这个你应该知道