confused_ddk
驱动牛犊
驱动牛犊
  • 注册日期2009-04-16
  • 最后登录2011-02-16
  • 粉丝0
  • 关注0
  • 积分25分
  • 威望221点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:2023回复:2

USB Mass Storage 只读过滤驱动的两点思考

楼主#
更多 发布于:2009-11-25 22:34
近日因为工作需要开发一个简单的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,可以直接尝试增加即可,这点我没有测试过,妄言而已。

随便写写,聊慰后生。
yelusiku
驱动牛犊
驱动牛犊
  • 注册日期2007-07-18
  • 最后登录2010-12-23
  • 粉丝0
  • 关注0
  • 积分51分
  • 威望87点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2009-11-26 19:53
支持分享经验!
顶楼主。正在开发类似的东西,参考下你的设计思路。
StartType的问题确实是很多人蓝屏的原因。
时常感到精力不够。。。
jpai2289
驱动牛犊
驱动牛犊
  • 注册日期2008-09-02
  • 最后登录2010-04-25
  • 粉丝0
  • 关注0
  • 积分20分
  • 威望201点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2009-12-10 13:01
好的。学习啦。。。
游客

返回顶部