gpt4 book ai didi

c++ - OpenProcess 函数返回无效句柄

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

我正在开发一个应用程序,它可以创建多个桌面并让用户能够在他当前使用的桌面下启动他想要的任何应用程序。

当该桌面关闭时(使用组合键)我想关闭在该桌面下打开的所有应用程序。为此,我使用 EnumProcesses 函数枚举所有进程,并根据 EnumProcesses 使用 OpenProcess 函数返回的每个进程标识符检索句柄。使用 GetThreadId 我检索用作 GetThreadDesktop 函数参数的线程标识符,并将返回的句柄与桌面上的句柄进行比较,因此我可以找出在哪个进程运行的桌面。

至少在理论上,这是可行的,因为对于每个进程标识符,OpenProcess 函数都会为 GetThreadId 返回一个无效句柄(错误代码 6)。我以管理员身份运行应用程序并启用了 SeDebugPrivilege 权限。

我不明白为什么返回的句柄总是无效的,这是我使用的代码:

void iterateProcesses(HDESK threadDesktop)
{
EnableDebugPriv(); // functions enables the SeDebugPrivilege privilege

int found = 0;
int wanted = 0;

DWORD aProcesses[1024], cbNeeded, cProcesses;
unsigned int i;

EnumProcesses(aProcesses, sizeof(aProcesses), &cbNeeded);
cProcesses = cbNeeded / sizeof(DWORD);

for (i = 0; i < cProcesses; i++)
{
if (aProcesses[i] != 0)
{
found++;
if (GetThreadDesktop(checkProcess(aProcesses[i])) == threadDesktop)
{
wanted++;
}
}
}

}

DWORD checkProcess(DWORD processID)
{
HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, TRUE, processID);
GetLastError(); // if in the manifest file under 'UAC execution level'
// the application does not requests for administrator rights
// GetLastError() will return code 5 (access denied)

DWORD dwThreadId = GetThreadId(hProcess);
GetLastError(); // return code 6 (ERROR_INVALID_HANDLE)
// dwThreadId returned is always 0 because the handle is not valid

CloseHandle(hProcess);
return dwThreadId;
}

最佳答案

你的错误检查是错误的。请再次阅读文档。只有在函数失败时才调用 GetLastError

只有在执行提升时,您才能获得对进程句柄的所有访问权限,这是合理的。但是您确实需要检查 OpenProcess 返回的值,如文档中所述。仅当该值指示成功时才继续。否则,调用 GetLastError 找出原因。

您需要将线程句柄传递给 GetThreadIdhProcess 是进程句柄。因此 ERROR_INVALID_HANDLE 错误代码。但同样,您没有正确检查错误。您必须首先检查返回值,如文档中所述。仅当这表明失败时才调用 GetLastError

我不确定您如何期望从进程中获得单个线程。进程可以并且确实有很多线程。确实可以创建和销毁线程,因此您正在寻找的线程可能已经不存在了。尽管如此,以下是枚举进程中线程的方法:https://msdn.microsoft.com/en-us/library/windows/desktop/ms686852.aspx

关于c++ - OpenProcess 函数返回无效句柄,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31427696/

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