文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>快照方式遍历进程,模块,堆,线程等

快照方式遍历进程,模块,堆,线程等

时间: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

相关阅读 更多 +
排行榜 更多 +
幸存者的命运

幸存者的命运

飞行射击 下载
精英战区3d

精英战区3d

飞行射击 下载
货运猎人

货运猎人

飞行射击 下载