WinAPI:OpenProcess()返回错误5,并为主机进程启用了SeDebugPrivilege

时间:2013-12-22 00:44:56

标签: c++ winapi handle getlasterror openprocess

我有一个例行程序,当我走在列表中时,我处理步行以获取每个进程的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;
}

一些对您有帮助的问题:

  1. 我正在运行Windows 7 x64 Professional。
  2. 是的,devenv.exe以“以管理员身份运行”权限启动,这意味着调试器和应用程序本身在相同的关联下启动。
  3. 我尝试切换UAC或完全关闭UAC运行应用程序。仍然是错误代码5。
  4. 我刚尝试使用PROCESS_QUERY_LIMITED_INFORMATION,我收到错误代码6或ERROR_INVALID_HANDLE。同样尝试使用PROCESS_QUERY_INFORMATION | PROCESS_VM_READ,结果再次出现错误5。
  5. SeDebugPrivilege已启用,已通过SysInternals的Process Explorer验证。另外,从devenv /调用器调用的所有进程都被称为继承SeDebugPrivilege所以......这很奇怪。
  6. 非常感谢你们所有的时间,我正在努力解决这个问题:S

1 个答案:

答案 0 :(得分:1)

您确定没有将0作为进程ID值传递吗? ID为0的系统空闲进程包含在名为[System Process]的快照中,但您无法打开它的句柄,因为OpenProcess的文档明确表示它将失败。好吧它说了一点:

  

如果指定的进程是系统进程(0x00000000),则   函数失败,最后一个错误代码是ERROR_INVALID_PARAMETER。如果   指定的进程是空闲进程或CSRSS之一   进程,此函数失败,最后一个错误代码是   ERROR_ACCESS_DENIED,因为它们的访问限制阻止了   打开它们的用户级代码。

嗯,这并不完全正确,因为我能够打开CSRSS的句柄(当然,它实际上没有所请求的权限)。但是对于某些受保护的进程(audiodg)可能会失败,所以你不应该这样做。相反,请检查进程的名称(如果它是您想要的名称)。