如何枚举系统当前进程

首先,调用 CreateToolhelp32Snapshot() 获得当前运行进程的快照,这个函数返回包含正在运行进程的快照句柄。其原形是:

HANDLE WINAPI CreateToolhelp32Snapshot(DWORD dwFlags,DWORD th32ProcessID);

其中:

dwFlags表示要包含在快照的内容为TH32CS_SNAPPROCESS表示在快照中包含进程列表;

th32ProcessID是进程号,为0表示当前进程。

返回值是一个句柄,如果没有进程正在运行,则返回INVALID_HANDLE_VALUE(可用GetLastError()获得),反之可用BOOL WINAPI Process32First(HANDLE hSnapshot, LPPROCESSENTRY32 lppe);获取返回的进程

如果Process32First返回TRUE,则第一个进程的信息已经在LPPROCESSENTRY32结构中,其余进程信息可用BOOL WINAPI Process32Next(HANDLE hSnapshot, LPPROCESSENTRY32 lppe)获得

LPPROCESSENTRY32结构的定义如下:

typedef struct tagPROCESSENTRY32 {
 DWORD dwSize; //此结构的大小
 DWORD cntUsage; //进程的引用数,如果为0,则次进程已停止
 DWORD th32ProcessID; //进程号
 ULONG_PTR th32DefaultHeapID;
 DWORD th32ModuleID; //此进程引用的模块ID
 DWORD cntThreads; //此进程创建的线程数
 DWORD th32ParentProcessID; //父进程的ID
 LONG pcPriClassBase; //这个进程创建的线程的基本优先权
 DWORD dwFlags; //保留
 TCHAR szExeFile[MAX_PATH];
} PROCESSENTRY32;
typedef PROCESSENTRY32 *PPROCESSENTRY32;

最后不要忘了调用:

CloseHandle();

另用函数是:

HANDLE OpenProcess(
 DWORD dwDesiredAccess, // access flag
 BOOL bInheritHandle,  // handle inheritance option
 DWORD dwProcessId    // process identifier
);

用它可打开一个进程,打开进程后,可用:

BOOL TerminateProcess(
 HANDLE hProcess, // handle to the process
 UINT uExitCode  // exit code for the process
);

来关闭进程。

笔者用上述函数做了一个类似任务管理器的进程管理器可以枚举所有进程、关闭进程。细节请参见源代码。

本文配套源码

时间: 2024-11-19 02:30:37

如何枚举系统当前进程的相关文章

Shell脚本实现Linux系统和进程资源监控

 这篇文章主要介绍了Shell脚本实现Linux系统和进程资源监控,本文讲解了检查进程是否存在.检测进程 CPU 利用率.检测进程内存使用量.检测进程句柄使用量.,需要的朋友可以参考下     在服务器运维过程中,经常需要对服务器的各种资源进行监控,例如:CPU的负载监控,磁盘的使用率监控,进程数目监控等等,以在系统出现异常时及时报警,通知系统管理员.本文介绍在Linux系统下几种常见的监控需求及其shell脚本的编写. 文章目录: 1.Linux使用 Shell 检查进程是否存在 2.Linu

内存回收-android内存不足,系统杀死进程,如果在此之前准确知道快被回收?

问题描述 android内存不足,系统杀死进程,如果在此之前准确知道快被回收? 各位大神: 情况是这样的,应用长时间切后台,会被系统杀掉,然而系统会记住被杀死时的那个activity,而因为上下文所有变量已经丢失,如果单纯新建这样一个activity也是没有太大意义的,所以我的思路是:希望在系统杀死当前进程之前可以捕获到消息,然后在当前应用生命周期内,主动将自己杀死,这样就相当于主动退出应用,下次进来就是重新进入了. 查阅相关资料,Android本身提供一些方法,onLowMemory和onTr

使用Python编写Linux系统守护进程实例_python

守护进程(daemon)是指在UNIX或其他多任务操作系统中在后台执行的电脑程序,并不会接受电脑用户的直接操控.此类程序会被以进程的形式初始化.通常,守护进程没有任何存在的父进程(即PPID=1),且在UNIX系统进程层级中直接位于init之下.守护进程程序通常通过如下方法使自己成为守护进程:对一个子进程调用fork,然后使其父进程立即终止,使得这个子进程能在init下运行.–维基百科 守护进程区别于普通用户登陆系统后运行的进程,它是直接由系统初始化,和系统用户没有关系,而用户开启的进程依存与用

linux-Linux系统下进程接收到信号后。。

问题描述 Linux系统下进程接收到信号后.. linux系统下,比如说一个进程给自身发信号,那么当进程接到信号时,是先执行发送语句的下一句,还是先执行信号处理函数? 解决方案 这个问题问的不是很具体. 一个进程给自身发信号(很罕见的情形),那么势必存在一个信号的监听函数listen,也就需要一个信号的处理函数handle. 而一般来说进程发出信号以后很可能有其他的任务要做,不能一直等待接收信号,所以要么采用多线程机制,要么采用异步选择机制. 如果是这样的话,先执行哪个任务就不好说了. 不知道我

jni中获取系统所有进程

问题描述 jni中获取系统所有进程 mActivityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE); List<ActivityManager.RunningAppProcessInfo> appProcessList = mActivityManager .getRunningAppProcesses(); for (ActivityManager.RunningAppProcessInfo ap

使用shell脚本对Linux系统和进程资源进行监控

Shell 语言对于接触 LINUX 的人来说都比较熟悉,它是系统的用户界面,提供了用户与内核进行交互操作的一种接口.它接收http://www.aliyun.com/zixun/aggregation/18678.html">用户输入的命令并把它送入内核去执行.实际上 Shell 是一个命令解释器,它解释由用户输入的命令并且把它们送到内核.它没有一般编程语言的"编译 - 链接 - 运行"过程.不仅如此,Shell 有自己的编程语言用于对命令的编辑,它允许用户编写由 s

请教:在64位操作系统中64位进程如何枚举32位进程中加载的模块?

问题描述 如题:操作系统为Windows7x64,主进程为x64,目标进程为x86:由于Win64系统会模拟x86的环境来运行x86的程序,使用的组件为Wow64xxx.dll等:所以在使用如下代码进行枚举得到的只有Wow64xxx.dll等,得不到真正加载的组件:代码:Processproc=Process.GetProcessById(targetProcessId);for(inti=0;i<proc.Modules.Count;i++){//此处在x64环境中无法获得x86进程中的组件C

Windows系统Svchost进程揭秘

在基于NT内核的Windows操作系统家族中,Svchost.exe是一个非常重要的进程.很多病毒.木马驻留系统与这个进程密切相关,因此深入了解该进程是非常有必要的.本文主要介绍Svchost进程的功能,以及与该进程相关的知识. Svchost进程概述 微软对"Svchost进程"的定义是:Svchost.exe是从动态链接库(DLL)中运行的服务的通用主机进程名称.Svchost.exe文件位于"%SystemRoot%\System32"文件夹中.当系统启动时,

win7系统登陆进程初始化失败怎么办?

  1.如下图中出现的登录进程初始化失败,不知道多少朋友曾经遇到过?其实这个故障产生的原因,是与微软更新补丁中一个叫做KB2839229的有关. win7系统 2.既然无法正常登录系统,咱们也只能从安全模式下进入系统了,重启一下电脑,然后持续按F8,直到进入高级启动选项设置窗口. 3.这个时候鼠标是不管用的,大家需要用键盘上的上下左右箭头进行操作,然后选中安全模式,单击回车. win7系统 4.这样,系统就可以在安全模式下进入系统了,接下来,咱们单击开始-控制面板,然后在控制面板中找到程序下的卸