我需要从C使用Win32最简单的方式获取另一个进程的进程句柄的可执行文件名。
我正在寻找的过程没有任何注册的窗口类。 我也知道,如果它正在运行,将只有一个它正在运行的实例。
使用CreateToolhelp32Snapshot , Process32First和Process32Next枚举所有进程。
在PROCESSENTRY32里面你可以找到一个szExeFile
成员。 您可以通过在同一个结构中调用具有进程ID th32ProcessID
OpenProcess来获取进程句柄。
一旦你找到一个匹配你的exe名字的进程,你可以打破你的循环,并获得句柄。
注意:如果您需要枚举每个进程,无论会话是什么,您应该获得SE_DEBUG特权。
在您的主要电话的顶部:
acquirePrivilegeByName(SE_DEBUG_NAME);// SeDebugPrivilege
这里是acquirePrivilegeByName
的定义:
BOOL acquirePrivilegeByName( const TCHAR *szPrivilegeName) { HANDLE htoken; TOKEN_PRIVILEGES tkp; DWORD dwerr; if (szPrivilegeName == NULL) { SetLastError(ERROR_INVALID_PARAMETER); return FALSE; } if (!LookupPrivilegeValue(NULL, szPrivilegeName, &(tkp.Privileges[0].Luid))) return FALSE; tkp.PrivilegeCount = 1; tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &htoken)) return FALSE; if (!AdjustTokenPrivileges(htoken, FALSE, &tkp, 0, NULL, NULL) || GetLastError() != ERROR_SUCCESS) // may equal ERROR_NOT_ALL_ASSIGNED { dwerr = GetLastError(); CloseHandle(htoken); SetLastError(dwerr); return FALSE; } CloseHandle(htoken); SetLastError(ERROR_SUCCESS); return TRUE; } //acquirePrivilegeByName()
除了我上面所说的,还有一个关于如何在这里使用上面的Win32 API的例子。