7.3 通过API枚举进程
【摘要】 首先实现枚举当前系统中所有进程信息,枚举该进程的核心点在于使用CreateToolhelp32Snapshot()函数,该函数用于创建系统进程和线程快照,它可以捕获当前系统中进程和线程相关的信息(如PID、线程数量、线程ID等),在对这些信息进行处理后,可以获得很多有用的数据,如当前系统中所有正在执行的进程的信息列表,以及每个进程各自的详细信息(如CPU、内存占用量等)。CreateTool...
首先实现枚举当前系统中所有进程信息,枚举该进程的核心点在于使用CreateToolhelp32Snapshot()
函数,该函数用于创建系统进程和线程快照,它可以捕获当前系统中进程和线程相关的信息(如PID、线程数量、线程ID等),在对这些信息进行处理后,可以获得很多有用的数据,如当前系统中所有正在执行的进程的信息列表,以及每个进程各自的详细信息(如CPU、内存占用量等)。
CreateToolhelp32Snapshot 函数原型如下:
HANDLE CreateToolhelp32Snapshot(
DWORD dwFlags, // 快照类型标记
DWORD th32ProcessID // 进程PID,如果打算捕获系统所有进程的信息,则为0
);
参数说明:
- dwFlags:表示快照类型标记。可以为TH32CS_SNAPALL、TH32CS_SNAPPROCESS或TH32CS_SNAPTHREAD。其中:
- TH32CS_SNAPPROCESS:捕获当前系统中所有进程的信息;
- TH32CS_SNAPTHREAD:捕获当前系统中所有线程的信息;
- TH32CS_SNAPALL:捕获当前系统中所有进程和线程的信息;
- th32ProcessID:进程PID,如果打算捕获系统所有进程的信息,则为0。
函数的返回值是一个句柄,它指向一个新创建的进程快照。如果函数调用失败,函数返回INVALID_HANDLE_VALUE。这个函数通常与Process32First()
和Process32Next()
一起使用,用于枚举进程和线程信息的快照。通过使用创建的进程快照句柄和枚举处理函数,可以获取当前系统中所有进程或线程的详细信息。
- Process32First 获取快照中第一条记录,即第一个进程的信息,执行成功返回TRUE,并把第一个进程信息写入传入参数PE32指定的结构体中;
- Process32Next 获取下一个进程的信息,执行成功返回TRUE,并把下一个进程信息写入传入参数PE32指定的结构体中;
#include <Windows.h>
#include <stdio.h>
#include <TlHelp32.h>
int EnumProcess()
{
PROCESSENTRY32 pe32 = { 0 };
pe32.dwSize = sizeof(PROCESSENTRY32);
// 获取全部进程快照
HANDLE hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (INVALID_HANDLE_VALUE != hProcessSnap)
{
// 获取快照中第一条信息
BOOL bRet = Process32First(hProcessSnap, &pe32);
while (bRet)
{
printf("进程ID: %-5d --> 进程名: %s \n", pe32.th32ProcessID, pe32.szExeFile);
// 获取快照中下一条信息
bRet = Process32Next(hProcessSnap, &pe32);
}
CloseHandle(hProcessSnap);
}
return -1;
}
int main(int argc,char * argv [])
{
EnumProcess();
system("pause");
return 0;
}
上述代码可用于枚举输出当前系统中所有的正在运行进程列表,通过在枚举过程中增加一个_tcsicmp()
函数,判断pe.szExeFile
与szProcessName
两者的值我们就可以实现取特定进程的PID,如下代码所示则可实现取QQ进程的PID信息。
#include <Windows.h>
#include <stdio.h>
#include <TlHelp32.h>
#include <tchar.h>
DWORD FindProcessID(LPCTSTR szProcessName)
{
DWORD dwPID = 0xFFFFFFFF;
HANDLE hSnapShot = INVALID_HANDLE_VALUE;
PROCESSENTRY32 pe;
pe.dwSize = sizeof(PROCESSENTRY32);
hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPALL, NULL);
Process32First(hSnapShot, &pe);
do
{
if (!_tcsicmp(szProcessName, (LPCTSTR)pe.szExeFile))
{
dwPID = pe.th32ProcessID;
break;
}
} while (Process32Next(hSnapShot, &pe));
CloseHandle(hSnapShot);
return dwPID;
}
int main(int argc,char *argv[])
{
DWORD PID = FindProcessID(L"qq.exe");
printf("该进程PID是: %d \n", PID);
system("pause");
return 0;
}
本文作者: 王瑞
本文链接: https://www.lyshark.com/post/54a95c77.html
版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)