程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> 調用WinApi查詢內存信息

調用WinApi查詢內存信息

編輯:關於C++

Pnig0s1992:

列出當前系統信息,當前系統內存狀況。

枚舉進程,列出每個進程所有內存塊的頁面類型,頁面屬性,保護屬性等信息

//Code by Pnig0s1992 
//Date:2012,3,15 
#include <stdio.h> 
#include <Windows.h> 
#include <TlHelp32.h> 
     
VOID getMemoryInfo(SYSTEM_INFO si,HANDLE hProcess); 
     
int main(void) 
{ 
    SYSTEM_INFO si; 
    MEMORYSTATUS ms; 
    ms.dwLength = sizeof(ms); 
    GetSystemInfo(&si); 
    printf("\n當前內存頁大小%uKB",si.dwPageSize/1024); 
    printf("\n小於0x%x為系統保留區.",si.lpMinimumApplicationAddress); 
    printf("\n大於0x%x為系統內核區.",si.lpMaximumApplicationAddress); 
    printf("\nCPU數量:%u",si.dwNumberOfProcessors); 
    GlobalMemoryStatus(&ms); 
    printf("\n當前系統內存使用率:%u%%:",ms.dwMemoryLoad); 
    printf("\n當前系統總物理內存:%uM",ms.dwTotalPhys/1024/1024); 
    printf("\n當前系統可用物理內存:%uM",ms.dwAvailPhys/1024/1024); 
    printf("\n當前系統總虛擬內存:%uM",ms.dwTotalVirtual/1024/1024); 
    printf("\n當前系統可用虛擬內存:%uM",ms.dwAvailVirtual/1024/1024); 
    printf("\n當前系統總頁文件:%uM",ms.dwTotalPageFile/1024/1024); 
    printf("\n當前系統可用頁文件:%uM",ms.dwAvailPageFile/1024/1024); 
    PROCESSENTRY32 pe32; 
    pe32.dwSize = sizeof(pe32); 
    HANDLE hProcessSnap; 
    hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0); 
    if(hProcessSnap == INVALID_HANDLE_VALUE) 
    { 
        printf("\n獲取進程快照失敗"); 
        return -1; 
    }else
    { 
        Process32First(hProcessSnap,&pe32); 
        do
        { 
            printf("\n當前進程名:%S PID:%u",pe32.szExeFile,pe32.th32ProcessID); 
            if(pe32.th32ProcessID != GetCurrentProcessId()) 
            { 
                HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION|PROCESS_VM_READ,FALSE,pe32.th32ProcessID); 
                getMemoryInfo(si,hProcess); 
            } 
        } while (Process32Next(hProcessSnap,&pe32)); 
    } 
    system("pause"); 
    return 0; 
} 
     
VOID getMemoryInfo(SYSTEM_INFO si,HANDLE hProcess) 
{ 
    printf("\n內存地址 保護屬性 頁面類型"); 
    DWORD dwCurPos = (DWORD)si.lpMinimumApplicationAddress;//第一次查詢位置為可訪問的最小內存地址 
    while(dwCurPos <(DWORD)si.lpMaximumApplicationAddress) //結束條件為最大內存地址 
    { 
        MEMORY_BASIC_INFORMATION mbi; 
        DWORD dwRc = VirtualQueryEx(hProcess,(LPVOID)dwCurPos,&mbi,sizeof(mbi)); 
        printf("\n0x%x %u %u",mbi.BaseAddress,mbi.AllocationProtect,mbi.Type); 
        dwCurPos = (DWORD)mbi.BaseAddress+mbi.RegionSize;//當前塊兒基址加塊兒大小 
    } 
}

本文出自 “About:Blank H4cking” 博客,請務必保留此出處http://pnig0s1992.blog.51cto.com/393390/807029

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved