事实证明,Vista 及更高版本中新增了用于获取进程路径和新进程访问权限的功能 (PROCESS_QUERY_LIMITED_INFORMATION):
您可以通过此权限获取进程的句柄。示例如下:
#include <Windows.h>
#include <psapi.h>
#include <iostream>
#include <tlhelp32.h>
BOOL SetPrivilege(
HANDLE hToken, // token handle
LPCTSTR Privilege, // Privilege to enable/disable
BOOL bEnablePrivilege // TRUE to enable. FALSE to disable
)
{
TOKEN_PRIVILEGES tp = { 0 };
// Initialize everything to zero
LUID luid;
DWORD cb = sizeof(TOKEN_PRIVILEGES);
if (!LookupPrivilegeValue(NULL, Privilege, &luid))
return FALSE;
tp.PrivilegeCount = 1;
tp.Privileges[0].Luid = luid;
if (bEnablePrivilege) {
tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
}
else {
tp.Privileges[0].Attributes = 0;
}
AdjustTokenPrivileges(hToken, FALSE, &tp, cb, NULL, NULL);
if (GetLastError() != ERROR_SUCCESS)
{
std::cout << GetLastError() << std::endl;
return FALSE;
}
return TRUE;
}
int main()
{
HANDLE curHandle = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, GetCurrentProcessId());
OpenProcessToken(curHandle, TOKEN_ADJUST_PRIVILEGES, &curHandle);
BOOL b = SetPrivilege(curHandle, SE_DEBUG_NAME, TRUE);
wchar_t buf[MAX_PATH] = L"";
int pid = 668;
HANDLE handle = OpenProcess(PROCESS_QUERY_LIMITED_INFORMATION, FALSE, pid);
if (handle)
{
GetModuleFileNameExW(handle, 0, buf, MAX_PATH);
std::wcout << buf << "\n";
}
else
{
std::cout << "error = " << GetLastError() << std::endl;
}
char s[MAX_PATH] = "";
DWORD len = MAX_PATH;
if (handle)
{
QueryFullProcessImageName(handle, 0, s, &len);
std::cout << s;
}
if (handle)
CloseHandle(handle);
return 0;
}
输出: