C/C++遍历进程和进程ID的小工具

原文:http://blog.csdn.net/qq78442761/article/details/54646010

当我们写某些具有破坏性的程序时就需要对进程进行遍历和提取ID 

对于上述功能,我们先介绍几个API

1.CreateToolhelp32Snapshout function

得到进程、模块或者线程的快照

语法如下:

[cpp] view plain copy
 
  1. HANDLE WINAPI CreateToolhelp32Snapshot(  
  2.   _In_ DWORD dwFlags,  
  3.   _In_ DWORD th32ProcessID  
  4. );  

第一个参数:快照中包含了系统的一部分,参数如下:

我们这里用TH32CS_SNAPPROCESS

快照包含了系统里面的所有进程。

第二个是关于 PROCESSENTRY32结构体

语法如下:

[cpp] view plain copy
 
  1. typedef struct tagPROCESSENTRY32 {  
  2.   DWORD     dwSize;  
  3.   DWORD     cntUsage;  
  4.   DWORD     th32ProcessID;  
  5.   ULONG_PTR th32DefaultHeapID;  
  6.   DWORD     th32ModuleID;  
  7.   DWORD     cntThreads;  
  8.   DWORD     th32ParentProcessID;  
  9.   LONG      pcPriClassBase;  
  10.   DWORD     dwFlags;  
  11.   TCHAR     szExeFile[MAX_PATH];  
  12. } PROCESSENTRY32, *PPROCESSENTRY32;  

这描述了一个入口,这个入口是当快照被调用时系统地址空间里面的进程被读取。

这里只介绍szExeFile[MAX_PATH]和

th32ParentProcessID:这是创建进程后的进程的标识(父进程)

szExeFile:进程里面可执行文件的名字

下面是源代码!部分函数没有讲解,但可以通过注释或者字面意思可以了解

[cpp] view plain copy
 
  1. #include <Windows.h>  
  2. #include <stdio.h>  
  3. #include <TlHelp32.h>  
  4.   
  5. int main()  
  6. {  
  7.     HANDLE hProceessnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);  
  8.     if (hProceessnap == INVALID_HANDLE_VALUE)  
  9.     {  
  10.         printf_s("创建进行快照失败 ");  
  11.         return -1;  
  12.     }  
  13.     else  
  14.     {  
  15.         PROCESSENTRY32 pe32;  
  16.         pe32.dwSize = sizeof(pe32);  
  17.         BOOL hProcess = Process32First(hProceessnap, &pe32);  
  18.         char buff[1024];  
  19.         while (hProcess)  
  20.         {  
  21.             wsprintf(buff, "进程名:%s--------------------进程ID:%d", pe32.szExeFile, pe32.th32ParentProcessID);  
  22.             printf_s("%s ", buff);  
  23.             memset(buff, 0x00, 1024);  
  24.             hProcess = Process32Next(hProceessnap, &pe32);  
  25.         }  
  26.     }  
  27.     CloseHandle(hProceessnap);  
  28.   
  29.     return 0;  
  30. }  

运行结果如下

 
原文地址:https://www.cnblogs.com/lizhigang/p/7324171.html