• 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);
    

      

     

  • 相关阅读:
    Elasticsearch5.3 学习(一):安装、Yii2.0 下载es扩展
    lnmp 环境require(): open_basedir restriction in effect 错误
    Ueditor编辑器图片上传到万象优图
    Linux curl 模拟form表单提交信息和文件
    CP936 转换成 UTF-8
    wamp 两个不同的php.ini
    PHP浮点数运算精度造成的,订单金额支付经常少1分的问题
    进制相关:存储与转换
    Python的数据类型
    pycharm+PyQt5 开发配置
  • 原文地址:https://www.cnblogs.com/csuftzzk/p/OpenProcess.html
Copyright © 2020-2023  润新知