zoukankan      html  css  js  c++  java
  • 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);
    

      

     

  • 相关阅读:
    基于Python的人脸动漫转换
    let 与 var的区别
    【LeetCode】汇总
    【HDU】4632 Palindrome subsequence(回文子串的个数)
    【算法】均匀的生成圆内的随机点
    【LeetCode】725. Split Linked List in Parts
    【LeetCode】445. Add Two Numbers II
    【LeetCode】437. Path Sum III
    【LeetCode】222. Count Complete Tree Nodes
    【LeetCode】124. Binary Tree Maximum Path Sum
  • 原文地址:https://www.cnblogs.com/csuftzzk/p/OpenProcess.html
Copyright © 2011-2022 走看看