我想做的是在运行赛车类游戏的时候查询游戏速度(动态)所在的内存,并根据状态控制串口输出。好像FPE只能把游戏进程暂停之后查内存,我希望我的程序不影响游戏进程的运行。并且赛车游戏也是由我的程序调用。
用进程间通信?HOOK?我比较弱,请高手指教!刚来的,如果给分少了请原谅!

解决方案 »

  1.   

    先用Toolhelp32Snapshot家族函数列出所有的进程
    然后OpenProcess(),然后VirtualQueryEx()就可以得到目标
    进程内存分配的具体情况,从GetSystemInfo返回的
    lpMinimumApplicationAddress开始查
      

  2.   

    我不是已经说过用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;
    };
      

  3.   

    改读内存用  ReadProcessMemory WriteProcessMemory
    这个你应该知道