如何高效地执行API遍历进程?

遍历进程是Windows编程中常见的任务,通常用于监控、管理或调试系统,在Windows操作系统中,有多种API可以用来实现这一功能,以下是几种主要的遍历进程的方法:

api遍历进程

1、CreateToolhelp32Snapshot()、Process32First()和Process32Next()

创建进程快照:使用CreateToolhelp32Snapshot函数创建一个系统快照,该快照包含所有运行中的进程、线程、模块等信息,为了遍历进程,需要指定TH32CS_SNAPPROCESS标志。

      HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
      if (hSnapshot == INVALID_HANDLE_VALUE) {
          // 处理错误
      }

遍历首次进程:使用Process32First函数获取快照中的第一个进程信息。

      PROCESSENTRY32 pe32;
      pe32.dwSize = sizeof(PROCESSENTRY32);
      BOOL bRet = Process32First(hSnapshot, &pe32);

继续下次遍历:使用Process32Next函数继续遍历快照中的下一个进程信息。

      while (bRet) {
          // 处理进程信息
          bRet = Process32Next(hSnapshot, &pe32);
      }

关闭句柄:遍历完成后,应通过调用CloseHandle函数关闭快照句柄。

      CloseHandle(hSnapshot);

2、EnumProcesses()、EnumProcessModules()、GetModuleBaseName()

枚举进程标识符:使用EnumProcesses函数获取系统中所有进程的标识符。

api遍历进程

      DWORD aProcesses[1024], cbNeeded, cProcesses;
      if (!EnumProcesses(aProcesses, sizeof(aProcesses), &cbNeeded)) {
          // 处理错误
      }
      cProcesses = cbNeeded / sizeof(DWORD);

打开进程并枚举模块:对于每个进程标识符,使用OpenProcess函数打开进程,然后使用EnumProcessModules函数枚举进程的模块。

      for (unsigned int i = 0; i < cProcesses; i++) {
          if (aProcesses[i] != 0) {
              HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, aProcesses[i]);
              if (NULL != hProcess) {
                  HMODULE hMod;
                  DWORD cbNeeded;
                  if (EnumProcessModules(hProcess, &hMod, sizeof(hMod), &cbNeeded)) {
                      TCHAR szProcessName[MAX_PATH];
                      GetModuleBaseName(hProcess, hMod, szProcessName, sizeof(szProcessName) / sizeof(TCHAR));
                      _tprintf(TEXT("%s  (PID: %u)
"), szProcessName, aProcesses[i]);
                  }
                  CloseHandle(hProcess);
              }
          }
      }

3、Native API的ZwQuerySystemInformation

定义结构体:定义一个结构体来存储系统进程信息。

      typedef struct _SYSTEM_PROCESSES {
          ULONG NextEntryDelta;
          ULONG ThreadCount;
          ULONG Reserved[6];
          LARGE_INTEGER CreateTime;
          LARGE_INTEGER UserTime;
          LARGE_INTEGER KernelTime;
          UNICODE_STRING ProcessName;
          KPRIORITY BasePriority;
          ULONG ProcessId;
          ULONG InheritedFromProcessId;
          ULONG HandleCount;
          ULONG Reserved2[2];
          VM_COUNTERS VmCounters;
          IO_COUNTERS IoCounters;
      } _SYSTEM_PROCESSES, *PSYSTEM_PROCESSES;

查询系统信息:使用ZwQuerySystemInformation函数查询系统进程信息。

      NTSTATUS status = ZwQuerySystemInformation(SystemProcessesAndThreadsInformation,  // System Information class
                                               (LPVOID)&sysProcInfo,  // buffer to receive data
                                               sizeof(SYSTEM_PROCESSES),  // size of buffer
                                               &returnLength);  // length needed

4、wtsapi32.dll的WTSOpenServer()、WTSEnumerateProcess()

打开终端服务器:使用WTSOpenServer函数打开终端服务器,以便枚举远程会话中的进程。

      WTS_SESSION_INFO* pSessionInfo = NULL;
      DWORD dwSessionCount = 0;
      WTSFreeMemory(pSessionInfo);
      WTSEnumerateSessions(WTS_CURRENT_SERVER_HANDLE, 0, 1, &pSessionInfo, &dwSessionCount);

枚举进程:使用WTSEnumerateProcess函数枚举终端服务器会话中的进程。

api遍历进程

      for (int i = 0; i < dwSessionCount; i++) {
          WTS_PROCESS_INFO* pProcessInfo = NULL;
          DWORD dwProcessCount = 0;
          if (WTSEnumerateProcesses(WTS_CURRENT_SERVER_HANDLE, pSessionInfo[i].SessionId, 0, &pProcessInfo, &dwProcessCount)) {
              for (int j = 0; j < dwProcessCount; j++) {
                  // 处理进程信息
              }
          }
          WTSFreeMemory(pProcessInfo);
      }

方法各有优缺点,具体选择哪种方法取决于实际需求和应用场景,如果需要获取详细的进程信息,可以选择使用CreateToolhelp32Snapshot()、Process32First()和Process32Next();如果只需要简单的进程列表,可以使用EnumProcesses()。

小伙伴们,上文介绍了“api遍历进程”的内容,你了解清楚吗?希望对你有所帮助,任何问题可以给我留言,让我们下期再见吧。

原创文章,作者:K-seo,如若转载,请注明出处:https://www.kdun.cn/ask/699047.html

Like (0)
Donate 微信扫一扫 微信扫一扫
K-seo的头像K-seoSEO优化员
Previous 2024-12-03 02:47
Next 2024-12-03 02:50

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

免备案 高防CDN 无视CC/DDOS攻击 限时秒杀,10元即可体验  (专业解决各类攻击)>>点击进入