我有一个例程,当我HANDLE
在列表中“行走”时,我会处理遍历以获取每个进程的
HANDLE h = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pe32.th32ProcessID)
访问令牌在哪里PROCESS_ALL_ACCESS
,句柄继承设置为FALSE
,并且 pe32 是PROCESSENTRY32
GetLastError()
返回错误代码 5,所有句柄都是与 Spy++32/64 中的任何适当进程不对应的地址(我尝试在两个平台目标下构建应用程序,但正如您所料,结果是一样的)。
为我正在使用的主机进程设置 SeDebugPrivilege 的代码是:
BOOL EnableDebugPrivilege(BOOL bEnable)
{
HANDLE hToken = nullptr;
LUID luid;
if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hToken)) return FALSE;
if (!LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &luid)) return FALSE;
TOKEN_PRIVILEGES tokenPriv;
tokenPriv.PrivilegeCount = 1;
tokenPriv.Privileges[0].Luid = luid;
tokenPriv.Privileges[0].Attributes = bEnable ? SE_PRIVILEGE_ENABLED : 0;
if (!AdjustTokenPrivileges(hToken, FALSE, &tokenPriv, sizeof(TOKEN_PRIVILEGES), NULL, NULL)) return FALSE;
return TRUE;
}
一些对您有帮助的问题:
- 我正在运行 Windows 7 x64 Professional。
- 是的,devenv.exe 以“以管理员身份运行”权限启动,这意味着调试器和应用程序本身是在相同的关联下启动的。
- 我尝试过切换 UAC 或完全关闭 UAC 运行应用程序。仍然是错误代码 5。
- 我只是尝试这样做,但
PROCESS_QUERY_LIMITED_INFORMATION
收到错误代码 6 或ERROR_INVALID_HANDLE
. 也尝试使用PROCESS_QUERY_INFORMATION | PROCESS_VM_READ
,结果再次出现错误 5。 SeDebugPrivilege
已启用,并通过 SysInternals 的 Process Explorer 进行了验证。此外,从 devenv / 任何调试器产生的所有进程都继承 SeDebugPrivilege 所以......这很奇怪。
非常感谢大家的宝贵时间,我正在解决这个问题:S