软件工程师!
分类: C/C++
2010-10-15 17:44:24
赖锋
本文章及源码可随意传播,修改,但不要删除原作者信息!
对于自动化测试来说,我们有时候想知道程序运行的时间,被测试程序运行了多久退出,可以通过记录的运行时间对被测试程序的测试脚本进行优化,进而加快测试速度.又或者只是想对当前测试机运行的程序进行记录.诸如此类的需求,所以可以实现一个记录程序运行时间的程序,方便工作的需要!
对于具有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
小结
对程序感兴趣的朋友可以写邮件给我,提出你的宝贵的意见!
|
这部份为应用层代码!
|
这部分为内核程代码!