gpt4 book ai didi

c++ - 可以使用错误代码为 ERROR_ACCESS_DENIED 的 OpenProcess 来了解进程是否存在吗?

转载 作者:行者123 更新时间:2023-11-28 03:34:48 27 4
gpt4 key购买 nike

我在 Windows 平台上运行以下代码。目的是了解特定进程 ID 是否引用现有进程。

BOOL bProcessExists = FALSE;
HANDLE hProcHandle = ::OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, dwProcID);
if(hProcHandle)
{
bProcessExists = TRUE;
::CloseHandle(hProcHandle);
}
else
{
if(::GetLastError() == ERROR_ACCESS_DENIED)
{
bProcessExists = TRUE;
}
}

运行上面代码的进程没有运行提升,我发现 OpenProcess 可以返回对某些进程 ID 的拒绝访问。

上面的代码有效吗?

最佳答案

我更担心您的假设,即能够打开该进程意味着该进程存在(“存在”的极其宽松的定义除外)。

只要至少有一个打开该进程的句柄,该进程的一个条目就会被保留。如果(例如)父进程生成一个进程,然后保留子进程的句柄,则子进程仍然会有一个条目,即使该进程已经退出。在这种情况下,假设您拥有适当的权限,您将能够打开该进程的句柄,即使该进程已经退出也是如此。

要正确处理这种情况,您可能需要调用 GetExitCodeProcess,并且只有在返回 STILL_ALIVE 作为进程状态时才说进程存在。

至于另一部分,我不能肯定地说它会起作用,但我会说很有可能。我使用了一种类似的技术来验证用户的密码——让他们输入建议的用户名和密码。然后使用 NetUserChangePassword(out 更改密码的权限)。然后你看看你得到的错误——ERROR_ACCESS_DENIED 表示他们输入的用户名/密码组合有效,ERROR_INVALID_PASSWORD 表示它无效。

关于c++ - 可以使用错误代码为 ERROR_ACCESS_DENIED 的 OpenProcess 来了解进程是否存在吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11279035/

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