第4章 应用与内核通信

在前面章节的内容中,笔者介绍了一系列使用WDK开发的内核驱动程序。但是内核程序既没有窗口,也没有控制台,所以难以让用户“看到”些什么。前面介绍的唯一使读者能够看到结果的是调试日志。这显然不能提供给最终用户。

除了让使用者能够观察到驱动的行为,很多情况下,内核需要与应用层通信。一方面,一些软件的某些功能必须要通过内核程序才能实现,但是又必须在软件界面上有所展示;另一方面,有些内核程序的功能,需要提供方便用户来操作的手段,这又必须体现在软件界面上。目前据笔者所知,所有的软件用户操作界面都是用用户态应用程序来实现的。为此,内核程序必须要用某种方式和应用软件互通信息。下面是一个很典型的安全软件的界面,如图4-1所示。

图4-1 一个安全软件界面的例子

实现这个界面的显然是一个普通的Windows窗口,而一些功能则很可能是用内核驱动来实现的。这个软件界面不但能获取这些内核驱动的信息(获知某个功能是否已经开启),还能控制这些功能的开启与关闭(将鼠标移动到字体上可以打开或者关闭相应的功能)。可见,这个软件界面可以用某种方式与内核驱动通信。

读者在做自己的软件时很可能也希望提供一个足够酷的界面,而不仅仅是一个无人知道起了什么作用的驱动程序(当然病毒作者除外)。所以相信这一章的内容对于读者来说会很有用。

此外,本章的一些内容也着重介绍了设计安全的通信接口的重要性,防止内核驱动因为来自用户态的通信输入而被感染或者崩溃。

考虑到通用性,从本章开始,所有驱动代码均支持老版本的WDK编译,本章代码实例在/source/coworker目录下。coworker下有两个子目录,其中一个是coworker_sys,里面包括用来通信的内核驱动代码;另一个是coworker_user,里面含有应用程序代码。如果文中提到某个代码文件,请到对应目录下寻找。