2024年1月24日发(作者:)
枚举当前系统进程以及进程加载模块
枚举当前系统进程以及进程加载模块
分类: VC/MFC 2011-04-03 21:11 1496人阅读 评论(0) 收藏 举报
vectornullpathtokenquery产品
枚举当前系统进程的方法大致分一下几个步骤:
一、 提升应用程序的进程权限
[cpp] view plaincopy?
1. ///////////////自定义函数实现/////////////////
2.
3. BOOL PromotePrivilege(BOOL bEnable)
4. {
5. // 附给本进程特权,以便访问系统进程
6. HANDLE hToken;
7.
8. // 打开一个进程的访问令牌
9. if(::OpenProcessToken(::GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hToken))
10. {
11. // 取得特权名称为"SetDebugPrivilege"的LUID
12. LUID uID;
13. if (!::LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &uID))
14. {
15. return FALSE;
16. }
17.
18.
19. // 调整特权级别
20. TOKEN_PRIVILEGES tp;
21. egeCount = 1;
22. eges[0].Luid = uID;
23. eges[0].Attributes = bEnable ? SE_PRIVILEGE_ENABLED : 0;
24. if(!::AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(tp), NULL,NULL))
25. {
26. return FALSE;
27. }
28.
29. // 关闭访问令牌句柄
30. ::CloseHandle(hToken);
31. return TRUE;
32. }
33. return FALSE;
34. }
二、枚举系统进程,枚举进程的思路是 先获得进程快照, 然后Process32First, 然后Process32Next
[cpp] view plaincopy?
1. BOOL EnumProcess()
2.
3. {
4.
5. HANDLE hSnapshot = NULL; //快照句柄
6. //注意快照hSnapshot 赋值
7. hSnapshot = CreateToolhelp32Snapshot( TH32CS_SNAPA
LL, 0 );//创建快照
8. if (hSnapshot == INVALID_HANDLE_VALUE)
9. {
10. return FALSE;
11. }
12.
13.
14.
15. //枚举进程
16. PROCESSENTRY32 procEntry32;
17. = sizeof(PROCESSENTRY32);
18.
19. if (!Process32First(hSnapshot, &procEntry32))
20. {
21. CloseHandle(hSnapshot);
22. return FALSE;
23. }
24.
25.
26.
27. do
28.
29. {
30.
31. /*********在这里加入你的操作,比如把进程的名称,PID, ParentID,都能从procEntry32获取******/
32.
33. /******* 进程的路径获取请参照下面的函数
34.
35. ******CString GetProcPath(DWORD dwProcID); //根据
进程ID获取进程的路径
36.
37. ************************************************************************/
38.
39. } while (Process32Next( hSnapshot, &procEntry32));
40.
41. CloseHandle(hSnapshot); //记得关掉handle
42.
43. }
三、获取进程的绝对路径
[cpp] view plaincopy?
1. CString GetProcPath(DWORD dwProcID)
2. {
3. //OpenProcess,根据ID打开进程ID
4.
5. HANDLE hProc = OpenProcess( PROCESS_QUERY_INFORMATION | PROCESS_VM_READ,FALSE,dwProcID );
6.
7. if (hProc == NULL)
8. {
9. return _T("");
10. }
11. HMODULE hMod;
12. DWORD cbNeeded;
13. CString sPath;
14. TCHAR lPath[MAX_PATH] = _T("");
15. // 获取进程模块
16. if( EnumProcessModules(hProc, &hMod, sizeof( hMod ), &cbNeeded ) )
17. {
18. //获得可执行文件路径
19. GetModuleFileNameExW( hProc, hMod, fer( MAX_PATH ), MAX_PATH );
20. eBuffer();
21. int n=(_T("://")); //类似kmp匹配
22. sPath=(n-1); //从比如说C://开始取路径
23. GetLongPathName(sPath,lPath,255); //转换为long的形式
24. }
25. CloseHandle( hProc );
26.
27. return sPath;
28.
29.
30. }
四、枚举进程所有模块, 其实跟上面的获取进程绝对路径一样,用到都是EnumProcessModules,不过上面的hMod 是一个变量,下面的是一个HMODULE hMod[1024];
[cpp] view plaincopy?
1. void CProcDlg::GetDllInfo(DWORD dwProcID)
2. {
3.
4. //OpenProcess,根据ID打开进程ID
5.
6. HANDLE hProc = OpenProcess( PROCESS_QUERY_INFOR
MATION | PROCESS_VM_READ,FALSE,dwProcID );
7.
8. if (hProc == NULL)
9. {
10. return -1;
11. }
12. HMODULE hMod[1024];
13. DWORD cbNeeded;
14. TCHAR szModName[MAX_PATH];
15. TCHAR lPath[MAX_PATH] = _T("");
16. // 获取进程模块
17. if( EnumProcessModules(hProc, hMod, sizeof(hMod ),
&cbNeeded ) )
18. {
19. //获得模块路径
20. for (int i = 0; i <= cbNeeded/sizeof(HMODULE); ++i )
21. {
22.
23. if ( GetModuleFileNameExW( hProc, hMod[i], szModName,sizeof(szModName)))
24. {
25. CString ModName, FTime;
26. CFileStatus status;
27. ModName = szModName;
28. //特殊处理
29. if ((_T("//??//")) != -1)
30. {
31. e(_T("//??//"),_T(""));
32. }
33. if ((_T("//SystemRoot")) != -1)
34.
35.
WS"));
36.
37.
38.
块路径
39.
面提到。40.
41.
42.
述
43.
44.
称
45.
46.
本
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
{
e(_T("//SystemRoot"),_T("C://WINDO}
m_Item(i,ModName); //0.模CFileVersion fileVer; //这个获得模块的相应信息类将在下(ModName);
CString str = eDescription();
m_mText(i, 1, str); //1.文件描str = panyName();
m_mText(i, 2, str); //2. 公司名str = ductVersion();
m_mText(i, 3, str);//3.产品版();
CFile::GetStatus(ModName,status);
FTime = status.m_("%m/%d/%y");
m_mText(i, 4, FTime);
m_mData(i,i); //准备排序
}
}
CloseHandle( hProc );
//更新listCtrl内容
58. m_raw(TRUE);
59. m_date();
60. m_Window();
61. int iCnt = m_mCount();
62. return iCnt - 1;
63.
64. }
65.
66. else
67. {
68. CloseHandle( hProc );
69. return -1;
70. }
71.
72.
73. }
有关模块的信息思路是这样的, 先GetFileVersionSize 在GetFileVersionInfo, 然后调用VerQueryValue
有
下载地址:/source/3156627
有这几个函数写一个进程管理器就差不多了, 例外关于进程的监控,不如进程的开启和关闭,我的思路是这样的:问题已经解决了,谢谢大家,我最后还是用定时器做的,列表中枚举的进程ID先用vector 来保存下来,每次枚举进程的时候先查看进程的ID是否在这个vector 里面,如果不存在的话插入到进程列表里面,这样就能监控进程的开启;枚举完后检查vector 里面的进程的状态是否关闭了,如果关闭的话就从列表控件里面删除相应的Item, vector里面也移除,这关详细的操作请参照这里: /ACE1985/archive/2010/07/14/573202
样的话就能监控进程的关闭了。。


发布评论