阅读:2488回复:7
wdm驱动的usb只读过滤驱动问题
参考了论坛里以前的帖子,修改了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语句中,刚刚学习写驱动,请大家指教一下。 |
|
沙发#
发布于:2007-01-17 08:59
这里都是URB了,和SRB没有关系。
|
|
|
板凳#
发布于: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盘的写操作。
|
|
地板#
发布于: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盘的只读访问? |
|
地下室#
发布于: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的含义还是没有理解。 |
|
5楼#
发布于:2007-01-19 06:16
看上去好像正确,用WinDbg分析一下,看看错误原因。
至于写操作,要根据usb mass storage来分析是用的什么协议,然后再解析里面的命令。usb版有大把的讨论 |
|
|
6楼#
发布于:2007-01-29 22:41
谢谢,我到usb论坛去看看
|
|
7楼#
发布于:2007-03-28 10:33
我也遇到了同样的问题,不知道xvenw找到解决办法没有?希望指点一下我
|
|