学习了几个月的内核编程,现在对Windows驱动开发又了更加深入的认识,特别是对IRP的分层处理逻辑有了深入认识。
总结起来就几句话:
当irp下来的时候,你要根据实际情况,进行处理
1> 无处理,继续往下传
2> 处理之后 ,往下传
3> 处理之后, 往上传
4> 不做处理,直接丢弃
具体怎么理解,通过一个串口驱动过滤就可以深入理解。
一、串口过滤概念
串口过滤:平时我们看到的主机上的USB、网线口等都属于串口,那么设想一个环境,我去网吧上网,正在通过某宝付款,然后主机后面的USB插着一个串口监控器,把我的数据都获取了,然后我的钱就刷刷刷没了...何等悲哀的事情,所以,一个串口过滤,可以在不影响整个串口通信的功能上,拦截住用户层发送出去的信息,这个对于串口数据监控和安全有很大的作用。
二、串口过滤思路
首先是驱动过滤的原理:
“过滤”(filter)是极其重要的一个概念。过滤是在不影响上层和下层接口的情况下,在Windows系统内核中加入新的层,从而不需要修改上层的软件或者下层的真实驱动程序,就加入了新的功能。
也可以说,一个虚拟的设备Attach在一个真实的物理设备上,只要有消息包发送到真实物理设备的方向,则优先进入虚拟设备,而虚拟设备是我们绑定在真实设备上的,因此,优先拿到消息包,并对消息包的内容进行解析,过滤,这里的过滤可以说是对千万的IRP进行if选择,拿到需要的对应设备的IRP,从而,进行分析处理。
为了加深理解,我将逻辑思路做了简要的总结:
1>首先注册IRP的派遣函数(Dispathc Funtion),在这里函数内容做IRP的过滤操作,提取缓冲区,下传IRP等等
2>打开真实的串口设备,以获取到指向串口设备的对象指针,用于下一步的真实虚拟绑定
3>根据真实的串口设备,创建一个虚拟的串口过滤设备(IoCreateDevice)
4>把虚拟串口设备Attach在物理设备上
5>完善派遣函数:对IRP_MJ_WRITE进行过滤,完成过滤操作,将各类IRP做相关的分发处理
总之:OpenCom-----IoCreateFilterDevice-----AttachTo-----IRP_MJ_FUCTION
三、编码测试<