獲取系統的進程信息

 

 

 要想獲取系統的進程信息,有個很好的方法,就是用ToolHelp,其提供的接口可以方便的滿足你的要求,如下:

 

       #include <tlhelp32.h>   //首先導入頭文件

 

       HANDLE m_hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
       PROCESSENTRY32 pe = { sizeof(pe) };
       BOOL fOk = Process32First(m_hSnapshot, &pe);//找第一個
       while(fOk)
       {

 

           //pe就是我們獲取的進程結構體

            ....................................

            //dosomething

             ....................

           fOk = Process32Next(m_hSnapshot, &pe);//還有嗎?
        }

 

    其中結構體PROCESSENTRY32定義如下:

      typedef struct tagPROCESSENTRY32
{
    DWORD   dwSize;
    DWORD   cntUsage;
    DWORD   th32ProcessID;          // this process
    ULONG_PTR th32DefaultHeapID;
    DWORD   th32ModuleID;           // associated exe
    DWORD   cntThreads;               //線程數量
    DWORD   th32ParentProcessID;    // this process's parent process
    LONG    pcPriClassBase;         // Base priority of process's threads
    DWORD   dwFlags;
    CHAR    szExeFile[MAX_PATH];    // Path
} PROCESSENTRY32;

 

方法二

         我們可以看到上面的方法簡單,但是獲取的進程信息也相對簡單,下面有個方法可以獲取相對詳細進程信息。

         在Windows自帶的ntdll.dll中有個接口NtQuerySystemInformation可以用來查詢系統信息的,接口定義如下:

          DWORD (__stdcall *NtQuerySystemInformation )(ULONG,PVOID,ULONG,ULONG);

 

         其實系統裏面的每個進程都分配一個內存快,調用上述的接口我們就可以去查詢系統指定內存塊的信息了,而進程與進程之間有一個偏移量,所有我們只要知道了前一個進程的信息和其偏移量,就可以得到下個進程的地址了。

       

         》首先定義接口NtQuerySystemInformation

                 DWORD (__stdcall *NtQuerySystemInformation )(ULONG,PVOID,ULONG,ULONG);

         》然後訪問DLL接口

                if (!NtQuerySystemInformation)
                      NtQuerySystemInformation=(DWORD (__stdcall*)(ULONG,PVOID,ULONG,ULONG))
                                   GetProcAddress(GetModuleHandle("ntdll.dll"),"NtQuerySystemInformation");

 

        》枚舉進程

              PBYTE pbyInfo = NULL;//進程地址
              PPROCESSINFO pProcessInfo;//進程結構
              DWORD dwSize = 0x4000;//進程最小探索塊
                   WCHAR *pname;
               BOOL bRet = FALSE;

                  pbyInfo=(PBYTE) malloc(dwSize);//分配內存
                   if (pbyInfo)
                      {

                             //先找到第一個進程的地址
                            while(1)
                                   {
                                         memset(pbyInfo,0,dwSize);//初始化

                                                   //查詢系統信息成功
                                             if(NtQuerySystemInformation(5,pbyInfo,dwSize,0)!=STATUS_INFO_LENGTH_MISMATCH )
                                                          break;
                                                   dwSize += 0x1000;//沒成功,加大範圍,繼續探索
                                                   pbyInfo=(PBYTE) realloc(pbyInfo,dwSize);//重新探索
                                      }
                                pProcessInfo = ( PPROCESSINFO ) pbyInfo;//得到第一個進程的地址了

 

                                 //枚舉所有的進程

                                 while(1)

                                 {

 

                                       //do something

                                        

                                       if ( pProcessInfo->dwRelativeOffset == 0 )//如果偏移量爲0,沒有進程了
                                                     break;
                                        //獲取下一個進程地址
                                       pProcessInfo=(PPROCESSINFO)((PBYTE)pProcessInfo+pProcessInfo->dwRelativeOffset);

                                  }

                 

              進程結構體定義如下:

 

              typedef struct
{
   DWORD dwRelativeOffset;   //相對偏移量
   DWORD dwThreadCount;      //線程數目
   DWORD dwUnknown1[6];
   FILETIME pfCreateTime;
   DWORD dwUnknown2[5];
   WCHAR* pszProcessName;    //不帶路徑的名稱
   DWORD dwBasePriority;     //優先級
   DWORD dwProcessID;        //進程ID
   DWORD dwParentProcessID;  //父進程ID
   DWORD dwHandleCount;      //句柄數目
   DWORD dwUnknown3;
   DWORD dwUnknown4;
   DWORD dwVirtualBytesPeak;
   DWORD dwTotalVirtualBytes;
   DWORD dwPageFaults;
   DWORD dwWorkingSetPeak;  
   DWORD dwTotalWorkingSet;       //佔用物理內存大小 
   DWORD dwPeakPagedPoolUsagePages;
   DWORD dwTotalPagedPoolUsagePages;
   DWORD dwPeakNonPagedPoolUsagePages;
   DWORD dwTotalNonPagedPoolUsagePages;
   DWORD dwPageFileBytesPeak;
   DWORD dwPrivateBytes;
   DWORD dwPageFileBytes;
   DWORD dwUnknown7[4];
   THREADINFO ti[0];
} _PROCESSINFO, *PPROCESSINFO;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章