我有一个程序,我会处理每个进程的
我使用的设置主机进程SeDebugPrivilege的代码如下:
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专业版。
- 是的,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