原理
Sfilter框架是基于NT驱动框架之上通过设备栈绑定的形式绑定的,驱动自己生成一个设备(过滤设备对象),调用系统提供的绑定API,绑定到目标设备上。并返回一个在未绑定之前目标设备所在设备栈的最顶层设备。这样发往下层的IRP或者发往上层的数据都会被过滤设备截获。
移动设备链接到系统中时系统会为其生成一个文件系统设备,然后系统会向文件系统设备发送mount IRP,文件系统设备接收到IRP后会动态生成卷设备对象【盘符】
如果要监控移动设备卷设备对象,首先要先生成过滤设备对象绑定到移动设备的文件系统设备对象上拦截mount IRP请求,之后在该IRP内生成过滤设备对象绑定到卷设备对象上【两次绑定操作】
IoRegisterFsRegistrationChange函数可注册一个动态监控移动设备对象插入时生成文件系统设备对象的回调函数
关于固定的卷设备对象可直接通过函数一一枚举出来,然后依次生成过滤设备对象绑定上去即可。
实现
函数主流程
首先创建控制设备和符号链接用于与R3客户端通信。然后注册过滤分发函数【内部对客户端IRP和其他进程IRP分开处理】
分配一个Fastio结构体大小的内存,然后对其内部初始化Fastio的操作函数【内部全部返回False,不添加会有问题,只需要简单的禁用处理即可】之后将该结构体注册到DriverObject->FastIoDispatch中。
接下来通过IoRegisterFsRegistrationChange注册监控文件系统设备创建的回调函数。函数内判断设备插入时,生成过滤设备对象绑定到对应的文件系统设备对象上【通过判断系统版本使用绑定函数】用来监控mount IRP【回调函数参1为监控到到文件系统设备对象,参2为bool值表示文件系统是插入还是拔掉。函数内创建的过滤设备对象会和文件