当我们写某些具有破坏性的程序时就需要对进程进行遍历和提取ID
对于上述功能,我们先介绍几个API
1.CreateToolhelp32Snapshout function
得到进程、模块或者线程的快照
语法如下:
HANDLE WINAPI CreateToolhelp32Snapshot(
_In_ DWORD dwFlags,
_In_ DWORD th32ProcessID
);
第一个参数:快照中包含了系统的一部分,参数如下:
我们这里用TH32CS_SNAPPROCESS
快照包含了系统里面的所有进程。
第二个是关于 PROCESSENTRY32结构体
语法如下:
typedef struct tagPROCESSENTRY32 {
DWORD dwSize;
DWORD cntUsage;
DWORD th32ProcessID;
ULONG_PTR th32DefaultHeapID;
DWORD th32ModuleID;
DWORD cntThreads;
DWORD th32ParentProcessID;
LONG pcPriClassBase;
DWORD dwFlags;
TCHAR szExeFile[MAX_PATH];
} PROCESSENTRY32, *PPROCESSENTRY32;
这描述了一个入口,这个入口是当快照被调用时系统地址空间里面的进程被读取。
这里只介绍szExeFile[MAX_PATH]和
th32ParentProcessID:这是创建进程后的进程的标识(父进程)
szExeFile:进程里面可执行文件的名字
下面是源代码!部分函数没有讲解,但可以通过注释或者字面意思可以了解
#include <Windows.h>
#include <stdio.h>
#include <TlHelp32.h>
int main()
{
HANDLE hProceessnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (hProceessnap == INVALID_HANDLE_VALUE)
{
printf_s("创建进行快照失败\n");
return -1;
}
else
{
PROCESSENTRY32 pe32;
pe32.dwSize = sizeof(pe32);
BOOL hProcess = Process32First(hProceessnap, &pe32);
char buff[1024];
while (hProcess)
{
wsprintf(buff, "进程名:%s--------------------进程ID:%d", pe32.szExeFile, pe32.th32ParentProcessID);
printf_s("%s\n", buff);
memset(buff, 0x00, 1024);
hProcess = Process32Next(hProceessnap, &pe32);
}
}
CloseHandle(hProceessnap);
return 0;
}
运行结果如下