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

样的话就能监控进程的关闭了。。