xvenw
驱动牛犊
驱动牛犊
  • 注册日期2007-01-06
  • 最后登录2007-02-08
  • 粉丝0
  • 关注0
  • 积分70分
  • 威望8点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
阅读:2488回复:7

wdm驱动的usb只读过滤驱动问题

楼主#
更多 发布于:2007-01-17 00:38
  参考了论坛里以前的帖子,修改了xpddk中wdm/usb/filter程序
增加如下代码:
case IRP_MJ_INTERNAL_DEVICE_CONTROL:
    CurSrb=irpSp->Parameters.Scsi.Srb;//Get Current Scsi SRB, Analysis SCSI Command here!

    cdb=(PCDB)CurSrb->Cdb;
    opCode=cdb->CDB6GENERIC.OperationCode;
    Irp->IoStatus.Status = STATUS_SUCCESS;
    if(CurSrb->CdbLength != 0)
    {
        DBGOUT(("major:%d,minor:%d,len:%d,function:%d,cdblen:%d",majorFunc,minorFunc,CurSrb->Length,CurSrb->Function,CurSrb->CdbLength));
    }
    if(opCode != 0)
    {
        DBGOUT (("myusbfi :Entered the Driver  Dispatch Scsi,opCode:0x%x\n",opCode));
    }
    if((opCode==SCSIOP_MODE_SENSE) && CurSrb->DataBuffer && (CurSrb->DataTransferLength >= sizeof(MODE_PARAMETER_HEADER)))
    {
        DBGOUT(("myusbfi: setting writeprotect!,opCode :%c",opCode));
        modeData = (PMODE_PARAMETER_HEADER)CurSrb->DataBuffer;
        modeData->DeviceSpecificParameter|=MODE_DSP_WRITE_PROTECT;
    }
    CurSrb =CurSrb->NextSrb;
    break;
在注册表中增加usb类的lowerfilter。用dgbviewer观察发现对u盘进行读写的时候根本就不进入任何if语句中,刚刚学习写驱动,请大家指教一下。
rayyang2000
管理员
管理员
  • 注册日期2001-03-23
  • 最后登录2012-09-13
  • 粉丝3
  • 关注0
  • 积分1036分
  • 威望925点
  • 贡献值3点
  • 好评度823点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2007-01-17 08:59
这里都是URB了,和SRB没有关系。
天天coding-debugging中----超稀饭memory dump file ======================================================== [b]Windows Device Driver Development and Consulting Service[/b] [color=blue][url]http://www.ybwork.com[/url][/color] ========================================================
xvenw
驱动牛犊
驱动牛犊
  • 注册日期2007-01-06
  • 最后登录2007-02-08
  • 粉丝0
  • 关注0
  • 积分70分
  • 威望8点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2007-01-17 13:08
使用srb的原因我是看了zhjie374的http://bbs.driverdevelop.com/read.php?tid-90057-fpage-2.html介绍,跟踪发现的确没有经入IRP_MJ_WRITE的irp。在对u盘进行写的时候只有IRP_MJ_INTERNAL_DEVICE_CONTROL,请问如果不用srb我该如何做?我发现对应INTERNAL_DEVICE_CONTROL的PIO_STACK_LOCATION结构只有irpSp->Parameters.Scsi,我用IrpTracker跟踪usbstor.sys驱动,发现在往u盘写入文件是会产生很多irp,但是不知道用什么条件过滤对u盘的写操作。
xvenw
驱动牛犊
驱动牛犊
  • 注册日期2007-01-06
  • 最后登录2007-02-08
  • 粉丝0
  • 关注0
  • 积分70分
  • 威望8点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
地板#
发布于:2007-01-17 23:00
按照rayyang2000大哥的说法,使用urb,在irp中加入如下代码:
case IRP_MJ_INTERNAL_DEVICE_CONTROL:
    PURB            CurUrb;
    PMDL            CurMdl;
    irpSp = IoGetCurrentIrpStackLocation(Irp);
    CurUrb =irpSp->Parameters.Others.Argument1 ;
        
    DBGOUT(("UrbHeader Function:%d,len:%d\n",CurUrb->UrbHeader.Function,CurUrb->UrbHeader.Length));
用dbgviewer看发现CurUrb->UrbHeader.Function的值一直是9,也就是URB_FUNCTION_BULK_OR_INTERRUPT_TRANSFER,于是在上面的基础上增加如下代码:
case IRP_MJ_INTERNAL_DEVICE_CONTROL:
    PURB            CurUrb;
    PMDL            CurMdl;
    irpSp = IoGetCurrentIrpStackLocation(Irp);
    CurUrb =irpSp->Parameters.Others.Argument1 ;
    CurMdl = CurUrb->UrbBulkOrInterruptTransfer.TransferBufferMDL;
    if((CurUrb->UrbHeader.Function == URB_FUNCTION_BULK_OR_INTERRUPT_TRANSFER)
                    && CurUrb->UrbHeader.Length == sizeof(struct _URB_BULK_OR_INTERRUPT_TRANSFER));
    {        
        DBGOUT(("UrbHeader Function:%d,len:%d,TransferFlags:%d,MdlFlags:%d\n",CurUrb->UrbHeader.Function,CurUrb->UrbHeader.Length,CurUrb->UrbBulkOrInterruptTransfer.TransferFlags, CurMdl->MdlFlags));
    }
这时重启机器后出现蓝屏。机器不能启动。哪位大哥能不能告诉我到底如何实现过滤usbstor.sys实现u盘的只读访问?
xvenw
驱动牛犊
驱动牛犊
  • 注册日期2007-01-06
  • 最后登录2007-02-08
  • 粉丝0
  • 关注0
  • 积分70分
  • 威望8点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2007-01-18 18:02
URB_FUNCTION_BULK_OR_INTERRUPT_TRANSFER,于是在上面的基础上增加如下代码:
case IRP_MJ_INTERNAL_DEVICE_CONTROL:
  PURB            CurUrb;
  PMDL            CurMdl;
  irpSp = IoGetCurrentIrpStackLocation(Irp);
   CurUrb =irpSp->Parameters.Others.Argument1 ;
   CurMdl = CurUrb->UrbBulkOrInterruptTransfer.TransferBufferMDL;
   if((CurUrb->UrbHeader.Function == URB_FUNCTION_BULK_OR_INTERRUPT_TRANSFER)
                   && CurUrb->UrbHeader.Length == sizeof(struct _URB_BULK_OR_INTERRUPT_TRANSFER));
   {        
       DBGOUT(("UrbHeader Function:%d,len:%d,TransferFlags:%d,MdlFlags:%d\n",CurUrb->UrbHeader.Function,CurUrb->UrbHeader.Length,CurUrb->UrbBulkOrInterruptTransfer.TransferFlags, CurMdl->MdlFlags));
   }
加入这些语句之后蓝屏是因为CurMdl 可能为空,但是还是不知道哪个操作是写操作,ddk中_URB_BULK_OR_INTERRUPT_TRANSFER 的TransferFlags的含义和MDL中MdlFlags的含义还是没有理解。
rayyang2000
管理员
管理员
  • 注册日期2001-03-23
  • 最后登录2012-09-13
  • 粉丝3
  • 关注0
  • 积分1036分
  • 威望925点
  • 贡献值3点
  • 好评度823点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2007-01-19 06:16
看上去好像正确,用WinDbg分析一下,看看错误原因。

至于写操作,要根据usb mass storage来分析是用的什么协议,然后再解析里面的命令。usb版有大把的讨论
天天coding-debugging中----超稀饭memory dump file ======================================================== [b]Windows Device Driver Development and Consulting Service[/b] [color=blue][url]http://www.ybwork.com[/url][/color] ========================================================
xvenw
驱动牛犊
驱动牛犊
  • 注册日期2007-01-06
  • 最后登录2007-02-08
  • 粉丝0
  • 关注0
  • 积分70分
  • 威望8点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2007-01-29 22:41
谢谢,我到usb论坛去看看
wmsyjr
驱动牛犊
驱动牛犊
  • 注册日期2007-01-13
  • 最后登录2008-01-06
  • 粉丝0
  • 关注0
  • 积分20分
  • 威望3点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2007-03-28 10:33
我也遇到了同样的问题,不知道xvenw找到解决办法没有?希望指点一下我
游客

返回顶部