获取进程内存信息失败,错误 6 句柄无效
GetProcessMemoryInfo failed with error 6 Handle is invalid
我正在尝试使用C++获取系统中运行的进程列表。我使用Windows API中可用的功能(如OpenProcess和CreateToolhelp32Snapshot(来完成它。
问题是代码对于大多数进程都运行良好,但无法单独获取关键系统进程的内存信息,我也提供了 seDebugPrivilege 并且仅以管理员身份运行该程序。
我得到的输出是这样的
File Name PID Memory Used
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()
,以防任何未来的访问者需要它:
https://msdn.microsoft.com/en-us/library/windows/desktop/aa446619.aspx
快乐的黑客。
相关文章:
- 未知C++错误:致命错误:glibc检测到无效的stdio句柄
- C++:错误:使用空句柄
- 获取进程内存信息失败,错误 6 句柄无效
- 线程1:EXC_BAD_ACCESS错误,此错误在第一行的CPP文件中的句柄函数中出现
- 发布信号量返回错误 6(无效句柄)
- 为什么错误1400无效的窗口句柄
- 从SFML提供的X11句柄创建Irrlicht设备.运行时X11/OOpenGL错误
- 视觉C++错误"无法将参数 1 从'句柄'转换为'句柄 &'"
- 在先前关闭的文件句柄上的 fclose() 上出现双重释放错误
- 在多线程中使用curl句柄的错误工作方法的替代方法
- C++RegOpenKeyEx-错误6:句柄无效
- JNI 问题:DLL 中的文件句柄出现符号查找错误C++
- 错误 6 句柄在 Windows 上写入文件无效
- 错误 1400 无效的窗口句柄
- 为什么未初始化的返回值会导致createwindowwex的无效窗口句柄错误
- Qt 5.8 windows打印机api无效句柄错误
- ReadFileEx使用CreateFile的有效句柄时出现无效句柄错误
- c++ Win32.SelectObject失败,GetLastError返回错误1400(无效窗口句柄)
- GetThreadContext返回错误6,无效句柄
- 使用 cin >> 处理错误句柄