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。

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