CreateToolhelp32Snapshot详解

HANDLE WINAPI CreateToolhelp32Snapshot(
DWORD dwFlags,
DWORD th32ProcessID
);//这个函数的意思是给想看的东西拍个照,然后慢慢的看(系统的进程或者线程的创建非常的迅速,所以只能拍个照片慢慢看,若是拍过照片之后,系统的进程,线程,堆栈等发生了变化,就不在考虑范围之内了,从这点来说,函数的名字还是挺贴合实际的)
dwFlags:
TH32CS_INHERIT :使用这个标志表示,这个快照句柄是可继承的

TH32CS_SNAPALL :表示使用了以下的全部标志,总共四个TH32CS_SNAPHEAPLIST, TH32CS_SNAPMODULE, TH32CS_SNAPPROCESS, and TH32CS_SNAPTHREAD.

TH32CS_SNAPHEAPLIST:表示快照信息包含特定进程的堆栈列表

TH32CS_SNAPMODULE :表示快照信息包含特定进程的使用模块的列表

TH32CS_SNAPPROCESS:表示快照信息包含系统的所有进程的列表

TH32CS_SNAPTHREAD :表示快照信息包含系统所有线程的列表

th32ProcessID:
只有当dwFlags信息中包含TH32CS_SNAPHEAPLIST,TH32CS_SNAPMODULE 时这个值才有效,否则,这个值会被忽略

那么我们举个例子
1.列举堆栈,若要列举堆栈,必须要用的函数是:Heap32ListFirst,Heap32ListNext(实际上我也不知道这么用的实际用途,不知道堆栈ID有什么用)

void CSuspendProcessDlg::EnumHeap(DWORD PID)
{
    if(PID==0)
    {
        MessageBox("进程ID不能为0");
        return;
    }
    CString temp;
    m_threadid.ResetContent();//m_threadid为一个列表框
    HANDLE hShot=CreateToolhelp32Snapshot(TH32CS_SNAPHEAPLIST,PID);//获取进程ID为PID的堆栈列表
    int err=GetLastError();
    if(hShot==INVALID_HANDLE_VALUE)
    {
        MessageBox("创建进程快照失败");
        return;
    }
    HEAPLIST32 te={sizeof(te)};
    BOOL bRet=Heap32ListFirst(hShot,&te);
    while(bRet)
    {
        temp.Format("%d",te.th32HeapID);
        m_threadid.AddString(temp.GetBuffer(0));
        bRet=Heap32ListNext(hShot,&te);
    }
    CloseHandle(hShot);
}

这里写图片描述
2.列举模块信息,若要列举模块信息,必须要用的函数是:Module32First,Module32Next

void CSuspendProcessDlg::EnumModule(DWORD PID)
{
    if(PID==0)
    {
        MessageBox("进程ID不能为0");
        return;
    }
    CString temp;
    m_threadid.ResetContent();
    HANDLE hShot=CreateToolhelp32Snapshot(TH32CS_SNAPMODULE,PID);
    int err=GetLastError();
    if(hShot==INVALID_HANDLE_VALUE)
    {
        MessageBox("创建进程快照失败");
        return;
    }
    MODULEENTRY32 te={sizeof(te)};
    BOOL bRet=Module32First(hShot,&te);
    while(bRet)
    {
        //temp.Format("%d",te.th32HeapID);
        m_threadid.AddString(te.szModule);
        bRet=Module32Next(hShot,&te);
    }
    CloseHandle(hShot);
}

这里写图片描述

3列举系统进程信息,若要列举系统进程信息,必须要用的函数是:Process32First,Process32Next

void CSuspendProcessDlg::EnumProcess()
{
    CString temp;
    m_threadid.ResetContent();
    HANDLE hShot=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
    int err=GetLastError();
    if(hShot==INVALID_HANDLE_VALUE)
    {
        MessageBox("创建进程快照失败");
        return;
    }
    PROCESSENTRY32 te={sizeof(te)};
    BOOL bRet=Process32First(hShot,&te);
    while(bRet)
    {
        m_threadid.AddString(te.szExeFile);
        bRet=Process32Next(hShot,&te);
    }
    CloseHandle(hShot);
}

这里写图片描述

3列举一个进程的线程ID,若要列举线程ID,必须要用的函数是:Thread32First,Thread32Next

void CSuspendProcessDlg::EnumThread(DWORD PID)
{
    if(PID==0)
    {
        MessageBox("进程ID不能为0");
        return;
    }
    CString temp;
    m_threadid.ResetContent();
    HANDLE hShot=CreateToolhelp32Snapshot(TH32CS_SNAPALL,0);
    if(hShot==INVALID_HANDLE_VALUE)
    {
        MessageBox("创建进程快照失败");
        return;
    }
    THREADENTRY32 te={sizeof(te)};
    BOOL bRet=Thread32First(hShot,&te);
    while(bRet)
    {
        if(te.th32OwnerProcessID==PID)
        {
            temp.Format("%d",te.th32ThreadID);
            m_threadid.AddString(temp.GetBuffer(0));
        }
        bRet=Thread32Next(hShot,&te);
    }
    CloseHandle(hShot);
}

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值