首页 > 后端开发 > C++ > 如何在 C 中按名称检索进程句柄?

如何在 C 中按名称检索进程句柄?

Susan Sarandon
发布: 2024-11-20 18:25:15
原创
575 人浏览过

How Can I Retrieve a Process Handle by Name in C  ?

在 C 中按名称检索进程句柄

在 C 中,您可能会遇到需要根据进程名称来操作进程的情况。例如,您可能希望终止名为“example.exe”的进程,而不依赖于窗口句柄。这个问题深入研究了这个特定场景并提出了一个解决方案。

要按名称检索进程句柄,我们可以利用 Windows API 函数 CreateToolhelp32Snapshot 和 Process32Next。下面是演示此方法的代码片段:

#include <cstdio>
#include <windows.h>
#include <tlhelp32.h>

int main() {
  // Create a snapshot of running processes
  HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);

  // Iterate over the processes
  PROCESSENTRY32 entry;
  entry.dwSize = sizeof(PROCESSENTRY32);
  if (Process32First(snapshot, &entry) == TRUE) {
    while (Process32Next(snapshot, &entry) == TRUE) {
      // Check if this is the process we want
      if (strcmp(entry.szExeFile, "example.exe") == 0) {
        // Open a handle to the process
        HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, entry.th32ProcessID);
        // Perform desired operations on the process
        CloseHandle(hProcess);  // Close the handle
      }
    }
  }

  CloseHandle(snapshot);  // Close the snapshot handle
  return 0;
}
登录后复制

此解决方案将迭代所有正在运行的进程并将其可执行文件名称与“example.exe”进行比较。一旦找到匹配项,就会获得该进程的句柄,并可用于执行终止等操作(通过 TerminateProcess)。

注意:如果您计划在 OpenProcess 中使用 PROCESS_ALL_ACCESS ,您可能需要通过启用 SE_DEBUG_NAME 权限来提升进程的权限。执行此操作的代码如下所示:

void EnableDebugPriv() {
  // Enable debug privilege
  HANDLE hToken;
  LUID luid;
  TOKEN_PRIVILEGES tkp;
  OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken);
  LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &luid);
  tkp.PrivilegeCount = 1;
  tkp.Privileges[0].Luid = luid;
  tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
  AdjustTokenPrivileges(hToken, false, &tkp, sizeof(tkp), NULL, NULL);
  CloseHandle(hToken);
}
登录后复制

以上是如何在 C 中按名称检索进程句柄?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板