Chinaunix首页 | 论坛 | 博客
  • 博客访问: 212030
  • 博文数量: 67
  • 博客积分: 3156
  • 博客等级: 中校
  • 技术积分: 650
  • 用 户 组: 普通用户
  • 注册时间: 2009-05-18 17:41
个人简介

软件工程师!

文章分类

全部博文(67)

文章存档

2015年(1)

2014年(1)

2012年(6)

2011年(16)

2010年(31)

2009年(12)

分类: C/C++

2010-10-15 17:44:24

监视程序的运行时间

赖锋

http://blog.csdn.net/laiboy

http://laiboy.cublog.cn

 

本文章及源码可随意传播,修改,但不要删除原作者信息!

 

对于自动化测试来说,我们有时候想知道程序运行的时间,被测试程序运行了多久退出,可以通过记录的运行时间对被测试程序的测试脚本进行优化,进而加快测试速度.又或者只是想对当前测试机运行的程序进行记录.诸如此类的需求,所以可以实现一个记录程序运行时间的程序,方便工作的需要!

 

实现原理

对于具有GUI的特性的程序,可以使用IShellExecuteHook进行监控(注意,不是监视,是监控),具体原理及实现可以参考我的另一篇文章,"利用IShellExecuteHook接口对程序监控",链接的url为

http://blog.csdn.net/laiboy/archive/2010/07/22/5755324.aspx

http://blog.chinaunix.net/u3/96987/showart_2278704.html

链接的url中已附有实现的源码.

虽然利用这个IShellExecuteHook可以对GUI的程序进行监控,但是这个技术有两个问题,第一,不能实现对CUI的程序进程监控,第二,不能对使用CreateProcess这类API起动的程序进行监控,例如在自动化的测试程序很多都是不具GUI的脚本,如Python,Ruby等,其次程序都是利用CreateProcess进行被测程序的启动和关闭.所以这个

COM接口不能实现我们所需要的效果.对于"冰刃"这个软件,还有360这类的软件,它们都具有进程创建监视的功能,它们都是利用内核模式实现的,同样,我们也可以在用户模式利用API HOOK这种技术进行监视,但是程序员的经验告诉我,"简单的事情要用简单的方法解决",通过查阅资料,MS早已提供了相应的API实现对程序创建的监视.这个API是PsSetCreateProcessNotifyRoutine.在DDK的帮助文档中我们可以找到以下对这个API的描述.

The PsSetCreateProcessNotifyRoutine routine adds a driver-supplied callback routine to, or removes it from, a list of routines to be called whenever a process is created or deleted. 

正是我们需要的功能.

 

程序实现

通过对PsSetCreateProcessNotifyRoutine文档的描述,我们只需要对程序提供一个回调函数.

 

 

当程序在创建和退出的时候,都会自动地调用这个回调函数.如下面的代码所示!

 

 

 

其中参数bCreate的值为TRUE的时候,表示是进程创建,FALSE的时候表示为进程退出.

 

因为PsSetCreateProcessNotifyRoutine这个是内核的函数,应用层的程序是不能直接访问内核函数的数据的,这就涉及了内核R0与R3的通信了,当然不能直接访问,利用事件信号进行数据的通知,在应用层则侦听事件信号,

 

 

 

利用DeviceIoControl获得内核的数据,如下面代码所示:

 

 

 

完整的程序分为两部份.内核层源码及上层应用层代码!编译时需要Windows DDK(可以是Windows sp2或windows 2003 DDK),编译后将程序作为系统服务,再运行应用层程序,即可看到演示程序效果,以下为代码运行截图!

 

 

 

安装监视程序

http://blog.chinaunix.net/u3/96987/showart.php?id=2356217

 

删除监视程序

http://blog.chinaunix.net/u3/96987/showart.php?id=2356274

小结

对程序感兴趣的朋友可以写邮件给我,提出你的宝贵的意见!

 

文件: Demo.rar
大小: 69KB
下载: 下载

这部份为应用层代码!

 

文件: MonitorProcess.rar
大小: 127KB
下载: 下载

这部分为内核程代码!

 
 
阅读(1667) | 评论(2) | 转发(0) |
给主人留下些什么吧!~~

laiboy2011-09-21 10:47:40

newborntju: 你好 很奇怪 你的这个程序在win7系统运行怎么会不行呢 说不是win32有效应用程序.....
用win7的ddk重新编译一下!!!

newborntju2011-09-20 11:09:33

你好 很奇怪 你的这个程序在win7系统运行怎么会不行呢 说不是win32有效应用程序