阅读:2023回复:2
USB Mass Storage 只读过滤驱动的两点思考
近日因为工作需要开发一个简单的USB Lower Filter,用来对mass storage class进行只读限制,尝试之后遇到了开机重启的问题,在驱网上search了一下,发现遇到的人很多但无solutions.
开始时刻,我是按照网上淘来的一个.reg文件来进行注册设置service及LowerFilters,文件内容为: ///////////////////////////////////////////////////Quoted Start////////////////////////////////////////////// Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\{4D36E967-E325-11CE-BFC1-08002BE10318}] "LowerFilters"="usbfilter" [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\usbfilter] "Type"=dword:00000001 "Start"=dword:00000003 "ErrorControl"=dword:00000001 "DisplayName"="usbfilter" ////////////////////////////////////////////////Quoted End///////////////////////////////////////////////// 导入registry之后,运行没有问题,但是一旦重启系统,则Blue Screen,错误为inaccess.....,考虑到4D36E967-E325-11CE-BFC1-08002BE10318面向的是所有的storage,所以将AddDevice中直接返回STATUS_SUCCESS,但是错误依旧,几番search后终于意识到Start为3时是start on demand,启动时刻不会被start,后将值改为0,Auto Start,Blue Screen终于解决了,在参考了张帆著名(既然要抄袭,只好吹捧一下,赫赫)书中的inf,这里给出一个简单而标准的filter inf,service可以不用手工增加到registry里了,但是4D36E967-E325-11CE-BFC1-08002BE10318中LowerFilters依旧要手工增加。 ///////////////////////////////////////////////////Quoted Start//////////////////////////////////////////// [Version] Signature=$CHICAGO$ Provider=%UFGNAME% [DestinationDirs] DefaultDestDir=10,system32\drivers FileJectCopyFiles=11 [SourceDisksFiles] USBFilter.sys=1 [SourceDisksNames] 1=%INSTDISK%,,, [DefaultInstall.ntx86] CopyFiles=DriverCopyFiles,FiltJectCopyFiles [DriverCopyFiles] USBFilter.sys,,,0x60 ;replace old, suppress dialog [DefaultInstall.ntx86.services] AddService=USBFilter,,FilterService [FilterService] ServiceType=1 StartType=0 ErrorControl=1 ServiceBinary=%10%\system32\drivers\USBFilter.sys [Strings] UFGNAME="USB Filter Check Software" INSTDISK="USBFilter DISC" DESCRIPTION="USB Filter Driver" ////////////////////////////////Quoted End///////////////////////////////////////////////////////////////////// 然而,此时仅解决了一半问题,当系统启动时,AddDevice未处理的话,依旧会对hard disk进行操作,我们需要在AddDevice时刻判断是否是USBSTOR,是则Add,否则return STATUS_SUCCESS,代码很简单: ///////////////////////////////////Quoted Start/////////////////////////////////////////////////////////////// FilterAddDevice............ ........... ULONG SizeEnumeratorName = 512L; WCHAR *EnumeratorName = NULL; const WCHAR *USBSTORNAME = L"USBSTOR"; const ULONG USBSTORNAME_LEN = 7 * sizeof(WCHAR); PAGED_CODE (); EnumeratorName = (WCHAR *)ExAllocatePool( NonPagedPool, SizeEnumeratorName ); if( NULL == EnumeratorName ) { return STATUS_INSUFFICIENT_RESOURCES; } status = IoGetDeviceProperty(PhysicalDeviceObject, DevicePropertyEnumeratorName, SizeEnumeratorName, EnumeratorName, &SizeEnumeratorName); if (!NT_SUCCESS (status)) { ExFreePool( EnumeratorName ), EnumeratorName = NULL; return status; } if ( RtlCompareMemory(EnumeratorName, USBSTORNAME, USBSTORNAME_LEN) != USBSTORNAME_LEN ) { ExFreePool( EnumeratorName ), EnumeratorName = NULL; return STATUS_SUCCESS; } //otherwise, we catch usbstor, adddevice on it. ///////////////////////Quoted End////////////////////////////////////////////////////////////////////////////// 最后提醒一点的是LowerFilters的键值类型是REG_MULTI_SZ,意味着可以填写多个值,我曾经看到有同学问道如何在已有的LowerFilters的系统上增加自己的filter,可以直接尝试增加即可,这点我没有测试过,妄言而已。 随便写写,聊慰后生。 |
|
沙发#
发布于:2009-11-26 19:53
支持分享经验!
顶楼主。正在开发类似的东西,参考下你的设计思路。 StartType的问题确实是很多人蓝屏的原因。 |
|
|
板凳#
发布于:2009-12-10 13:01
好的。学习啦。。。
|
|