-
-
[旧帖]
[原创]windows文件过滤驱动sfilter的一点心得
0.00雪花
-
发表于:
2011-11-16 10:39
4989
-
[旧帖] [原创]windows文件过滤驱动sfilter的一点心得
0.00雪花
今天,再次看了一遍sfilter源码,在此写点心得,希望能帮助到一些朋友。
1. 设备的问题。sfilter一共创建了3类设备:
1)自己的CDO。这个设备是用来与应用层通信的,需要名字:\FileSystem\Filters\XXX。
2)绑定文件系统CDO的设备。这个设备是用来绑定文件系统的CDO,绑定的目的是能截获文件系统的IRP_MJ_FILE_SYSTEM_CONTROL请求,在这里可以得到移动设备卷挂载/卸载请求,从而实现卷的动态挂载。
3)绑定文件系统VDO的设备。这个设备用来绑定文件系统的VDO,绑定的目的是截获文件的操作请求。
由此可以看出,如果不考虑动态挂载,不考虑与应用层通信,文件过滤驱动也可以像其它过滤驱动一样,仅仅绑定一个设备就行。比如想绑定ntfs文件系统,那么通过内核设备枚举例程IoEnumerateDeviceObjectList对驱动设备\FileSystem\Ntfs进行设备枚举,绑定其所有没有名字的设备对象,这样,对本机上ntfs的(不包括后插入的移动设备)文件系统过滤驱动绑定就完成了,直接实现文件操作的分发函数就行。
2. 绑定的问题。在注册的文件系统变动回调函数中绑定文件系统的CDO和VDO。文件系统变动回调函数是在文件系统的激活和注销的时候调用的,但是在Win XP及之后的版本中,加载过滤驱动后,对已经激活的文件系统也会枚举一遍(除了Raw)。
1)CDO的绑定。传给文件系统变动回调函数的设备对象就是文件系统的CDO,绑定的时候需要判断:CDO指向的驱动设备不能是文件对象识别器\FileSystem\Fs_Rec。
2)VDO的绑定。绑定VDO的时候需要判断:不能是被绑定过的;设备类型要正确;设备对象没有设备名;设备对象对应的驱动对象不是卷影\FileSystem\VolSnap。
至此,本机上固定的卷设备都绑定好了,还剩下动态加载的移动设备卷的绑定。在IRP请求的MajorFunction为IRP_MJ_FILE_SYSTEM_CONTROL,MinorFunction为IRP_MN_MOUNT_VOLUME的请求中,进行动态挂载,动态的绑定文件系统的卷设备。移动设备的文件系统卷设备在irpsp->Parameters.MountVolume.Vpb->DeviceObject中,这个卷设备对象是不可用的,需要等到底层请求完成后,才是有效的对象,这时才能对其进行绑定。可是在IRP发送到底层后,其VPB指针可能失效,于是就要在IRP下发前将卷设备对象Vpb->RealDevice保存,在绑定时,可以通过Device->Vpb->DeviceObject得到文件系统的卷设备,从而进行绑定。
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课