注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

熊猫正正的博客

熊猫正正的天空

 
 
 

日志

 
 

枚举进程ID和路径  

2011-10-30 22:05:19|  分类: C/C++ |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
#include "stdafx.h"
#include <windows.h>
#include <stdio.h>
#include <tchar.h>
#include <psapi.h>

#pragma comment(lib,"psapi.lib")

void TranslatePath(TCHAR *pPath)
{
TCHAR tcBuffer[MAX_PATH] = {0};
TCHAR *pFind = _tcsstr(pPath,_T("SystemRoot"));
if (pFind != NULL)
{
//处理形如"\SystemRoot\System32\smss.exe"的串
GetSystemDirectory(tcBuffer,MAX_PATH);
TCHAR *pTemp = _tcsstr(pFind,_T("System32"));
pTemp = _tcsstr(pTemp,_T("\\"));
_tcscat(tcBuffer,pTemp);
memset(pPath,0,_tcslen(pPath)); //清空参数指向的内存中的字符
_tcscpy(pPath,tcBuffer);
}
pFind = _tcsstr(pPath,_T("??"));
if (pFind != NULL)
{
//处理形如"\??\C:\WINDOWS\system32\csrss.exe"的串
TCHAR *pTemp = _tcsstr(pFind,_T("\\")); //查找有效路径
_tcscpy(tcBuffer,pTemp+sizeof(TCHAR));
memset(pPath,0,_tcslen(pPath));
_tcscpy(pPath,tcBuffer);
}
}

int main(int argc, char* argv[])
{
DWORD dwNeed; //用于获取真正使用的内存数
PDWORD pMem = new DWORD[4000]; //准备足够大的内存保存进程ID
BOOL bResult = EnumProcesses(pMem,4000,&dwNeed);
if (!bResult)
{
//返回假表示函数执行失败
printf("获取进程信息失败!");
if (pMem != NULL)
{
delete []pMem;
pMem = NULL;
}
return -1;
}

int iProcessCount = dwNeed/4; //计算进程个数
HANDLE hProcess = NULL;
DWORD dwPathLength = 0;
HMODULE hMainModule;
TCHAR tcBuffer[MAX_PATH] = {0};
DWORD dwCopied;
for(int i=0 ; i<iProcessCount ; i++)
{
hMainModule = 0;
//得到具体查询和读取权限的进程句柄
hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ,FALSE,pMem[i]);
if (hProcess == NULL)
{
continue; //打开进程失败,则继续下一个
}

//这里不能判断返回值,因为我们给的内存不足所以返回值总是失败,但实际上也可以得到模块句柄,所以只需要判断是否成功得到模块句柄即可
EnumProcessModules(hProcess,&hMainModule,sizeof(hMainModule),NULL);
if (hMainModule != 0)
{
dwCopied = GetModuleFileNameEx(hProcess,hMainModule,tcBuffer,MAX_PATH); //获取每个模块的进程
if (dwCopied != 0)
{
//有些进程文件路径不正常,需要处理正常路径
TranslatePath(tcBuffer);
//如得获得模块成功,则打印进程ID和进程文件路径
printf("%08d %s\n",pMem[i],tcBuffer);
}
}

CloseHandle(hProcess); //关闭句柄释放资源
}

if (pMem != 0)
{
delete []pMem;
pMem = NULL;
}
return 0;
}

  评论这张
 
阅读(100)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017