Sfilter之Windows2000动态加载经验分享

来源:互联网 发布:大数据采集 编辑:程序博客网 时间:2024/05/12 08:41
前提
安装Windows 2000 Service Pack 4
安装Update Rollup for Windows 2000 Service Pack 4
即这个补丁Windows2000-KB891861-v2-x86-CHS.EXE
这个前提要求应该不过分
1.将原来只会在XP以上因为动态加载才会使用的gSfDynamicFunctions从条件编译中提取出来
   _SF_DYNAMIC_FUNCTION_POINTERS
   中
    PSF_ENUMERATE_DEVICE_OBJECT_LIST EnumerateDeviceObjectList;
    PSF_GET_LOWER_DEVICE_OBJECT GetLowerDeviceObject;
    PSF_GET_DEVICE_ATTACHMENT_BASE_REF GetDeviceAttachmentBaseRef;
    PSF_GET_DISK_DEVICE_OBJECT GetDiskDeviceObject;
    PSF_GET_ATTACHED_DEVICE_REFERENCE GetAttachedDeviceReference;
  也提取出来,另外还要增加
PSF_REGISTER_FSREGISTRATION_CHANGE_EX    RegisterFsRegistrationChangeEx;
  另外包括SfEnumerateFileSystemVolumes,SfLoadDynamicFunctions等方法
  如果还有哪些地方需要从XP条件编译中提取的而上面遗漏了导致无法编译的,请自行提取


2.在driverentry中原来只为XP编译的SfLoadDynamicFunctions变成全部编译
   同时SfLoadDynamicFunctions方法中有针对的编译合适的加载方法


3.在driverentry中原来IoRegisterFsRegistrationChange的地方是只为XP而编译的,增加
#if WINVER < 0x0501   
  if(gSfDynamicFunctions.RegisterFsRegistrationChangeEx!=NULL)
      {
    status = (gSfDynamicFunctions.RegisterFsRegistrationChangeEx)( DriverObject, SfFsNotification );
  }
#endif
    这是从MSDN中得到的帮助,如果在2000中使用RegisterFsRegistrationChange而不使用RegisterFsRegistrationChangeEx,我测试的结果是不会把已经激活的FileSystem自动枚举一遍


4.在SfAttachToFileSystemDevice中原来只为XP编译并且执行的SfEnumerateFileSystemVolumes
  代码段修改成2000中也可以执行,只要那些判断用的动态方法可以加载成功,即
  if(NULL != gSfDynamicFunctions.EnumerateDeviceObjectList &&
                NULL != gSfDynamicFunctions.GetDiskDeviceObject &&
                NULL != gSfDynamicFunctions.GetDeviceAttachmentBaseRef &&
                NULL != gSfDynamicFunctions.GetLowerDeviceObject)

经过以上修改即可实现在windows2000 sp4+rollup1上实现动态加载,并且动态绑定一定激活的文件系统和卷,从而实现Sfilter所有功能

至于动态卸载好像还不行,如果那位大虾知道请贡献一下
原创粉丝点击