gpt4 book ai didi

c++ - GetProcessMemoryInfo 失败,错误 6 句柄无效

转载 作者:行者123 更新时间:2023-11-28 01:32:14 25 4
gpt4 key购买 nike

我正在尝试使用 C++ 获取系统中运行的进程列表。我使用 Windows API 中可用的函数(如 OpenProcess 和 CreateToolhelp32Snapshot )来完成它。

问题是该代码对于大多数进程都可以正常工作,但无法单独获取关键系统进程的内存信息,我还提供了 seDebugPrivilege 并且仅以管理员身份运行该程序。

我得到类似的输出

使用的文件名 PID 内存

winlogon.exe 1248 2432 KB

fontdrvhost.exe 1308

WARNING: GetProcessMemoryInfo failed with error 6 (The handle is invalid)

dwm.exe 1384

WARNING: GetProcessMemoryInfo failed with error 6 (The handle is invalid)

svchost.exe 1448 4744 KB

我的代码是:

BOOL GetProcessList( )
{
HANDLE hProcessSnap;
HANDLE hProcess;
HANDLE hToken;
PROCESSENTRY32 pe32;
DWORD dwPriorityClass;
PROCESS_MEMORY_COUNTERS pmc;

hProcessSnap = CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS, 0 );
if( hProcessSnap == INVALID_HANDLE_VALUE )
{
char err[]="CreateToolhelp32Snapshot (of processes)";
printError( err );
return( FALSE );
}

pe32.dwSize = sizeof( PROCESSENTRY32 );

if( !Process32First( hProcessSnap, &pe32 ) )
{
char err[]="Process32First";
printError( err ); // show cause of failure
CloseHandle( hProcessSnap ); // clean the snapshot object
return( FALSE );
}
if(!OpenThreadToken(GetCurrentThread(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, FALSE, &hToken))
{
if (GetLastError() == ERROR_NO_TOKEN)
{
if (!ImpersonateSelf(SecurityImpersonation))
return FALSE;

if(!OpenThreadToken(GetCurrentThread(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, FALSE, &hToken)){
char err[]="OpenThreadToken";
printError( err );
return FALSE;
}
}
else
return FALSE;
}
SetPrivilege(hToken, SE_DEBUG_NAME, FALSE);
do
{
printf( "%-25s", pe32.szExeFile );
dwPriorityClass = 0;
SIZE_T dwMin, dwMax;
hProcess = OpenProcess( PROCESS_QUERY_LIMITED_INFORMATION , FALSE, pe32.th32ProcessID );
printf("%-10d", pe32.th32ProcessID );
if(GetProcessMemoryInfo( hProcess, (PROCESS_MEMORY_COUNTERS *)&pmc, sizeof(pmc)))
{

printf( "%-10d KB", pmc.PagefileUsage/1024);
} else{
char err[]="GetProcessMemoryInfo";
printError( err );
}
printf("\n");
CloseHandle(hProcess);
}while( Process32Next( hProcessSnap, &pe32 ) );
CloseHandle( hProcessSnap );
return( TRUE );
}

最佳答案

要使此代码工作,您必须更改:

SetPrivilege(hToken, SE_DEBUG_NAME, FALSE)

到:

SetPrivilege(hToken, SE_DEBUG_NAME, TRUE)

正如其他人评论的那样,要使此代码正常工作,您必须:

  • 检查并报告所有可能的错误情况
  • 完成后释放所有资源,在本例中释放hToken(通过CloseHandle())并在需要时调用revertToSelf()是。

除此之外,这是一个体面的努力,所以对此点赞。

链接到 SetPrivilege(),以备 future 访客需要:

https://msdn.microsoft.com/en-us/library/windows/desktop/aa446619.aspx

祝你黑客愉快。

关于c++ - GetProcessMemoryInfo 失败,错误 6 句柄无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51016457/

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