要想获取系统的进程信息,有个很好的方法,就是用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;