曲径通幽论坛

 找回密码
 立即注册
搜索
查看: 4977|回复: 0
打印 上一主题 下一主题

[进程,线程,模块] CreateToolhelp32Snapshot() -- 获取进程快照

[复制链接]

4918

主题

5880

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34397
跳转到指定楼层
楼主
发表于 2013-7-14 22:22:22 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
CreateToolhelp32Snapshot() 函数可获取系统中进程的快照,或指定进程的快照,包括堆,线程,模块等,原型如下:
HANDLE WINAPI CreateToolhelp32Snapshot(
  __in  DWORD dwFlags,
  __in  DWORD th32ProcessID
);
dwFlags 是输入参数,表示想要获取的快照信息,有不同的取值:TH32CS_INHERIT,TH32CS_SNAPALL,TH32CS_SNAPHEAPLIST,TH32CS_SNAPMODULE,TH32CS_SNAPMODULE32,TH32CS_SNAPPROCESS 以及 TH32CS_SNAPTHREAD 。提供不同的值,会获得不同的快照。在获取快照后,可以用不同的 API 函数进行枚举。


th32ProcessID 是输入参数,指定一个 PID 号。当其为 0 时表示当前进程,它只对第 1 个参数为 TH32CS_SNAPHEAPLIST, TH32CS_SNAPMODULE, TH32CS_SNAPMODULE32, 或 TH32CS_SNAPALL 时有效。在 dwFlags 为 TH32CS_SNAPPROCESS 时,它若为 0,那么获得系统的所有进程列表。

使用该函数时,要包含 tlhelp32.h 头文件。

测试代码:
[C++] 纯文本查看 复制代码
// Process.cpp : Defines the entry point for the console application.

#include "stdafx.h"
#include <windows.h>
#include <stdio.h>
#include <string.h>
#include <tlhelp32.h>
int KillProcess(DWORD Pid)
{
    //打开进程得到进程句柄
    HANDLE hProcess=OpenProcess(PROCESS_ALL_ACCESS,FALSE,Pid);
    if(hProcess==NULL)
    {         
        printf("OpenProcess error\n");
        return 0;
    }
    //结束进程
    if (TerminateProcess(hProcess,0))
    {
        printf("结束进程成功\n");
        return 0;
    }
    else
    {
        printf("结束进程失败\n");
        return 0;
    }    
}

int GetProcess()
{
    char buff[1024]={0};
    PROCESSENTRY32 pe32;
    pe32.dwSize=sizeof(pe32);

    //获得系统内所有进程快照
    HANDLE hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
    if(hProcessSnap == INVALID_HANDLE_VALUE)
    {
        printf("CreateToolhelp32Snapshot error");
        return 0;
    }
    //枚举列表中的第一个进程
    BOOL bProcess = Process32First(hProcessSnap,&pe32);
    while(bProcess)
    {
        //格式化进程名和进程ID
        wsprintf(buff,"%s---------------%d\r\n",pe32.szExeFile,pe32.th32ProcessID);
        //输出进程名和进程ID
        printf(buff);
        memset(buff,0x00,1024);    
        //继续枚举进程
        bProcess = Process32Next(hProcessSnap,&pe32);
    }
    CloseHandle(hProcessSnap);
    return 0;
}


int main(int argc, char* argv[])
{
    if(argc == 2&&strcmp(argv[1],"list")==0)
    {
        GetProcess();
    }
    if(argc == 3&&strcmp(argv[1],"kill")==0)
    {
        KillProcess(atoi(argv[2]));

    }
    return 0;
}

在以 list 选项来运行该程序时,可以看到输出:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|曲径通幽 ( 琼ICP备11001422号-1|公安备案:46900502000207 )

GMT+8, 2025-6-18 02:54 , Processed in 0.062882 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表