我怎样才能得到一个进程句柄的C ++名称?
我想要得到example.exe的进程句柄,所以我可以在它上面调用TerminateProcess
。 我该怎么做? 注意,它没有窗口,所以FindWindow
将不起作用。
#include <cstdio> #include <windows.h> #include <tlhelp32.h> int main( int, char *[] ) { PROCESSENTRY32 entry; entry.dwSize = sizeof(PROCESSENTRY32); HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL); 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.. CloseHandle(hProcess); } } } CloseHandle(snapshot); return 0; }
另外,如果你想在OpenProcess中使用PROCESS_ALL_ACCESS,你可以试试这个:
#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(); PROCESSENTRY32 entry; entry.dwSize = sizeof(PROCESSENTRY32); HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL); 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.. CloseHandle(hProcess); } } } CloseHandle(snapshot); return 0; }
以下代码显示了如何使用toolhelp和OpenProcess来获取进程的句柄。 出于简洁目的删除了error handling。
HANDLE GetProcessByName(PCSTR name) { DWORD pid = 0; // Create toolhelp snapshot. HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); PROCESSENTRY32 process; ZeroMemory(&process, sizeof(process)); process.dwSize = sizeof(process); // Walkthrough all processes. if (Process32First(snapshot, &process)) { do { // Compare process.szExeFile based on format of name, ie, trim file path // trim .exe if necessary, etc. if (string(process.szExeFile) == string(name)) { pid = process.th32ProcessID; break; } } while (Process32Next(snapshot, &process)); } CloseHandle(snapshot); if (pid != 0) { return OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid); } // Not found return NULL; }
有两个基本的技术。 第一个使用PSAPI; MSDN有一个使用EnumProcesses
, OpenProcess
, EnumProcessModules
和GetModuleBaseName
的示例 。
另一个使用Toolhelp,我更喜欢。 使用CreateToolhelp32Snapshot
获取进程列表的快照,用Process32First
和Process32Next
(它提供模块名称和进程ID)遍历它,直到find所需的,然后调用OpenProcess
来获取句柄。
查看: MSDN文章
你可以使用GetModuleName
(我认为?)来获取名称并检查。
OpenProcess函数
来自MSDN:
要打开另一个本地进程的句柄并获得完全访问权限,您必须启用SeDebugPrivilege权限。