能力值:
( LV4,RANK:50 )
|
-
-
2 楼
这个,有本书<<Programming application for microsoft windows>>,作者是Jeffrey Richter,里面的第14章节就是你需要的。
|
能力值:
( 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;
}
|
能力值:
( LV2,RANK:10 )
|
-
-
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 。
|
|
|