首页
社区
课程
招聘
[旧帖] [求助]VirtualQueryEx函数怎么用 0.00雪花
发表于: 2011-9-16 13:32 1626

[旧帖] [求助]VirtualQueryEx函数怎么用 0.00雪花

2011-9-16 13:32
1626
C++打开一个进程,用VirtualQueryEx函数搜索该进程的所有数据。

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (3)
雪    币: 113
活跃值: (100)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
2
这个,有本书<<Programming application for microsoft windows>>,作者是Jeffrey Richter,里面的第14章节就是你需要的。
2011-9-16 21:54
0
雪    币: 54
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
看看这个吧例子,以前用的时候网上找的,主要是这个MEMORY_BASIC_INFORMATION结构.
// 显示一个进程的内存状态 dwPID为进程ID
BOOL ShowProcMemInfo(DWORD dwPID)
{
        HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION,
        FALSE,
        dwPID);
        if(hProcess == NULL)
        return FALSE;
        MEMORY_BASIC_INFORMATION mbi;
        DWORD pAddress = 0x0041d8c3;
        TCHAR szInfo[200] = _T("BaseAddr Size Type State Protect \n");
        _tprintf(szInfo);
        while(TRUE)
        {
                if(VirtualQueryEx(hProcess, (LPVOID)pAddress, &mbi, sizeof(mbi)) != sizeof(mbi))
                {
                        break;
                        printf("VirtualQueryEx Error");
                        getchar();
                        return false;
                }
                if((mbi.AllocationBase != mbi.BaseAddress) && (mbi.State != MEM_FREE))
                {
                        _stprintf(szInfo, _T(" %08X %8dK "),
                        mbi.BaseAddress,
                        mbi.RegionSize>>10);
                }
                else
                {
                        _stprintf(szInfo, _T("%08X %8dK "),
                        mbi.BaseAddress,
                        mbi.RegionSize>>10);
                }
                LPCTSTR pStr = _T("");
                switch(mbi.Type)
                {
                        case MEM_IMAGE: pStr = _T("MEM_IMAGE "); break;
                        case MEM_MAPPED: pStr = _T("MEM_MAPPED "); break;
                        case MEM_PRIVATE: pStr = _T("MEM_PRIVATE"); break;
                        default: pStr = _T("-----------"); break;
                }
                _tcscat(szInfo, pStr);
                _tcscat(szInfo, _T(" "));
                switch(mbi.State)
                {
                        case MEM_COMMIT: pStr = _T("MEM_COMMIT "); break;
                        case MEM_RESERVE: pStr = _T("MEM_RESERVE"); break;
                        case MEM_FREE: pStr = _T("MEM_FREE "); break;
                        default: pStr = _T("-----------"); break;
                }
                _tcscat(szInfo, pStr);
                _tcscat(szInfo, _T(" "));
                switch(mbi.AllocationProtect)
                {
                        case PAGE_READONLY: pStr = _T("PAGE_READONLY "); break;
                        case PAGE_READWRITE: pStr = _T("PAGE_READWRITE "); break;
                        case PAGE_WRITECOPY: pStr = _T("PAGE_WRITECOPY "); break;
                        case PAGE_EXECUTE: pStr = _T("PAGE_EXECUTE "); break;
                        case PAGE_EXECUTE_READ: pStr = _T("PAGE_EXECUTE_READ "); break;
                        case PAGE_EXECUTE_READWRITE: pStr = _T("PAGE_EXECUTE_READWRITE"); break;
                        case PAGE_EXECUTE_WRITECOPY: pStr = _T("PAGE_EXECUTE_WRITECOPY"); break;
                        case PAGE_GUARD: pStr = _T("PAGE_GUARD "); break;
                        case PAGE_NOACCESS: pStr = _T("PAGE_NOACCESS "); break;
                        case PAGE_NOCACHE: pStr = _T("PAGE_NOCACHE "); break;
                        default: pStr = _T("----------------------"); break;
                }
                _tcscat(szInfo, pStr);
                _tcscat(szInfo, _T("\n"));
                _tprintf(szInfo);
                pAddress = ((PBYTE)mbi.BaseAddress + mbi.RegionSize);
        }
        CloseHandle(hProcess);
        getchar();
        return TRUE;
}
2011-9-16 22:52
0
雪    币: 16
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
haw
4
上msdn查一查!

第一个参数是进程的句柄;
第二个参数是内存地址指针;
第三个参数是指向 MEMORY_BASIC_INFORMATION 结构的指针,用于返回内存空间的信息;
第四个参数是 lpBuffer 的长度。

结构 MEMORY_BASIC_INFORMATION 的声明:
typedef struct _MEMORY_BASIC_INFORMATION
{
PVOID BaseAddress ;
PVOID AllocationBase ;
DWORD AllocationProtect ;
SIZE_T RegionSize ;
DWORD State ; DWORD Protect ;
DWORD Type ;
} MEMORY_BASIC_INFORMATION, *PMEMORY_BASIC_INFORMATION;
第一个参数是查询内存块的基地址;
第二个参数指的是用VirtualAlloc分配该内存时实际分配的基地址, 可以小于 BaseAddress ,也就是说 BaseAddress 一定包含在 AllocationBase 分配的范围内;
第三个参数指的是分 配该页面时,页面的一些属性,如 PAGE_READWRITE、PAGE_EXECUTE 等(其它属性 可参考 Platform SDK );
第四 个参数指的是从 BaseAddress 开始,具有相同属性的页面的大小。
第五参数指的是页面的状态,有三种可能值: MEM_COMMIT、MEM_FREE 和 MEM_RESERVE ,这个参数是最重要的,从中可知指定内存页面的状态;
第六个参数指的是页面的属性,其可能的取值与 AllocationProtect 相同;最后一个参数指明了该内存块的类型,有三种可能值: MEM_IMAGE 、MEM_MAPPED 和 MEM_PRIVATE 。
2011-9-21 10:41
0
游客
登录 | 注册 方可回帖
返回
//