windows下使用writefile写入USB,数据长度只能是512的整数倍

加州西梅 2013-06-08 08:42:59
windows环境下,我要使用writefile和readfile进行USB的BULK-only读写,但是发现无论读写Buffer的长度都必须是512的整数倍,否则失败,getlasterror返回值为87(参数错误)。

因为我要对USB写入BULK传输的CBWCB控制数据,所以要写入字节长度为31的数据(CBWCB长度为31),但是现在一直写入失败,肿么办呀。大侠来指点一下,都愁了好多天了。

我进行抓包,看到系统自动发送的WCB就是正常的,长度为31,为什么我就不能发送啊。

下面图片中高亮的部分是系统发送的31字节的CBW,和U盘回复的13字节的CSW。
...全文
1099 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
hxqianzhihe 2015-12-29
  • 打赏
  • 举报
回复
到底怎么发送,求大神指导!
vc_learner 2014-01-14
  • 打赏
  • 举报
回复
请问LZ ,用 DeviceIoControl 给USB 发送数据后,如果获取返回的 CSW ? 谢谢 ! 我现在用 DeviceIoControl 发送, 在bushound 里是可以看到 发出的命令和返回的 CSW ,但CSW 不知如何才能收下!
引用 3 楼 neu_sk 的回复:
我也是刚刚学习USB,各种不入门,上边代码虽然解决了我的问题,但是可能理解不一定对。大家看了之后给点反馈。我好结贴散分,多谢!
加州西梅 2013-09-29
  • 打赏
  • 举报
回复
我也是刚刚学习USB,各种不入门,上边代码虽然解决了我的问题,但是可能理解不一定对。大家看了之后给点反馈。我好结贴散分,多谢!
加州西梅 2013-09-29
  • 打赏
  • 举报
回复
呀!终于找到我之前发的这个帖子了,现在问题解决了,自己回来顶一下,让刚刚学习USB的小羊羔看下我的错误的教训。。 首先,看这个问题的方向根儿上就不对。USB的BULK-only读写,是USB存储控制的一种方式,而Windows对USB设备进行的writefile和readfile读写,实际上就是使用的BULK-only协议。也就是说,writefile和readfile是运行在BULK-only协议之上的。这个问题我看了好久才反应过来,看来一开始我就没有好好学习这个协议。 那么我们怎么使用BULK-only协议来读写USB设备呢。 一种方法就是自己写驱动,这样我们在上层调用writefile和readfile后,系统就会使用我们自己的驱动来读写USB设备。 还有一种方法就是使用DeviceIoControl这个函数,按照BULK-only协议填写各个字段的值,然后发到总线上,这样USB设备就可以给我们相应了。例如,我们要获取USB设备的名字,就可以使用如下代码: 其中hDev是USB设备的HANDLE,是用函数CreateFile通过USB的GUID打开USB的设备Handle。 int Ret = 0; UCHAR buffer[1024]; UCHAR name[1024]; memset(buffer, 0x0, sizeof(buffer)); SCSI_PASS_THROUGH_DIRECT_WITH_BUFFER * psci = NULL; int length = 0; DWORD returned = 0; DWORD errorCode = 0; PSCSI_ADAPTER_BUS_INFO byBuffer; memset(&byBuffer, 0x0, sizeof(byBuffer)); memset(name, 0x0, sizeof(name)); byBuffer = (PSCSI_ADAPTER_BUS_INFO)&(name[0]); psci = (SCSI_PASS_THROUGH_DIRECT_WITH_BUFFER *)&(buffer[0]); psci->sptd.Length = sizeof(SCSI_PASS_THROUGH_DIRECT); psci->sptd.PathId = 0; psci->sptd.TargetId = 1; psci->sptd.Lun = 0; psci->sptd.CdbLength = 6;//CDB6GENERIC_LENGTH; psci->sptd.SenseInfoLength = SPT_SENSE_LENGTH; psci->sptd.DataIn = SCSI_IOCTL_DATA_IN; psci->sptd.DataTransferLength = SPT_REQ_NAME_LENGTH; psci->sptd.DataBuffer = byBuffer; psci->sptd.TimeOutValue = 2; psci->sptd.SenseInfoOffset = offsetof(SCSI_PASS_THROUGH_DIRECT_WITH_BUFFER, ucSenseBuf); psci->sptd.Cdb[0] = 0x12; psci->sptd.Cdb[4] = SPT_REQ_NAME_LENGTH; length = sizeof(SCSI_PASS_THROUGH_DIRECT_WITH_BUFFER); int status = DeviceIoControl(hDev, IOCTL_SCSI_PASS_THROUGH_DIRECT,//IOCTL_SCSI_PASS_THROUGH,//IOCTL_STORAGE_QUERY_PROPERTY,//IOCTL_STORAGE_QUERY_PROPERTY,//IOCTL_SCSI_GET_INQUIRY_DATA, buffer, length, buffer, length, &returned, NULL);
加州西梅 2013-06-09
  • 打赏
  • 举报
回复
木有人回答啊,顶一次。。。

1,317

社区成员

发帖
与我相关
我的任务
社区描述
主要是开发驱动技术
社区管理员
  • 驱动程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧