快照方式遍历进程,模块,堆,线程等
时间:2010-08-24 来源:散客游
今天上课时内容为创建进程,打开进程,快照方式遍历进程,模块,堆,线程等
作业已完成.
以下是部分代码,一些备注懒得改了,介绍也不想说了,比较累,以后的文章会对每个知识点做解释,将学到的知识与大家共勉.
如需要完整代码请在文章末尾下载源码
枚举模块对话框代码
.h文件
#if !defined(AFX_PROCESSMODULELISTDLG_H__9F47F3AA_9F5A_4446_8A35_899852BBFFE1__INCLUDED_) #define AFX_PROCESSMODULELISTDLG_H__9F47F3AA_9F5A_4446_8A35_899852BBFFE1__INCLUDED_ #if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000 // ProcessModuleListDlg.h : header file // #include "MyListCtrl.h" ///////////////////////////////////////////////////////////////////////////// // CProcessModuleListDlg dialog class CProcessModuleListDlg : public CDialog { // Construction public: void FillModuleList(CMyListCtrl &lstCtrl); DWORD m_dwProcessID; CProcessModuleListDlg(CWnd* pParent = NULL); // standard constructor // Dialog Data //{{AFX_DATA(CProcessModuleListDlg) enum { IDD = IDD_PROCESS_MODULE_LIST_DIALOG }; CMyListCtrl m_lstModule; //}}AFX_DATA // Overrides // ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(CProcessModuleListDlg) protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support //}}AFX_VIRTUAL // Implementation protected: // Generated message map functions //{{AFX_MSG(CProcessModuleListDlg) virtual BOOL OnInitDialog(); //}}AFX_MSG DECLARE_MESSAGE_MAP() }; //{{AFX_INSERT_LOCATION}} // Microsoft Visual C++ will insert additional declarations immediately before the previous line. #endif // !defined(AFX_PROCESSMODULELISTDLG_H__9F47F3AA_9F5A_4446_8A35_899852BBFFE1__INCLUDED_)
.cpp文件
// ProcessModuleListDlg.cpp : implementation file // #include "stdafx.h" #include "processmanager.h" #include "ProcessModuleListDlg.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CProcessModuleListDlg dialog CProcessModuleListDlg::CProcessModuleListDlg(CWnd* pParent /*=NULL*/) : CDialog(CProcessModuleListDlg::IDD, pParent) { //{{AFX_DATA_INIT(CProcessModuleListDlg) // NOTE: the ClassWizard will add member initialization here //}}AFX_DATA_INIT m_dwProcessID = 0; } void CProcessModuleListDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CProcessModuleListDlg) DDX_Control(pDX, IDC_LST_MODULE, m_lstModule); //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CProcessModuleListDlg, CDialog) //{{AFX_MSG_MAP(CProcessModuleListDlg) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CProcessModuleListDlg message handlers BOOL CProcessModuleListDlg::OnInitDialog() { CDialog::OnInitDialog(); // TODO: Add extra initialization here m_lstModule.InitCtrl(); m_lstModule.InsertColumn(0, "模块名"); m_lstModule.InsertColumn(1, "基地址"); m_lstModule.InsertColumn(2, "模块路径"); m_lstModule.AutoSize(); FillModuleList(m_lstModule); return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE } void CProcessModuleListDlg::FillModuleList(CMyListCtrl &lstCtrl) { if (m_dwProcessID <= 0) { return; } //清空列表 lstCtrl.DeleteAllItems(); //创建进程映像快照 HANDLE hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, m_dwProcessID); if (hSnap == NULL) { AfxMessageBox("创建模块映像快照失败!"); return; } MODULEENTRY32 mt = {0}; mt.dwSize = sizeof(MODULEENTRY32); //检索系统中第一个进程快照信息 if (!Module32First(hSnap, &mt)) { AfxMessageBox("查找进程模块失败!"); } else { CString txt; do { txt.Format("0x%p", mt.modBaseAddr); lstCtrl.AddItem(mt.szModule, txt, mt.szExePath); ZeroMemory(&mt, 0); mt.dwSize = sizeof(MODULEENTRY32); } while (Module32Next(hSnap, &mt));//检索系统中的下一个进程快照信息 lstCtrl.AutoSize(); txt.Format("ProcessModuleManager - [模块数:%d]", lstCtrl.GetItemCount()); SetWindowText(txt); } CloseHandle(hSnap); }
枚举线程代码.
.h文件
#if !defined(AFX_PROCESSTHREADLISTDLG_H__DB0349BE_B59B_4B43_ABAD_2079CE3A102F__INCLUDED_) #define AFX_PROCESSTHREADLISTDLG_H__DB0349BE_B59B_4B43_ABAD_2079CE3A102F__INCLUDED_ #if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000 // ProcessThreadListDlg.h : header file // #include "MyListCtrl.h" ///////////////////////////////////////////////////////////////////////////// // CProcessThreadListDlg dialog class CProcessThreadListDlg : public CDialog { // Construction public: DWORD m_dwProcessID; void FillThreadList(CMyListCtrl &lstCtrl); CProcessThreadListDlg(CWnd* pParent = NULL); // standard constructor // Dialog Data //{{AFX_DATA(CProcessThreadListDlg) enum { IDD = IDD_PROCESS_THREAD_LIST_DIALOG }; CMyListCtrl m_lstThread; //}}AFX_DATA // Overrides // ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(CProcessThreadListDlg) protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support //}}AFX_VIRTUAL // Implementation protected: // Generated message map functions //{{AFX_MSG(CProcessThreadListDlg) virtual BOOL OnInitDialog(); //}}AFX_MSG DECLARE_MESSAGE_MAP() }; //{{AFX_INSERT_LOCATION}} // Microsoft Visual C++ will insert additional declarations immediately before the previous line. #endif // !defined(AFX_PROCESSTHREADLISTDLG_H__DB0349BE_B59B_4B43_ABAD_2079CE3A102F__INCLUDED_)
.cpp
// ProcessThreadListDlg.cpp : implementation file // #include "stdafx.h" #include "processmanager.h" #include "ProcessThreadListDlg.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CProcessThreadListDlg dialog CProcessThreadListDlg::CProcessThreadListDlg(CWnd* pParent /*=NULL*/) : CDialog(CProcessThreadListDlg::IDD, pParent) { //{{AFX_DATA_INIT(CProcessThreadListDlg) //}}AFX_DATA_INIT m_dwProcessID = 0; } void CProcessThreadListDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CProcessThreadListDlg) DDX_Control(pDX, IDC_LST_THREAD, m_lstThread); //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CProcessThreadListDlg, CDialog) //{{AFX_MSG_MAP(CProcessThreadListDlg) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CProcessThreadListDlg message handlers BOOL CProcessThreadListDlg::OnInitDialog() { CDialog::OnInitDialog(); // TODO: Add extra initialization here m_lstThread.InitCtrl(); m_lstThread.InsertColumn(0, "TID(线程标识符)"); m_lstThread.InsertColumn(1, "优先级"); m_lstThread.InsertColumn(2, "引用次数"); m_lstThread.AutoSize(); FillThreadList(m_lstThread); return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE } void CProcessThreadListDlg::FillThreadList(CMyListCtrl &lstCtrl) { /*if (m_dwProcessID <= 0) { return; }*/ //清空列表 lstCtrl.DeleteAllItems(); //创建进程映像快照 HANDLE hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0); if (hSnap == NULL) { AfxMessageBox("创建线程映像快照失败!"); return; } THREADENTRY32 th = {0}; th.dwSize = sizeof(THREADENTRY32); //检索系统中第一个进程快照信息 if (!Thread32First(hSnap, &th)) { AfxMessageBox("查找进程线程失败!"); } else { CString txtBasePri, txtThreadID, txtCntUsage; do { if (th.th32OwnerProcessID == m_dwProcessID) { txtThreadID.Format("%d", th.th32ThreadID); txtBasePri.Format("%d", th.tpBasePri); txtCntUsage.Format("%d", th.cntUsage); lstCtrl.AddItem(txtThreadID, txtBasePri, txtCntUsage); ZeroMemory(&th, 0); th.dwSize = sizeof(THREADENTRY32); } } while (Thread32Next(hSnap, &th));//检索系统中的下一个进程快照信息 lstCtrl.AutoSize(); txtBasePri.Format("ProcessThreadManager - [线程数:%d]", lstCtrl.GetItemCount()); SetWindowText(txtBasePri); } CloseHandle(hSnap); }
还有枚举堆和进程的代码,在压缩包里
http://files.cnblogs.com/sankeyou/ProcessManager.rar
相关阅读 更多 +