首页
社区
课程
招聘
[原创]Sfilter中的那些绑定(学习笔记)
发表于: 2009-6-13 16:46 7033

[原创]Sfilter中的那些绑定(学习笔记)

2009-6-13 16:46
7033
1.首先是挂载Sfilter创建的设备到文件系统上。
(1)在DriverEntry中IoRegisterFsRegistrationChange注册一个回调函数SfFsNotification,当一个文件系统注册或者注销时,从而触发回调函数SfFsNotification。
{
         当文件系统注册的时候会调用IoRegisterFileSystem,
      创建一个文件系统控制设备对象(file system control device object,FSCDO)到文
      件系统对象的队列中。注销时会调用IoUnregisterFileSystem,
      把前面创建的FSCDO从队列中移除
}

(2)在回调函数SfFsNotification中,会判断这是激活还是撤销一个文件系统



(3)首先看文件系统注册的处理, SfAttachToFileSystemDevice
在SfAttachToFileSystemDevice中,我们只绑定
         FILE_DEVICE_DISK_FILE_SYSTEM、
         FILE_DEVICE_CD_ROM_FILE_SYSTE、
         FILE_DEVICE_NETWORK_FILE_SYSTEM,这三种类型的文件系统。

         所以先要用IS_DESIRED_DEVICE_TYPE判断是不是这三种类型的文件系统,然后再把文件系统识别器排除。接着调用SfAttachDeviceToDeviceStack,绑定我们的设备对象 到 文件系统的控制设备对象 的 设备栈上。
        然后调用SfEnumerateFileSystemVolumes枚举当前文件系统下,所有的当前安装的设备,并绑定它们。
{       
         SfEnumerateFileSystemVolumes枚举的过程是这样的:
         调用IoEnumerateDeviceObjectList枚举这个驱动下的device object list。
         IoEnumerateDeviceObjectList在这个函数要调用了两次。
         第一次调用是获取list中device objects的数量,
         然后根据大小开辟存放device objects的空间,第二次调用才得到设备链。
         之后就是遍历已经得到的device objects list,排除CDO、不符合的类型的、已经绑
         过的这三种设备,不绑定。
         绑定时调用SfAttachToMountedDevice,在SfAttachToMountedDevice设置我
         们创建的设备的Flag,然后调用SfAttachDeviceToDeviceStack。
         在SfAttachDeviceToDeviceStack中,终于是最终的绑定了,调用   
         IoAttachDeviceToDeviceStackSafe,到这里就完成了绑定。
}

流程图表示就是:


2.        就像WINDOWS是用消息驱动一样,驱动是用IRP驱动的。
当Sfilter 接收到IRP_MJ_FILE_SYSTEM_CONTROL这个IRP,会调用SfFsControl去处理。
{
        先简单说下IRP_MJ_FILE_SYSTEM_CONTROL:
        一个新的存储媒质被系统发现,并在文件系统中生成一个卷(Volume) 的过程称为
          Mounting , 这时I/O管理器会发送 IRP_MJ_FILE_SYSTEM_CONTROL.

他的副功能号有:
         IRP_MN_KERNEL_CALL
         IRP_MN_MOUNT_VOLUME
         IRP_MN_USER_FS_REQUEST
         IRP_MN_VERIFY_VOLUME
         IRP_MN_LOAD_FILE_SYSTEM

Sfilter中处理了以下三个:
IRP_MN_MOUNT_VOLUME   
         这是一个卷的mount请求

IRP_MN_LOAD_FILE_SYSTEM
        这是文件系统识别器的副功能号,是一个加载文件系统的请求
        当一个文件识别器决定加载真正的文件系统的时候,会产生一个这样的irp
        调用SfFsControlLoadFileSystem处理。

IRP_MN_USER_FS_REQUEST
        这是一个文件系统操作的请求
}
       
当确认了一个卷的mount请求,也就是IRP_MN_MOUNT_VOLUME,
Sfilter调用SfFsControlMountVolume处理。
{
         SfFsControlMountVolume这里面的处理大约就是判断下是不是卷影和调
      用SfAttachToMountedDevice实现对卷的绑定。
}

当确认了一个加载文件系统的请求,也就是IRP_MN_LOAD_FILE_SYSTEM,Sfilter调用SfFsControlLoadFileSystem,在SfFsControlLoadFileSystem的完成函数SfFsControlLoadFileSystemComplete中调用SfAttachDeviceToDeviceStack对文件系统识别器进行绑定。

当确认了一个文件系统操作的请求,也就是IRP_MN_USER_FS_REQUEST
,查看irpSp->Parameters.FileSystemControl.FsControlCode中的值是否为
FSCTL_DISMOUNT_VOLUME。如果是FSCTL_DISMOUNT_VOLUME则标志着这里是要Dismounts a volume。

       
        就先写到这里吧。
        因为学驱动没多久,文中应该有不少错误,希望大家不吝指出。
           脸丢了,东西就学到了   ^_^

[课程]Linux pwn 探索篇!

上传的附件:
  • 1.jpg (26.01kb,286次下载)
  • 2.jpg (33.41kb,284次下载)
收藏
免费 7
支持
分享
最新回复 (3)
雪    币: 308
活跃值: (25)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
2
沙发,支持下!
2009-6-13 17:42
0
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
3
关于文件系统过滤驱动的资料还是不多,支持楼主~
2009-6-13 18:00
0
雪    币: 258
活跃值: (16)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
4
谢谢楼上的两位
希望大家多提文中的不足
2009-6-14 09:02
0
游客
登录 | 注册 方可回帖
返回
//