2

我有一个例程,当我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 所以......这很奇怪。

非常感谢大家的宝贵时间,我正在解决这个问题:S

4

1 回答 1

1

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

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

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

于 2013-12-22T09:11:24.480 回答