阅读:2925回复:11
开发U盘驱动,2G的正常 4G的不能显示盘符
各位老大,我现在在写个U盘驱动,发现2G的U盘能够正常显示操作,但4G的不能显示盘符,并且bulk urb在频繁的发送4096字节,好像死循环一样,但在资源管理器中,看不到该盘盘符,我计算了一下2G是0x40000000字节,但4G是0x100000000字节,是不是我哪个变量由于是int型,4字节,导致访问4G的地址溢出了。但究竟是哪个变量或为什么有这种不支持4G的情况,还是不清楚,请这方面的高手支持一下,万分感谢!
|
|
沙发#
发布于:2010-01-28 09:39
自己顶一下,我的开发平台是windows xp 使用的ddk是6001.18002, 使用wdm开发。请u盘高手 帮忙看一下,是什么变量溢出了,还是我分析的有问题???
|
|
板凳#
发布于:2010-01-28 10:59
继续顶啊,那位高手给指点一二,我看到驱动中其实没有用几种类型的irp啊,只有UsbBuildGetDescriptorRequest UsbBuildInterruptOrBulkTransferRequest UsbBuildVendorRequest并且只可能和UsbBuildInterruptOrBulkTransferRequest 有关,但从定义上有没有看到哪个变量要设置为64位的,难道是我分析错了?
|
|
地板#
发布于:2010-01-28 14:02
用bus hound抓一下协议包,看看总线上到底在传什么数据。
windows 文件系统一次数据传输大小最大为64k,磁盘容量是以扇区为单位的,不存在访问地址溢出的问题。 你对比一下2G好4G U盘的扇区大小是否一致,一般U盘扇区大小为512,有些设备则是1k/2k/4k。这是设备识别时候最容易出错的地方 可以使用 read capacity命令查询,具体请参考scsi2协议。 |
|
地下室#
发布于:2010-01-29 09:16
那usb驱动应该支持不同扇区大小的U盘啊,这个不同扇区大小的设置在驱动的什么地方呢,还是在微软的disk.SYS中呢,在usb驱动中应该没有和SCSI相关的代码啊 ?
|
|
5楼#
发布于:2010-01-31 23:13
你的驱动是不是Mass Storage标准的驱动吧?
扇区大小的设置应该是在U盘固件里定义的,READ CAPACITY命令可以读出。disk.sys驱动是可以发送这个命令的。 |
|
6楼#
发布于:2010-02-04 09:06
在USB mass storage class驱动里当然有SCSI相关的代码了,建议你先看一下mass storage class协议先,做USB驱动开发,这个是必看的
|
|
7楼#
发布于:2010-02-05 17:00
我写的是usb 驱动,不是class驱动啊,
我这边只能得到一些urb。不会涉及到scsi的解析,这些是在disk.sys上层出来的啊? 求教了,是我理解的不对吗? |
|
8楼#
发布于:2010-02-09 13:32
磁盘的大小等信息是在SRB里的SCSI命令及其返回值中体现的。
而且一般是以512字节大小扇区为一个基础单位,每次读写都是整个扇区地操作,所以磁盘大小就是扇区的个数,2G和4G应该是没有分别的。除非其它地方出现了问题。 |
|
9楼#
发布于:2010-03-04 15:38
这个问题还是过不去啊,查看了一下我U盘的扇区大小4G的扇区是4096 2G的也是,在我的usb驱动中只有urb相关的代码,涉及不到SCSI的协议,我使用irptrace跟踪后发现后面总在几个irp包做死循环,包的大小分别为
in 13字节, out 31字节 in 4096字节,不知道这是在做什么?是在读取u盘的容量,好像总在这做死循环。 之后系统就死掉了。 请问牛人,在usb驱动中会有和容量相关的代码吗?怎么我现在的驱动针对任何小于2G的盘都没有问题,一大于2G就失败呢, 郁闷中,求教了!!!!!!!!!!!希望高手给与帮助 |
|
10楼#
发布于:2010-03-08 10:48
最好是将做死循环的数据包的内容贴上来,这样好分析
13个字节的应该是Mass Storage的CSW包 31个字节的应该是CBW包 它们的内容各是什么,不看它们的内容很难分析问题出在哪里 |
|
11楼#
发布于:2010-05-19 14:53
楼主能不能加我QQ281273905.。 我想向你请教个问题,我也是在开发一个U盘。涉及到驱动问题
|
|