gpt4 book ai didi

c++ - 如何在 VC++ 2005 中使用 OpenProcessToken、AdjustTokenPrivileges 和 GetExitCodeProcess

转载 作者:可可西里 更新时间:2023-11-01 13:59:10 25 4
gpt4 key购买 nike

我读了几篇关于如何检查一个进程是否从另一个进程退出的帖子(我意识到有些人在这里对语义很感兴趣,但只是开玩笑)我试图实现它但遇到了到处都是错误代码 5(“ERROR_ACCESS_DENIED”)。

这是我的做法。

1) 进程 1 (P1) 启动进程 2 并将其自己的 PID 写入共享内存位置。

2)进程2(P2)从共享内存中读取PID

3) P2 使用 P1 的 PID 调用 OpenProcess(...) 以保存它可以稍后检查的句柄。

4) P2 使用 P1 的 PID 重复调用 GetExitCodeProcess(...) 并检查 STILL_ACTIVE 代码。

在上述方法中,我一直在 GetExitCodeProcess 上收到 ACCESS_DENIED 错误。我尝试使用 MSDN 文档中的以下代码修改 P2 的权限:

HANDLE proc_h = OpenProcess(SYNCHRONIZE, FALSE, GetCurrentProcessId());
HANDLE hToken;
OpenProcessToken(proc_h, TOKEN_ADJUST_PRIVILEGES, &hToken);

LookupPrivilegeValue(NULL, lpszPrivilege, &luid );

tp.PrivilegeCount = 1;
tp.Privileges[0].Luid = luid;
tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
// Enable the privilege
AdjustTokenPrivileges(hToken,
FALSE,
&tp,
sizeof(TOKEN_PRIVILEGES),
(PTOKEN_PRIVILEGES) NULL,
(PDWORD) NULL);

但是我在调​​用 OpenProcessToken(...) 方法时不断收到 ACCESS_DENIED 错误。那么这是否表明存在某种系统级障碍?我在我的机器上拥有管理员权限并且我运行的是 XP。

在此先感谢您的帮助。

最佳答案

传递给 GetExitCodeProcess 的句柄需要 PROCESS_QUERY_INFORMATION 访问权限。以下工作正常:

int main(int a_argc, char** a_argv)
{
int pid = atoi(*(a_argv + 1));

HANDLE h = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, pid);

if (NULL != h)
{
Sleep(2000);
DWORD exit_code;
if (FALSE == GetExitCodeProcess(h, &exit_code))
{
std::cerr << "GetExitCodeProcess() failure: " <<
GetLastError() << "\n";
}
else if (STILL_ACTIVE == exit_code)
{
std::cout << "Still running\n";
}
else
{
std::cout << "exit code=" << exit_code << "\n";
}
}
else
{
std::cerr << "OpenProcess() failure: " << GetLastError() << "\n";
}

return 0;
}

不是在 GetExitCodeProcess 上轮询,而是用 SYNCHRONIZE 打开句柄并等待它退出:

int main(int a_argc, char** a_argv)
{
int pid = atoi(*(a_argv + 1));

HANDLE h = OpenProcess(SYNCHRONIZE | PROCESS_QUERY_INFORMATION, FALSE, pid);

if (NULL != h)
{
WaitForSingleObject(h, 5000); // Change to 'INFINITE' wait if req'd
DWORD exit_code;
if (FALSE == GetExitCodeProcess(h, &exit_code))
{
std::cerr << "GetExitCodeProcess() failure: " <<
GetLastError() << "\n";
}
else if (STILL_ACTIVE == exit_code)
{
std::cout << "Still running\n";
}
else
{
std::cout << "exit code=" << exit_code << "\n";
}
}
else
{
std::cerr << "OpenProcess() failure: " << GetLastError() << "\n";
}

return 0;
}

关于c++ - 如何在 VC++ 2005 中使用 OpenProcessToken、AdjustTokenPrivileges 和 GetExitCodeProcess,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8898133/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com