1. 程式人生 > >Windows API一日一練 91 GetProcessMemoryInfo函數

Windows API一日一練 91 GetProcessMemoryInfo函數

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函數