我是靠谱客的博主 陶醉故事,最近开发中收集的这篇文章主要介绍Windows驱动编程基础(下)之过滤驱动的安装和框架概述第六章 过滤驱动的安装和框架概述,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

Windows驱动编程基础(下)之过滤驱动的安装和框架概述

  • 第六章 过滤驱动的安装和框架概述
    • 过滤驱动的概念和安装
      • 怎么找设备栈中的功能设备对象呢?
      • 如何安装过滤驱动
      • 怎么卸载这个过滤驱动呢?
      • 另一种安装过滤驱动的方法
      • 这两种安装过滤驱动方法的区别:
    • 过滤驱动框架

第六章 过滤驱动的安装和框架概述

过滤驱动的概念和安装

怎么找设备栈中的功能设备对象呢?

这就牵扯到注册表了,我们在第一部分讲过和驱动相关的注册表,

上图所选即为虚拟机中网卡的实例ID,PCI就是BusDevice,PCI下面那一堆VEN_15AD&DEV_0770&SUBXXX或者VEN_8086&DEV_100F&SUBXXX是DeviceId,设备的硬件ID下可能会挂一堆设备实例;

这就是我们网卡的驱动信息,这个就是说在一个类里面建立了跟驱动相关的一些注册表的键值。

然后我们在EnumPCI下该网卡驱动相关的注册表键值里记下Service的值,再到CurrentControlSetServices下面找这个名字所对应的我们的网卡服务:
我们网卡驱动对应的服务就是E1G60,我们看上图这个服务里面有一个ImagePath,就有我们的驱动文件,这个驱动所创建的设备就是功能设备,这个驱动文件就是我们功能驱动所对应的.sys文件。

我们再找一个功能设备看看:

这些信息(区分功能设备、过滤设备和总线驱动)就是从注册表里面找的;

我们给某一个功能驱动写一个过滤驱动的时候怎么写呢?

如何安装过滤驱动

我们要把我们写的过滤驱动,作为我们U盘的过滤驱动装上去。


在[DestinationDirs]节,把我们的驱动文件FilterDriver.sys拷贝到System32drivers这个目录下。


这个就是安装我们服务的节,我们服务的名字是FilterDriver,安装服务的节的节名是FilterService;





怎么卸载这个过滤驱动呢?


另一种安装过滤驱动的方法

鼠标右击inf文件安装之后,刷新注册表可以看到UpperFilters键值了,现在你在U盘里面创建文件夹,DebugView还是不打印东西,过滤驱动还是不起作用,此时你把U盘拔掉,然后你再把U盘插入以后,DebugView就显示IRP都来了,说明过滤驱动又装进去了。

这两种安装过滤驱动方法的区别:

第一种:我们重启计算机,计算机要挨个加载我们系统里面的驱动,在加载我们U盘这个驱动的时候,它就会到注册表中找UpperFilters键值所在的地方看有没有这个键,如果有这个键的话它就会根据该键值找到一个服务,根据这个服务就能找到一个.sys驱动文件,它就知道这是一个上册驱动,它装入这个.sys文件,这个时候我们这个过滤驱动就装入了。

另外一种,我们把U盘拔掉了,当我们设备remove掉了,我们设备所对应的驱动就应该卸载,卸载掉以后这个驱动就没有了,当我们重新插入这个U盘的时候,操作系统根据我们U盘的电子标识来找我们U盘的驱动,它就又找到注册表中UpperFilters键值所在的地方,它就把Service键所对应的值这个驱动先装上,然后它再看UpperFilters,找到UpperFilters键的值所对应的驱动安装上。


那我想让所有的U盘都安装我们这个过滤驱动,那么怎么装呢?

这就是安装过滤驱动的两种方法,一种是装到设备实例上,还有一种是装到安装的设备类上,属于这个类的所有的这种设备都会安装这个过滤驱动的,你就可以监视电脑上哪些U盘插入了,哪些U盘可以读、哪些U盘不能读,可以做很多工作了。

过滤驱动框架

我们通过IoGetAttachedDeviceReference这个函数拿到pdo所在的设备栈最顶上的那个设备,这个函数是通过设备栈里面一个设备对象,拿到设备栈最顶上的设备,最顶上的这个设备有可能是一个FiDO,也有可能是一个FDO,也有可能是一个PDO(整个设备栈中只有一个物理设备对象)。


假如CurrentLocation是location_2,当调用IoCallDriver这个函数之后,CurrentLocation会指向location_3,会往下跳一层;

以前讲过,当我们创建IRP的时候,我们要设置MajorFunction和MinorFunctjon,还要设置我们IO_STACK_LOCATION的内容(我们只设置第一个IO_STACK_LOCATION的内容,即上图所示的location_1),当调用IoCallDriver向下转发IRP的时候,转发前你必须要设置下一层IO_STACK_LOCATION里面的内容(location_2)(因为IRP创建好以后,它只会设置最顶上的IO_STACK_LOCATION的内容,它不会把下面每一个IO_STACK_LOCATION都设置的);

但是当我们要安装完成例程的时候就不能用IoSkipCurrentIrpStackLocation这个函数往上调一层,让底下的设备DO_2来复用上一层的location_1了;


最后

以上就是陶醉故事为你收集整理的Windows驱动编程基础(下)之过滤驱动的安装和框架概述第六章 过滤驱动的安装和框架概述的全部内容,希望文章能够帮你解决Windows驱动编程基础(下)之过滤驱动的安装和框架概述第六章 过滤驱动的安装和框架概述所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(56)

评论列表共有 0 条评论

立即
投稿
返回
顶部