阅读:2472回复:5
Sfilter之Windows2000动态加载经验分享
前提
安装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所有功能 至于动态卸载好像还不行,如果那位大虾知道请贡献一下 |
|
最新喜欢:diyfan... |
沙发#
发布于:2007-07-23 08:53
支持并鼓励!
|
|
|
板凳#
发布于:2007-07-23 14:26
支持一下。
|
|
地板#
发布于:2007-12-26 15:30
我的可以动态的卸载
|
|
|
地下室#
发布于:2007-12-27 11:05
支持!!!
我也在处理这个问题,这样做有两个目的: 可以手动使用服务管理器启动或者停止我们的驱动,这样可以方便用户使用。 可以修改代码后,不重启就调试驱动,这样可以减少对于重启系统的等待时间。(虽然是在虚拟机内调试,但能省略一点等待时间,就省略以一点了。积少成多,这个时间是很恐怖的。) |
|
|
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. |
|