sfilter

整理自:http://topic.csdn.net/t/20060629/11/4849948.html

 

好资料如下:  
  书:Windows   NT   File   System   Internals,IFS   DDK文档。  
  零碎资料:驱动开发网,OSR(它的新闻组很赞),sysintels.com,以及DDK的源代码。  
   
  最后简单说一下sfilter吧,我也很久没有写这个东东了。如有疏忽之处请指出,谢谢。

 

sfilter的基本思路其实不复杂,sfilter先创建一个control   device   object,用于接受应用程序的控制,然后创建多个device   object,绑定到文件系统驱动的FDO上(譬如NTFS,FAT,CDFS,等等),这里要注意不要绑到文件系统识别器(file   system   recognizer)上,它是用来加载真正的文件系统驱动程序的。  
  绑定完文件系统驱动的FDO后,sfilter就可以收到发给各个文件系统驱动程序的irp了,这样你可以在windows要求文件系统装配各个卷的时候 获得消息,然后sfilter就可以得到文件系统为各个卷所创建的device   object,然后再创建FiDO,绑定到这些volumn   object上,下面的工作就是用你的FiDO过滤发往各个卷的irp。

 

第一步:创建CDO,这是在DriverEntry里:  
  NTSTATUS   DriverEntry(IN   PDRIVER_OBJECT   pDriverObject,   IN   PUNICODE_STRING   pRegistryPath)  
  {  
   
  ……  
   
  //   Create   the   Control   Device   Object(CDO).   This   object   represents   this  
  //   driver.   Note   that   it   does   not   have   a   device   extension.  
  RtlInitUnicodeString(&wstrName,   L"//FileSystem//Filters//SFilter");  
  ntStatus   =   IoCreateDevice(pDriverObject,  
  0,   //has   no   device   extension  
  &wstrName,  
  FILE_DEVICE_DISK_FILE_SYSTEM,  
  FILE_DEVICE_SECURE_OPEN,  
  FALSE,  
  &gSFilterControlDeviceObject);  
  ……  
  }  
   
  第二步,绑定各个文件系统的DO,这是在SfAttachToFileSystemDevice里完成的:  
  (这里有一个小tips,就是windows提供了一个函数IoRegisterFsRegistrationChange,用来注册文件系统的通知,这 样当新的文件系统驱动程序load进来的时候你可以得到通知,有机会去绑定它,俺们不放过任何一个文件系统哈哈)  
  NTSTATUS   SfAttachToFileSystemDevice(IN   PDEVICE_OBJECT   DeviceObject,   IN   PUNICODE_STRING   DeviceName)  
  {  
  ……  
   
  //   We   want   to   attach   to   this   file   system.   Create   a   new   device   object   we   can   attach   with.  
  ntStatus   =   IoCreateDevice(gSFilterDriverObject,  
  sizeof(SFILTER_DEVICE_EXTENSION),  
  NULL,  
  DeviceObject->DeviceType,  
  0,  
  FALSE,  
  &newDeviceObject);  
  if(!NT_SUCCESS(ntStatus))  
  {  
  return   ntStatus;  
  }  
   
  ……  
   
  //   Do   the   attachment  
  devExt   =   newDeviceObject->DeviceExtension;  
  ntStatus   =   SfAttachDeviceToDeviceStack(newDeviceObject,  
  DeviceObject,  
  &devExt->AttachedToDeviceObject);  
  if(!NT_SUCCESS(ntStatus))  
  {  
  goto   ErrorCleanupDevice;  
  }  
   
  ……  
   
  }  
  第三步:绑定完了文件系统,下面就是坐等irp上门报道了,因为是文件系统,所以我们只对IRP_MJ_FILE_SYSTEM_CONTROL消息感兴趣,对它的处理在SfFsControl里进行:  
  NTSTATUS   SfFsControl(IN   PDEVICE_OBJECT   DeviceObject,   IN   PIRP   Irp)  
  {  
  PIO_STACK_LOCATION   irpSp   =   IoGetCurrentIrpStackLocation(Irp);  
   
  PAGED_CODE();  
   
  //   Sfilter   doesn't   allow   handles   to   its   control   device   object   to   be   created,  
  //   therefore,   no   other   operation   should   be   able   to   come   through.  
  ASSERT(!IS_MY_CONTROL_DEVICE_OBJECT(DeviceObject));  
  ASSERT(IS_MY_DEVICE_OBJECT(DeviceObject));  
   
  //   Process   the   minor   function   code.  
  switch(irpSp->MinorFunction)  
  {  
  case   IRP_MN_MOUNT_VOLUME:  
  return   SfFsControlMountVolume(DeviceObject,   Irp);   //收到装配卷的请求  
   
  case   IRP_MN_LOAD_FILE_SYSTEM:  
  return   SfFsControlLoadFileSystem(DeviceObject,   Irp);  
   
  case   IRP_MN_USER_FS_REQUEST:  
  {  
  switch(irpSp->Parameters.FileSystemControl.FsControlCode)  
  {  
  case   FSCTL_DISMOUNT_VOLUME:  
  {  
  PSFILTER_DEVICE_EXTENSION   devExt   =   DeviceObject->DeviceExtension;  
   
  SF_LOG_PRINT(SFDEBUG_DISPLAY_ATTACHMENT_NAMES,  
  ("SFilter!SfFsControl:   Dismounting   volume   %p   /"%wZ/"/n",  
  devExt->AttachedToDeviceObject,  
  &devExt->DeviceName));  
  break;  
  }  
  }  
  break;  
  }  
  }  
   
  //   Pass   all   other   file   system   control   requests   through.  
  IoSkipCurrentIrpStackLocation(Irp);  
  return   IoCallDriver(((PSFILTER_DEVICE_EXTENSION)DeviceObject->DeviceExtension)->AttachedToDeviceObject,   Irp);  
  }  
   
  最后一步就是挂接文件系统所装配的所有卷了,这里有两种,一是sfilter挂接到文件系统上去的时候,文件系统已经装配好的卷,还有就是之后装配的卷。 后者我们可以在SfFsControlMountVolume里轻松搞定,前者就需要主动去枚举了,这个用   SfEnumerateFileSystemVolumes来完成。就不贴代码了,sfilter里有,可以自己找来看。

 

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值