Pnig0s1992:

列出当前系统信息,当前系统内存状况。

枚举进程,列出每个进程所有内存块的页面类型,页面属性,保护属性等信息

 

  1. //Code by Pnig0s1992 
  2. //Date:2012,3,15 
  3. #include <stdio.h> 
  4. #include <Windows.h> 
  5. #include <TlHelp32.h> 
  6.  
  7. VOID getMemoryInfo(SYSTEM_INFO si,HANDLE hProcess); 
  8.  
  9. int main(void
  10.     SYSTEM_INFO si; 
  11.     MEMORYSTATUS ms; 
  12.     ms.dwLength = sizeof(ms); 
  13.     GetSystemInfo(&si); 
  14.     printf("\n当前内存页大小%uKB",si.dwPageSize/1024); 
  15.     printf("\n小于0x%x为系统保留区.",si.lpMinimumApplicationAddress); 
  16.     printf("\n大于0x%x为系统内核区.",si.lpMaximumApplicationAddress); 
  17.     printf("\nCPU数量:%u",si.dwNumberOfProcessors); 
  18.     GlobalMemoryStatus(&ms); 
  19.     printf("\n当前系统内存使用率:%u%%:",ms.dwMemoryLoad); 
  20.     printf("\n当前系统总物理内存:%uM",ms.dwTotalPhys/1024/1024); 
  21.     printf("\n当前系统可用物理内存:%uM",ms.dwAvailPhys/1024/1024); 
  22.     printf("\n当前系统总虚拟内存:%uM",ms.dwTotalVirtual/1024/1024); 
  23.     printf("\n当前系统可用虚拟内存:%uM",ms.dwAvailVirtual/1024/1024); 
  24.     printf("\n当前系统总页文件:%uM",ms.dwTotalPageFile/1024/1024); 
  25.     printf("\n当前系统可用页文件:%uM",ms.dwAvailPageFile/1024/1024); 
  26.     PROCESSENTRY32 pe32; 
  27.     pe32.dwSize = sizeof(pe32); 
  28.     HANDLE hProcessSnap; 
  29.     hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0); 
  30.     if(hProcessSnap == INVALID_HANDLE_VALUE) 
  31.     { 
  32.         printf("\n获取进程快照失败"); 
  33.         return -1; 
  34.     }else 
  35.     { 
  36.         Process32First(hProcessSnap,&pe32); 
  37.         do  
  38.         { 
  39.             printf("\n当前进程名:%S PID:%u",pe32.szExeFile,pe32.th32ProcessID); 
  40.             if(pe32.th32ProcessID != GetCurrentProcessId()) 
  41.             { 
  42.                 HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION|PROCESS_VM_READ,FALSE,pe32.th32ProcessID); 
  43.                 getMemoryInfo(si,hProcess); 
  44.             } 
  45.         } while (Process32Next(hProcessSnap,&pe32)); 
  46.     } 
  47.     system("pause"); 
  48.     return 0; 
  49.  
  50. VOID getMemoryInfo(SYSTEM_INFO si,HANDLE hProcess) 
  51.     printf("\n内存地址 保护属性 页面类型"); 
  52.     DWORD dwCurPos = (DWORD)si.lpMinimumApplicationAddress;//第一次查询位置为可访问的最小内存地址 
  53.     while(dwCurPos <(DWORD)si.lpMaximumApplicationAddress) //结束条件为最大内存地址 
  54.     { 
  55.         MEMORY_BASIC_INFORMATION mbi; 
  56.         DWORD dwRc = VirtualQueryEx(hProcess,(LPVOID)dwCurPos,&mbi,sizeof(mbi)); 
  57.         printf("\n0x%x %u %u",mbi.BaseAddress,mbi.AllocationProtect,mbi.Type); 
  58.         dwCurPos = (DWORD)mbi.BaseAddress+mbi.RegionSize;//当前块儿基址加块儿大小 
  59.     }