• 7.3 通过API枚举进程


    首先实现枚举当前系统中所有进程信息,枚举该进程的核心点在于使用CreateToolhelp32Snapshot()函数,该函数用于创建系统进程和线程快照,它可以捕获当前系统中进程和线程相关的信息(如PID、线程数量、线程ID等),在对这些信息进行处理后,可以获得很多有用的数据,如当前系统中所有正在执行的进程的信息列表,以及每个进程各自的详细信息(如CPU、内存占用量等)。

    CreateToolhelp32Snapshot 函数原型如下:

    HANDLE CreateToolhelp32Snapshot(
      DWORD dwFlags,  // 快照类型标记
      DWORD th32ProcessID  // 进程PID,如果打算捕获系统所有进程的信息,则为0
    );
    
    • 1
    • 2
    • 3
    • 4

    参数说明:

    • 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 
    #include 
    #include 
    
    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;
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34

    上述代码可用于枚举输出当前系统中所有的正在运行进程列表,通过在枚举过程中增加一个_tcsicmp()函数,判断pe.szExeFileszProcessName两者的值我们就可以实现取特定进程的PID,如下代码所示则可实现取QQ进程的PID信息。

    #include 
    #include 
    #include 
    #include 
    
    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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
  • 相关阅读:
    springboot整合ELK
    《canvas》之第8章 像素操作
    ERP管理系统:企业升级的秘密武器
    SPI协议读取FLASH【FPGA】
    【MySQL】解决在join表时一对多的情况下重复数据的问题
    野风药业IPO被终止:曾拟募资5.4亿 实控人俞蘠曾进行P2P投资
    使用matlab实现图像信号的色彩空间转换
    JUC并发编程第六篇,带你了解Java内存模型JMM
    es基础学习笔记问题总结
    【蓝桥杯真题练习】STEMA科技素养练习题库 答案版014 持续更新中~
  • 原文地址:https://blog.csdn.net/lyshark_csdn/article/details/133198974