`

Windows上消息截取

阅读更多

项目中的需求:windows shutdown之前会关闭我们的程序,我要在关机的时候,赶在windows把那个程序(不是我们写的)关掉之前做一些事情。

 

这篇博客也是对我最近一段工作的一个总结,供日后查看备忘。在这篇blog中,我会提到hook,api拦截,dll注入,还有windows的关机脚本。这篇blog中不会包或具体的实现细节,而且也是想到哪里记录到哪里,可能有些散。恩,准备好了吗?我们开始吧

 

1. 首先谈一下思路

 

我们是要在windows关闭掉我们的程序之前做一些事情,显然关机动作是一个api调用,而又众所周知,windows是消息驱动的。所以要想实现我们的目的,我们就必须对下面这两个地方之一下手:

a. 在系统要调用这个api之前。在这个时间点截获他,做我们的动作。这其实就是api拦截

b. 如果该关机api已被执行,我们就必须赶在他把关机消息发给我们要控制的那个程序之前,做我们的操作,这就是hook。

 

2. hook

我们通常叫他钩子,是的,他又很多种全局钩子,局部钩子,键盘钩子,鼠标钩子等等,当然你也可以钩其他消息,只要你愿意。做钩子其实是做回调函数,可以实现它的语言也很多,我试了C++和C#。当时参考了一本书《Windows程序设计(第2版)》,人邮出的,王艳平著,包括这本书,还有参考到的其他一些书籍后面会有详细的评论。

 

3. API 拦截

顾名思义,他就是api拦截,思路一般是做一个假的,会让应用程序对指定api的调用,变成对我们的那个假api的调用,而在我们的api中会决定在适当的时机去调用哪个真的api,当然你也可以不去调用哪个真的api。怎么样,是不是有点像我们的proxy模式:)。好了,做api拦截的时候参考的书籍是Jeffrey Richter的《Windows核心编程》。这是一本大名鼎鼎的书,应该不用再多介绍了吧,作者在介绍api拦截的时候介绍了n种实现方案,需要的话可以随时查阅,这里就不细细品味。

 

4. dll 注入

在看《Windows程序设计(第2版)》中,将dll注入的时候,更加明白了windows底层的一些原理,明白了hook是怎么实现的,也明白了dll注入是api拦截的一种经典实现方案。

 

5. 关机脚本

这是微软给我们提供的服务,除了关机脚本之外,还有开机脚本,以及登录/注销脚本,98时代没有的东东,感兴趣的朋友可以google一下。他是Windows组策略的一部分。我相信你搜到的文章一定是跟我搜到的文章一样,这些文章中介绍如何编辑组策略的方法多半比较繁琐,其实你直接在运行中输入:gpedit.msc便可以进入编辑关机脚本的界面了。

 

有一个问题值得一提,当我们添加一个关机脚本的时候系统有两处发生了变化:

a. 注册表如下两处发生了变化

 

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Group Policy\State\Machine\Scripts\Shutdown]

[HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\System\Scripts\Shutdown]
 

b. 在[C:\WINDOWS\System32\GroupPolicy\Machine\Scripts]位置下有一个系统隐藏文件:scripts.ini。在这个文件里面微软追加了一项。

 

我最初用程序生成一个关机脚本的时候就是因为忽视了第二项,导致了失败。后来配置上就好了。ps,我们有找到有命令和api可以注册这个关机脚本,如果大家知道麻烦告诉我,我谢:)

 

6. 最后:谈谈那两本书

好吧,写在最后谈谈上面提到的那两本书,这应该是最让我high的一部分,呵呵。

a. 《Windows程序设计(第2版)》 ,人邮出的,王艳平著。

 

    

 

    我读的是他的第一版,借同事的,现在已经有第二版了,我感觉这本书还是十分不错的,难度刚刚好,不很深,又够用。我的观点是读书要读英文经典,但这本书读来感觉不错,第一版chinapub上面还是5星推荐。但是该书的代码示例中确实有导出函数地址的计算不对的错误。遗憾。chinapub的评论中有该书的下载地址,不知道好用否。

 

b. Jeffrey Richter的《Windows核心编程》

 

   

 

   大师的经典著作,我读的是电子版,csdn downlo上有下载,第四版书店里面已经买不到了,第5版马上出来。ps,第五版的中文版是清华出的,同时人邮还出了个影印版。不知道他们在搞什么,还挺同步。我可能是有收藏癖,读过的书都想买,因为我可以在上面做笔记,这样下次再看的时候会方便很多,但是作为java程序员的我,下次需要扣这些的时候会是什么时候,有时间还不如读读,jeffrey richter的CLR via C#。

 

    呵呵,出版社别怕,都买来,我收藏了。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics