Windows API一日一練 91 GetProcessMemoryInfo函數
阿新 • • 發佈:2019-02-01
enum ref 頁面 size get ons 函數 out font
當大家打開Windows任務管理器時,就會看到每個進程使用內存的分布情況,往往會發現有一些進程占用大量的內存,在這種情況也是一種異常情況,可以作為是否惡意軟件的標誌之一。下面就來使用API函數GetProcessMemoryInfo來獲取內存的使用情況。
函數GetProcessMemoryInfo聲明如下:
BOOL
WINAPI
GetProcessMemoryInfo(
HANDLE Process,
PPROCESS_MEMORY_COUNTERS ppsmemCounters,
DWORD cb
);
Process是獲取內存使用情況的進程句柄。
ppsmemCounters是返回內存使用情況的結構。
cb是結構的大小。
調用函數的例子如下:
#001 //獲取某一個進程的內存信息。
#002 //蔡軍生 2007/12/18 QQ:9073204 深圳
#003 void TestGetProcessMemoryInfo(void)
#004 {
#005 //
#006 const int nBufSize = 512;
#007 TCHAR chBuf[nBufSize];
#008 ZeroMemory(chBuf,nBufSize);
#009
#010 //
#011 DWORD dwProcs[1024];
#012 DWORD dwNeeded;
#013
#014 //枚舉所有進程ID。
#015 if ( !EnumProcesses( dwProcs, sizeof(dwProcs), &dwNeeded ) )
#016 {
#017 //輸出出錯信息。
#018 wsprintf(chBuf,_T("EnumProcesses failed (%d)./n"), GetLastError() );
#019 OutputDebugString(chBuf);
#020
#021 return;
#022 }
#023
#024 // 計算有多少個進程ID。
#025 DWORD dwProcCount = dwNeeded / sizeof(DWORD);
#026
#027 wsprintf(chBuf,_T("EnumProcesses Count(%d)./n"), dwProcCount );
#028 OutputDebugString(chBuf);
#029
#030 //遍歷所有進程ID,打開進程。
#031 for (DWORD i = 0; i < dwProcCount; i++)
#032 {
#033 wsprintf(chBuf,_T("EnumProcesses (%d)./r/n"), dwProcs[i] );
#034 OutputDebugString(chBuf);
#035
#036 //根據進程ID打開進程。
#037 HANDLE hProcess = OpenProcess( PROCESS_QUERY_INFORMATION |
#038 PROCESS_VM_READ,
#039 FALSE, dwProcs[i] );
#040
#041 if (hProcess)
#042 {
#043 //
#044 PROCESS_MEMORY_COUNTERS pmc;
#045 pmc.cb = sizeof(PROCESS_MEMORY_COUNTERS);
#046
#047 //獲取這個進程的內存使用情況。
#048 if ( ::GetProcessMemoryInfo( hProcess, &pmc, sizeof(pmc)) )
#049 {
#050 ZeroMemory(chBuf,nBufSize);
#051
#052 wsprintf(chBuf,_T("/t缺頁中斷次數: 0x%08X/n"), pmc.PageFaultCount );
#053 OutputDebugString(chBuf);
#054
#055 wsprintf(chBuf,_T("/t使用內存高峰: 0x%08X/n"),
#056 pmc.PeakWorkingSetSize );
#057 OutputDebugString(chBuf);
#058
#059 wsprintf(chBuf,_T("/t當前使用的內存: 0x%08X/n"), pmc.WorkingSetSize );
#060 OutputDebugString(chBuf);
#061
#062 wsprintf(chBuf,_T("/t使用頁面緩存池高峰: 0x%08X/n"),
#063 pmc.QuotaPeakPagedPoolUsage );
#064 OutputDebugString(chBuf);
#065
#066 wsprintf(chBuf,_T("/t使用頁面緩存池: 0x%08X/n"),
#067 pmc.QuotaPagedPoolUsage );
#068 OutputDebugString(chBuf);
#069
#070 wsprintf(chBuf,_T("/t使用非分頁緩存池高峰: 0x%08X/n"),
#071 pmc.QuotaPeakNonPagedPoolUsage );
#072 OutputDebugString(chBuf);
#073
#074 wsprintf(chBuf,_T("/t使用非分頁緩存池: 0x%08X/n"),
#075 pmc.QuotaNonPagedPoolUsage );
#076 OutputDebugString(chBuf);
#077
#078 wsprintf(chBuf,_T("/t使用分頁文件: 0x%08X/n"), pmc.PagefileUsage );
#079 OutputDebugString(chBuf);
#080
#081 wsprintf(chBuf,_T("/t使用分頁文件的高峰: 0x%08X/n"),
#082 pmc.PeakPagefileUsage );
#083 OutputDebugString(chBuf);
#084 }
#085
#086 //
#087 CloseHandle(hProcess);
#088 }
#089 }
#090
#091 }
再分享一下我老師大神的人工智能教程吧。零基礎!通俗易懂!風趣幽默!還帶黃段子!希望你也加入到我們人工智能的隊伍中來!https://blog.csdn.net/jiangjunshow
Windows API一日一練 91 GetProcessMemoryInfo函數