遍历进程的4种方法

来源:互联网 发布:网络环境异常怎么修复 编辑:程序博客网 时间:2024/06/05 13:14

原贴也是转帖,只不过此人没给原链接……

http://pegasus827.bokee.com/6213525.html

 

P.S. 在98系统上,估计只有第一种方法有效。

 

 

方法一

 

第一种方法是大家比较熟悉的通过ToolHelp Service提供的API函数来实现。这里用到了3个关键的函数:CreateToolhelp32Snapshot(),Process32First()和Process32Next()。下面给出了关于这三个函数的原形和参数说明;

 

 

首先使用CreateToolhelp32Snapshot()创建系统快照句柄(hprocess是我们声明用来保存创建的快照句柄),

然后调用Process32First()获得系统快照中的第一个进程信息(Report是BOOL型作为判断系统快照中下一条进程记录):

 

接着用一个循环调用来遍历系统中所有运行的进程:

 

笔者曾通过对Pstools工具包里的Pslist.exe反编译,发现该工具用的就是这种方法。如果你查询MSDN,可以找到一个比这个功能更加完善的源程序。

 


方法二

 

(EnumProcesses、EnumProcessModules、GetModuleBaseName……本人略去……见本人另一贴“遍历进程、杀进程‘)

 

 

方法三


也许你会说前两种方法全世界都知道了,没什么大不了的!呵呵,那么笔者现在介绍的第三种方法,你就未必知道了。本方法利用了Windows NT/2000下终端服务API函数WTSOpenServer()和WTSEnumerateProcess()来实现,这两个函数都定义在Wtsapi32.dll里。具体的关于终端服务方面的知识,大家可以查询MSDN。
首先,我们来显示申明这两个函数原形: 

  

和前面一样,要先装载Wtsapi32.dll模块,获取关键函数地址,通过Argv[1]给终端服务名(这里我们赋本机NetBios名)赋一个值并打开这项服务:

 

通过Argv[1]给终端服务名(这里我们赋本机NetBios名)赋一个值并打开这项服务,然后开始遍历终端服务器上的所有进程,这里我们是指本机的所有进程 

 

怎么样,酷吧,跟前面两种方法效果一样!

 


方法四

 

最后笔者介绍一种最少人用的方法,本方法是从“幻影旅团”论坛上看到的。后面给出的源代码也是从他们那拷贝过来的。呵呵,这种方法也提供给我们一种很好的思路。

这第四种方法利用了Native Api的NtQuerySystemInformation函数来实现。同样没有该函数的导入库,也要自己定义原形。整个实现不难,可是有点烦,因为在该函数参数结构上,笔者通查MSDN查了很久才找到这些相关的结构,下面我们来看看这个方法的实现吧。
先是自定义函数原形:


然后,还是和前面一样,要找到ZwQuerySystemInformation在Ntdll.dll模块里的入口地址,获得指向进程信息数组链的第一条进程信息: 

 

和方法一方法二一样,在获得第一条进程信息后,开始循环遍历,列出其余的进程: 

 

特别注意的是,这里SYSTEM_PROCESS_INFORMATION结构里进程名的类型为UNICODE_STRING, 而UNICODE_STRING里的成员Buffer定义的是Unicode类型。
 

所以,最后我们要调用WideCharToMultiByte()来还原成ANSI字符串以便输出:
 

 

原创粉丝点击