要想獲取系統的進程信息,有個很好的方法,就是用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;