侦探过滤驱动

来源:互联网 发布:游戏帧数优化软件 编辑:程序博客网 时间:2024/04/24 03:55

侦探过滤驱动

本文节选自《Windows 内核情景分析--采用开源代码ReactOS》一书

 

      至于过滤驱动,则依附于类驱动或端口驱动,目的在于拦截类设备驱动与端口设备驱动之间的信息,以实现某些统计、监视、修改乃至重定向的操作。例如,假定要求对存储在磁盘上的信息进行加密,那么由端口驱动写入磁盘以及从磁盘读入的数据就都应该是已加密的,而上面的类驱动却只能按正常的算法进行处理,此时就可以在二者之间插入一个过滤驱动模块,在此模块中实现所有的加密/解密运算。
    最底层的模块往往是比较复杂的,因为这种模块通常需要处理中断,还需要处理DPC函数即“延迟过程请求(Delayed Procedure Call)”。此外,有的底层模块还需要处理DMA操作(特别地,处理DMA操作的模块常又称为“适配器驱动(Adapter Driver)”)。而中间模块,虽然其处理的算法和流程也可能是复杂的,却并没有中断处理、DPC、DMA这些麻烦。
有必要说明,设备驱动的堆叠是可以嵌套的。什么叫嵌套呢?就是一种设备的端口驱动可以堆叠在另一种设备的类驱动上面。以USB鼠标器的驱动为例,自上而下,首先当然是鼠标器的类驱动,然后是USB鼠标器的端口驱动。但是这个端口驱动并不直接与硬件接口打交道,因为这种鼠标器是作为USB设备出现的,于是在这个端口驱动模块的下面就要放上USB设备的类驱动,然后是具体USB接口芯片的端口驱动(或小端口驱动)。这样,就好像是把两个堆叠又堆叠在一起,这就是所谓嵌套。
      读者也许要问,既然是USB鼠标器的端口驱动,为什么就不自己来实现对于USB芯片的驱动呢?那样当然也是可以的,但是这里有两方面的考虑。首先,那样显然不符合软件重用的原则,既然已经有了USB设备的类驱动和端口驱动,为什么还要再来实现一遍?再说,即使真要再来实现一遍,也难以保证其正确性。Windows的设备驱动模块并非开源软件,虽然可以安装、使用这些模块,却不知道里面是如何实现的,所以要自己实现一遍既非易事,更不经济。其次,即使那确是易事,并且不考虑是否经济,也还是不合适。这是因为对一个具体设备或接口的操作不应“政出多门”,而应该出自同一个模块的控制,否则就得考虑如何互斥、如何串行化、如何协调的问题。在新开发的模块中或许可以把这些因素和措施考虑进去,可是对于已经存在的模块却无法再加改变。这样,势必就造成要把原来已经存在的模块也丢弃不用,而全都换成自行开发的模块,这当然是不现实的。

原创粉丝点击