要通过进程名称检索进程句柄,我们可以利用 CreateToolhelp32Snapshot 函数获取系统进程的快照。此函数提供对正在运行的进程的信息的访问,包括其进程名称。
以下代码片段演示了如何使用 CreateToolhelp32Snapshot 和 Process32Next 来搜索进程命名并检索其句柄:
#include <cstdio> #include <windows.h> #include <tlhelp32.h> int main(int, char *[]) { PROCESSENTRY32 entry; entry.dwSize = sizeof(PROCESSENTRY32); HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); if (Process32First(snapshot, &entry) == TRUE) { while (Process32Next(snapshot, &entry) == TRUE) { if (stricmp(entry.szExeFile, "target.exe") == 0) { HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, entry.th32ProcessID); // Do stuff with the process... CloseHandle(hProcess); } } } CloseHandle(snapshot); return 0; }
如果您需要PROCESS_ALL_ACCESS 访问权限,您可能需要暂时启用 SE_DEBUG_NAME 权限。具体方法如下:
#include <cstdio> #include <windows.h> #include <tlhelp32.h> void EnableDebugPriv() { 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); } int main(int, char *[]) { EnableDebugPriv(); // ... (Code from previous example)... return 0; }
以上是如何在 C 中通过名称检索进程句柄?的详细内容。更多信息请关注PHP中文网其他相关文章!