欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

CreateToolhelp32Snapshot详解

程序员文章站 2022-07-05 11:46:20
...

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);
}

CreateToolhelp32Snapshot详解
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);
}

CreateToolhelp32Snapshot详解

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);
}

CreateToolhelp32Snapshot详解

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);
}

CreateToolhelp32Snapshot详解