我试图获取example.exe的进程句柄,这样我就可以在上面调用TerminateProcess。我该怎么做?注意,它没有窗口,所以FindWindow不能工作。
TerminateProcess
FindWindow
dl5txlt91#
#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.. 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; }
bcs8qyzn2#
下面的代码显示如何使用toolhelp和OpenProcess获取进程的句柄。为简洁起见,删除了错误处理。
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, i.e., 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; }
bvhaajcl3#
有两种基本技术。第一种使用PSAPI; MSDN有an example,它使用EnumProcesses、OpenProcess、EnumProcessModules和GetModuleBaseName。另一个使用Toolhelp,我更喜欢它。使用CreateToolhelp32Snapshot获取进程列表的快照,使用Process32First和Process32Next遍历它,它提供模块名称和进程ID,直到找到所需的进程,然后调用OpenProcess获取句柄。
EnumProcesses
OpenProcess
EnumProcessModules
GetModuleBaseName
CreateToolhelp32Snapshot
Process32First
Process32Next
osh3o9ms4#
可以使用以下代码:
DWORD FindProcessId(const std::wstring& processName) { PROCESSENTRY32 processInfo; processInfo.dwSize = sizeof(processInfo); HANDLE processesSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL); if (processesSnapshot == INVALID_HANDLE_VALUE) { return 0; } Process32First(processesSnapshot, &processInfo); if (!processName.compare(processInfo.szExeFile)) { CloseHandle(processesSnapshot); return processInfo.th32ProcessID; } while (Process32Next(processesSnapshot, &processInfo)) { if (!processName.compare(processInfo.szExeFile)) { CloseHandle(processesSnapshot); return processInfo.th32ProcessID; } } CloseHandle(processesSnapshot); return 0; }
使用方法:
auto processId = FindProcessId(L"blabla.exe");
获取句柄应该是显而易见的,只需调用OpenProcess()或类似的方法即可。
OpenProcess()
tf7tbtn25#
退房:MSDN Article你可以使用GetModuleName(我想?)获取名称并进行检查。
GetModuleName
xytpbqjk6#
OpenProcess函数来自MSDN:若要打开另一个本地进程的句柄并获得完全访问权限,必须启用SeDebugPrivilege权限。
7fyelxc57#
如果您不介意使用system(),那么执行system("taskkill /f /im process.exe")将比这些其他方法简单得多。
system()
system("taskkill /f /im process.exe")
7条答案
按热度按时间dl5txlt91#
另外,如果你想在OpenProcess中使用PROCESS_ALL_ACCESS,你可以试试这个:
bcs8qyzn2#
下面的代码显示如何使用toolhelp和OpenProcess获取进程的句柄。为简洁起见,删除了错误处理。
bvhaajcl3#
有两种基本技术。第一种使用PSAPI; MSDN有an example,它使用
EnumProcesses
、OpenProcess
、EnumProcessModules
和GetModuleBaseName
。另一个使用Toolhelp,我更喜欢它。使用
CreateToolhelp32Snapshot
获取进程列表的快照,使用Process32First
和Process32Next
遍历它,它提供模块名称和进程ID,直到找到所需的进程,然后调用OpenProcess
获取句柄。osh3o9ms4#
可以使用以下代码:
使用方法:
获取句柄应该是显而易见的,只需调用
OpenProcess()
或类似的方法即可。tf7tbtn25#
退房:MSDN Article
你可以使用
GetModuleName
(我想?)获取名称并进行检查。xytpbqjk6#
OpenProcess函数
来自MSDN:
若要打开另一个本地进程的句柄并获得完全访问权限,必须启用SeDebugPrivilege权限。
7fyelxc57#
如果您不介意使用
system()
,那么执行system("taskkill /f /im process.exe")
将比这些其他方法简单得多。