C/C++遍历进程和进程ID的小工具
程序员文章站
2022-03-20 10:48:55
...
当我们写某些具有破坏性的程序时就需要对进程进行遍历和提取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; }
运行结果如下
以上就是C/C++遍历进程和进程ID的小工具的内容,更多相关内容请关注PHP中文网(www.php.cn)!