lauer
驱动牛犊
驱动牛犊
  • 注册日期2004-02-04
  • 最后登录2013-01-07
  • 粉丝1
  • 关注1
  • 积分578分
  • 威望127点
  • 贡献值1点
  • 好评度57点
  • 原创分1分
  • 专家分0分
阅读:2472回复:5

Sfilter之Windows2000动态加载经验分享

楼主#
更多 发布于:2007-07-22 16:30
前提
安装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所有功能

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

最新喜欢:

diyfan2000diyfan...
devia
论坛版主
论坛版主
  • 注册日期2005-05-14
  • 最后登录2016-04-05
  • 粉丝3
  • 关注0
  • 积分1029分
  • 威望712点
  • 贡献值1点
  • 好评度555点
  • 原创分8分
  • 专家分4分
沙发#
发布于:2007-07-23 08:53
支持并鼓励!
人总在矛盾中徘徊。。。
fazwh
驱动牛犊
驱动牛犊
  • 注册日期2005-09-11
  • 最后登录2020-11-18
  • 粉丝0
  • 关注0
  • 积分32分
  • 威望303点
  • 贡献值0点
  • 好评度48点
  • 原创分0分
  • 专家分0分
  • 社区居民
板凳#
发布于:2007-07-23 14:26
支持一下。
beiujm
驱动小牛
驱动小牛
  • 注册日期2005-11-03
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分983分
  • 威望129点
  • 贡献值0点
  • 好评度98点
  • 原创分0分
  • 专家分0分
地板#
发布于:2007-12-26 15:30
我的可以动态的卸载
http://beiyu.bokee.com
dreamsity
驱动小牛
驱动小牛
  • 注册日期2006-09-01
  • 最后登录2013-07-04
  • 粉丝0
  • 关注0
  • 积分40分
  • 威望821点
  • 贡献值1点
  • 好评度68点
  • 原创分1分
  • 专家分0分
地下室#
发布于:2007-12-27 11:05
支持!!!
我也在处理这个问题,这样做有两个目的:
可以手动使用服务管理器启动或者停止我们的驱动,这样可以方便用户使用。
可以修改代码后,不重启就调试驱动,这样可以减少对于重启系统的等待时间。(虽然是在虚拟机内调试,但能省略一点等待时间,就省略以一点了。积少成多,这个时间是很恐怖的。)
一切都是时间问题!
download
驱动牛犊
驱动牛犊
  • 注册日期2002-04-06
  • 最后登录2021-06-15
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望115点
  • 贡献值0点
  • 好评度45点
  • 原创分0分
  • 专家分0分
  • 社区居民
5楼#
发布于:2008-01-04 18:24
to beiujm:

請問你說你可以在win2000下動態unload sfilter.....

= =...可是我用WDK w2k build and compile sfilter DriverUnload( ) = =...好像不會過...

所以請問一下 你是用什麼編的......= =還是有別的技巧....謝謝...= =....

另外樓主所分享的方法我試過  結果是OK的  感謝樓主的分享

另外一般來說 動態卸載 驅動   對一般應用程式開發者來說....是一定要做的嗎??

其實我只要startmode 用 demand 那...重開機後也不會自動載入....= =...只是移除時要unregister service from registry.
游客

返回顶部