Chinaunix首页 | 论坛 | 博客
  • 博客访问: 579736
  • 博文数量: 190
  • 博客积分: 10937
  • 博客等级: 上将
  • 技术积分: 2205
  • 用 户 组: 普通用户
  • 注册时间: 2009-04-07 11:28
文章分类

全部博文(190)

文章存档

2012年(1)

2011年(27)

2010年(20)

2009年(142)

我的朋友

分类: WINDOWS

2009-04-13 10:50:21

usb禁用驱动:

我完全是用DDK的例子修改的,就是src\general\toaster\filter做的修改,在

IRP_MJ_INTERNAL_DEVICE_CONTROL的分发例程中,比较驱动的名称是否为usbstor,如果是的话即为

存储设备,将IRP返回即可

   if (_wcsnicmp(DeviceObject->AttachedDevice->DriverObject->DriverName.Buffer,L"\Driver\USBSTOR",15)==0)
  ...{
          DbgPrint("Find USB StorIRP_MJ_DEVICE_INTERL_CONTROL::Cmp Result is %d ",
        _wcsnicmp(DeviceObject->AttachedDevice->DriverObject->DriverName.Buffer,L"\Driver\USBSTOR",15));
        Irp->IoStatus.Status = STATUS_ACCESS_DENIED;
        Irp->IoStatus.Information = 0;
        IoCompleteRequest( Irp, IO_NO_INCREMENT );
        return STATUS_ACCESS_DENIED;
    }
     else
      ...{
                 Irp->IoStatus.Status = STATUS_SUCCESS;
           return FilterPass(DeviceObject, Irp); 
      }
 

usb只读过滤驱动也只是简单的在禁用的的代码上做了修改,做的还很幼稚,需要进一步完善,也列出关键的地方

吧:

同样处理还是在IRP_MJ_INTERNAL_DEVICE_CONTROL的分发例程中,不过只读的处理代码我在完成例程中处

理的,处理的关键代码如下:

 

NTSTATUS USBSCSICompletion(IN PDEVICE_OBJECT DeviceObject,
                           IN PIRP Irp,
                           IN PVOID Context)
{
    PDEVICE_EXTENSION  deviceExtension;
 NTSTATUS    status;
 PIO_STACK_LOCATION  irpStack;

 PSCSI_REQUEST_BLOCK  CurSrb;
 PMODE_PARAMETER_HEADER modeData;
 PDEVICE_OBJECT   pDeviceObject;

 PCDB cdb ;
 UCHAR opCode;

    PDEVICE_EXTENSION StorExtension = (PDEVICE_EXTENSION) DeviceObject->DeviceExtension;
 
    irpStack = IoGetCurrentIrpStackLocation(Irp);
   
 if (irpStack->MajorFunction==IRP_MJ_INTERNAL_DEVICE_CONTROL)
 {                                                         
      CurSrb=irpStack->Parameters.Scsi.Srb;
      if(CurSrb == NULL)
                return STATUS_SUCCESS;
      cdb = (PCDB)CurSrb->Cdb;
      if(cdb == NULL)
                return STATUS_SUCCESS;
      opCode=cdb->CDB6GENERIC.OperationCode;
      if (opCode==SCSIOP_WRITE)
      {
       DbgPrint("opCode==SCSIOP_WRITE\n");
      }
         if (opCode==SCSIOP_MODE_SENSE
            && CurSrb->DataBuffer
   && CurSrb->DataTransferLength >= sizeof(MODE_PARAMETER_HEADER)
   )
      {
       modeData = (PMODE_PARAMETER_HEADER)CurSrb->DataBuffer;
                modeData->DeviceSpecificParameter |= MODE_DSP_WRITE_PROTECT;
      }
 }
  if ( Irp->PendingReturned )
  {
    IoMarkIrpPending( Irp );
  }

  return Irp->IoStatus.Status ;
}

这个只读代码缺陷有如下几个:

1:windows2000系统下如果USB格式为NTFS,这样设置之后,NTFS盘符会不可读写,显示盘符正在被写保护

     具体的原因请参阅深入windows系统内幕的第三章关于文件系统的介绍,根本原因是windows2000的NTFS

  版本是3.0还不支持USB只读属性

2:目前还没有找到一个统一的地方挂载过滤驱动,让只读驱动对所有类型的usb设备生效,目前我采用了一个非常

  土的办法,监视系统的usb设备插入情况,如果有usb设备插入,且当前要求只读的话,检查当前的盘是否已经

设置了只读属性,如果没有设置的话,加载只读属性

3:目前看了USSE的usb安全存储方案发现它在2007版里面usb只读过滤驱动的实现里面,只有在class键值下设

设置了过滤驱动,而且只读是立即生效的,目前正在拿着它的驱动进行反汇编以及调试,看看能不能找到更好的办

进行改进

 

过滤驱动的安装:

如果要使用禁用功能的话,过滤驱动很好安装,使用createService创建驱动,然后在注册表的键值

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\{36FC9E60-C465-11CF-8056-444553540000}

下面增加子项:

LowerFilters =  "你的过滤驱动服务名称"

过滤驱动的安装,参考DDK提供的例子:addfilter

关于只读的过滤驱动的安装位置:

只读驱动不能安装在类设备下,需要安装到usbstor的特定的设备下,例如我的电脑我安装如下:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\USBSTOR\Disk&Ven_RockChip&Prod_USB__SD&Rev_1.00

\USBV1.00&1下面,因为没有找到统一的地方可以队所有的设备生效,因此我采用了应用层监控usb设备的动作实

施动态加载。

阅读(4362) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

cuvision2012-10-09 22:26:29

"因此我采用了应用层监控usb设备的动作实施动态加载。" 请问您真的如此做了么,效果怎么样?当应用程序监控到USB设备的时候,WM_DEVICECHANGE?如果这样设备已经可以使用了,分区已经可见了,分区已经打开,文件都能打开,还再来加载驱动么?

通常的方案是在类的下面,驱动起来时候,区分是否是USB硬盘来实现的。
对您的方案很是好奇,没有能够理解,冒昧请教!