OpenProcess打开进程返回错误的问题
问题描述
项目中需要做一个小功能:能够查看系统中当前正在运行的进程的内存信息,如内存块类型、分配状态、访问权限等。如下图所示:

需要的信息和上图相差无几。说起来也不算太难,毕竟现成的API已经提供了。我们要做的就是遍历获取每个进程的句柄,然后逐个打开就可以提取信息了。
排查结论
但是,当我逐步编写完代码并运行时,发现什么结果也没得到。于是乎,打开调试器下了几个断点跟了进去发现:GetLastError()的返回值在遇到System Process时,会返回错误代码87。回头一查MSDN,人家已然说明:当OpenProcess()给定的进程ID为0时,该函数会失败并且GetLastError()返回的错误代码是ERROR_INVALID_PARAMETER。这个错误代码值就是87。另外还说明了,当给定的进程是空闲进程(Idle Process)或CSRSS进程之一时,GetLastError()返回的错误代码是ERROR_ACCESS_DENIED,其值为5. 出于系统安全性考虑,操作系统禁止用户层代码打开这些进程。
显然,错误很明显了。我并没有过滤这些特殊进程,而是一股脑的全部调用OpenProcess()打开进程。而刚好,我的系统上第一个遍历的进程就是System Process(进程ID为0)。于是程序直接跳出了而得不到任何结果。另外,我的系统是Windows 7 64位系统,网上有人说在Windows XP系统上不会出现这种错误,不知道真假。
遍历进程并打开:
HANDLE proc = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (proc == INVALID_HANDLE_VALUE)
{
assert(proc != INVALID_HANDLE_VALUE);
return ;
}
ProcessMemory item;
HANDLE hProcess;
PROCESS_MEMORY_COUNTERS pmc;
PROCESSENTRY32 procEntry = { 0 };
procEntry.dwSize = sizeof(PROCESSENTRY32);
BOOL bRet = Process32First(proc,&procEntry);
while (bRet)
{
hProcess = OpenProcess( PROCESS_QUERY_INFORMATION| PROCESS_VM_READ, FALSE, procEntry.th32ProcessID );
if (NULL == hProcess)
{
int ret = GetLastError();
// skip the system process and Idle process or one of CSRSS process
if (ret != ERROR_INVALID_PARAMETER && ret != ERROR_ACCESS_DENIED)
return; // function failed for other errors
}
else
{
if ( GetProcessMemoryInfo( hProcess, &pmc, sizeof(pmc)) )
{
item.pname = procEntry.szExeFile;
item.pid = procEntry.th32ProcessID;
item.PageFaultCount = pmc.PageFaultCount;
item.PagefileUsage = pmc.PagefileUsage;
item.PeakPagefileUsage = pmc.PeakPagefileUsage;
item.PeakWorkingSetSize = pmc.PeakWorkingSetSize;
item.QuotaNonPagedPoolUsage = pmc.QuotaNonPagedPoolUsage;
item.QuotaPagedPoolUsage = pmc.QuotaPagedPoolUsage;
item.QuotaPeakNonPagedPoolUsage = pmc.QuotaPeakNonPagedPoolUsage;
item.QuotaPeakPagedPoolUsage = pmc.QuotaPeakPagedPoolUsage; m_procsmem.push_back(item);
}
} bRet = Process32Next(proc, &procEntry);
}
CloseHandle(hProcess);
CloseHandle(proc);
OpenProcess打开进程返回错误的问题的更多相关文章
- Win32 OpenProcess打开进程失败,返回5无权限操作
		Win32 OpenProcess打开进程失败,返回5无权限操作,相信你会碰到这样的事,在IDE中可以,单独却不可以了,其实这时就需要提权了,否则是无法打开的,OpenProcess提权至Debug即 ... 
- 查看进程所用的内存(使用GetWindowThreadProcessId取得进程ID,OpenProcess打开进程和GetProcessMemoryInfo取得内存信息)
		// function GetProcessMemorySize(_sProcessName: string; var _nMemSize: Cardinal): Boolean; var l_nWn ... 
- C#操作FTP报错,远程服务器返回错误:(550)文件不可用(例如,未找到文件,无法访问文件)的解决方法
		最近在做项目的时候需要操作ftp进行文件的上传下载,但在调用using (var response = (FtpWebResponse)FtpWebRequest.GetResponse())的时候总 ... 
- 写自动更新程序出现"远程服务器返回错误: (404) 未找到"
		在win2003配置后,在客户端运行时能够下载exe和dll文件,但是在更新lib文件时总是报“远程服务器返回错误: (404) 未找到”错误,不明白咋会出现这个问题,去网上一查,发现以下解决办法: ... 
- HttpWebResponse远程服务器返回错误: (500) 内部服务器错误。
		现象 我们编码实现请求一个页面时,请求的代码类似如下代码: HttpWebRequest req = (HttpWebRequest)WebRequest.Create(strUrl); req.Us ... 
- IIS上部署MVC网站,打开后ExtensionlessUrlHandler-Integrated-4.0解决方法IIS上部署MVC网站,打开后500错误
		IIS上部署MVC网站,打开后ExtensionlessUrlHandler-Integrated-4.0解决方法 IIS上部署MVC网站,打开后500错误:处理程序“ExtensionlessUrl ... 
- NuGet在Push的时候提示“远程服务器返回错误:(403)已禁用”问题解决
		在使用NuGet把包push到nuget官网的时候,提示了如下信息: Failed to process request. 'The specified API key is invalid or d ... 
- C# FTP远程服务器返回错误:(550) 文件不可用(例如,未找到文件,无法访问文件)
		今天用代码删除FTP服务器上的目录时候,报错:远程服务器返回错误:(550) 文件不可用(例如,未找到文件,无法访问文件). 习惯性的google,不外乎以下几点: 1.URL路径不对,看看有没有多加 ... 
- ajax提交后完全不进入action直接返回错误
		今天遇到个问题就是jQuery提交ajax请求,居然没有进入action的断点而直接返回错误信息. 仔细排查后才发现原来是因为客户端提交的某字段是100w的值,而后台对应的字段是个Short类型,根本 ... 
随机推荐
- mybatis热加载的实现
			最近在使用mybatis,由于是刚刚开始用,用的并不顺手,目前是感觉有2个地方非常的不好用: 1.mybatis调试不方便 由于dao层只有接口,实现只是一个map的xml文件,想加断点都没有地方加, ... 
- Linux之crontab
			一 cron crond位于/etc/rc.d/init.d/crond 或 /etc/init.d 或 /etc/rc.d /rc5.d/S90crond,最总引用/var/lock/subsys ... 
- mssql中sp_executesql的用法
			上图: 
- 封装一个UILabel圆形边框显示进度
			封装了一个UILabel并让它显示圆形的边框,UILabel上面显示百份比,而边框则用Animation绘制到整个圆占指定百分比的点. 这只是我个人想的继承一个UILabel实现的,用到两个CASha ... 
- iOS:缓存与Operation优先级问题
			这篇博客来源于今年的一个面试题,当我们使用SDWebImgae框架中的sd_setImageWithURL: placeholderImage:方法在tableView或者collectionView ... 
- [Z] Windows 8/10 audio编程
			都是些网上搜到的比较不错的文章.关于这块儿的内容网上帖子不多.出去下面列的最主要的还有参考MSDN. WASAPI使用介绍: https://blogs.windows.com/buildingapp ... 
- [Z] 北大一牛人生物转申CS的经历
			http://www.bdwm.net/bbs/bbscon.php?board=CIS&file=M.1367038121.A&num=626&attach=0&di ... 
- 转:php park、unpark、ord 函数使用方法(二进制流接口应用实例)
			在工作中,我也逐渐了解到park,unpark,ord对于二进制字节处理的强大. 下面我逐一介绍它们. park,unpark,ord这3个函数,在我们工作中,用到它们的估计不多. 我在最近一 ... 
- EDM博主笔记:EDM邮件营销的几个细节问题
			其实说起EDM邮件营销很多做过的人都知道,目前国内邮件营销的效果其实是比较差的,为什么?因为国内没有多少使用邮件的习惯,如果不是工作所需估计很多的人都几天不碰邮件了,但是反观国外 邮件是其日常的一部分 ... 
- IL速查
			名称 说明 Add 将两个值相加并将结果推送到计算堆栈上. Add.Ovf 将两个整数相加,执行溢出检查,并且将结果推送到计算堆栈上. Add.Ovf.Un 将两个无符号整数值相加,执行溢出检查,并且 ... 
