我有一个例行程序,当我走在列表中时,我处理步行以获取每个进程的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;
}
一些对您有帮助的问题:
PROCESS_QUERY_LIMITED_INFORMATION
,我收到错误代码6或ERROR_INVALID_HANDLE
。同样尝试使用PROCESS_QUERY_INFORMATION | PROCESS_VM_READ
,结果再次出现错误5。SeDebugPrivilege
已启用,已通过SysInternals的Process Explorer验证。另外,从devenv /调用器调用的所有进程都被称为继承SeDebugPrivilege所以......这很奇怪。 非常感谢你们所有的时间,我正在努力解决这个问题:S
答案 0 :(得分:1)
您确定没有将0作为进程ID值传递吗? ID为0的系统空闲进程包含在名为[System Process]的快照中,但您无法打开它的句柄,因为OpenProcess的文档明确表示它将失败。好吧它说了一点:
如果指定的进程是系统进程(0x00000000),则 函数失败,最后一个错误代码是ERROR_INVALID_PARAMETER。如果 指定的进程是空闲进程或CSRSS之一 进程,此函数失败,最后一个错误代码是 ERROR_ACCESS_DENIED,因为它们的访问限制阻止了 打开它们的用户级代码。
嗯,这并不完全正确,因为我能够打开CSRSS的句柄(当然,它实际上没有所请求的权限)。但是对于某些受保护的进程(audiodg)可能会失败,所以你不应该这样做。相反,请检查进程的名称(如果它是您想要的名称)。