USB存储(U盘)博客
+ -

Windows10 x64基于BOT规范虚拟U盘调试批量端点返回CSW的问题

2022-04-26 283 0

虚拟了这么多的USB设备,突然想着U盘还没有弄,那就搞一个吧。就当是为了自己学习,没准那天突然有这样的需求。所以说干就干。

虚拟U盘

我们知道,虚拟U盘其实是两套规范的,一种是传统的BOT协议,另一种是UASP的。这里为了兼容性,也是为了学习方便,我们使用BOT规范来虚拟一个标准的U盘。

通过UsbTreeViewer或者其它USB抓包工具,可以看到,U盘的配置描述符相对其它设备如MIC,摄像头或者HID设备,不要太简单。在它的配置描述符中只需要一个接口描述符,两个批量传输端点描述符(一个用于输入,一个用于输出)即可。所以说从USB规范上来说,这个简单是小儿科。我们完全可以基于原来的虚拟USB设备来简单即可。

U盘遵循USB存储规范,我们这里选用的是BOT规范。使用的协议命令集是UFI命令集。这里我们一般只需要以下几个命令集就可以了。

#define INQUIRY 0x12
#define READ_FORMAT_CAPACITIES 0x23
#define READ_CAPACITY 0x25
#define READ_DATA 0x28
#define WRITE_DATA 0x2a

本来想着很简单的事情,没想到还是翻车了。

CSW的长度问题

UFI的命令是通过BW结构体下发的,并且使用的是OUT批量端点。我们通过IN输入端点返回相应的信息即可。这里由于是已经长度,所以不需要设置。最后再使用IN输入端点返回CSW返回,不过这里微软给的长度是512字节,自己需要将长度设回13字节。

在Windows驱动中,URB读的实际数据长度是通过Urb->UrbBulkOrInterruptTransfer.TransferBufferLength来设置的。不可能是因为自己编程上的不好的习惯,以前遇到的都是不需要重新设置长度,导致这次因为长度的问题,没想到usbstor长度判断失败。

输入端点的数据方向问题

你竟然相信,一个输入端点在BUSHOUND抓取时显示的是OUT,而不是IN.但这确实是发生了。原因和上面的一样,在返回CSW时,需要手动置USBD_TRANSFER_DIRECTION_IN标志。

 Urb->UrbBulkOrInterruptTransfer.TransferFlags |= USBD_TRANSFER_DIRECTION_IN;

在中间返回厂商信息的时候,这个标识是有的,为什么在CSW时就没有了。微软的双标,让人看不懂。这和长度的问题一样的。

HID人机交互QQ群:564808376    UAC音频QQ群:218581009    UVC相机QQ群:331552032    BOT&UASP大容量存储QQ群:258159197    STC-USB单片机QQ群:315457461    USB技术交流QQ群2:580684376    USB技术交流QQ群:952873936   

0 篇笔记 写笔记

Windows下UVC虚拟摄像头的实现
最近在Windows10 x64环境下,开发了一个虚拟UVC摄像头驱动。确切的来说这不是摄像头驱动,而是一个虚拟USB总线驱动。使用该虚拟总线驱动使用应用软件通过IOCTL控制总线子设备的创建与卸载。驱动安装完成后,是一个单纯的USB虚拟总线。应用软件通过发送自定义IOCTL码IOCTL_BUSEN......
Win10 x64虚拟设备之触摸屏
前一段时间在本人整理了自己编写的USB虚拟驱动框架,在其基础上实现了虚拟键盘,鼠标的功能。本节是继虚拟键盘鼠标的另一个虚拟USB设备-触摸屏触摸屏设备是HID设备的一个小类,但是随着触摸设备使用的越来越广泛,这类设备也变地越来越重要。触摸屏设备的原理和我们手机上的触摸屏原理一样,是在电脑屏幕上有一层......
HID设备虚拟触摸屏上报的多点数据系统不响应
前一般时间在Windows10下使用USB驱动虚拟了一个触摸屏设备,上层软件按照HID报告述符的格式下发触摸屏数据给驱动,再由驱动将数据上交给系统,实现虚拟触摸屏的功能。今天,突发奇想,上次的报告描述符仅支持的是一个点触摸效果,今天保不实现了一下多点触摸效果,所以我通过在一个支持多点触摸屏的设备......
Win10 x64下USB-UAC虚拟声卡扬声器的实现
UsbzhVSpeaker虚拟声卡下载地址: http://www.usbzh.com/article/detail-1076.html去年的时候,使用portclass驱动模型在windows下虚拟了一个虚拟扬声器和虚拟麦克风。扬声器和麦克风在内部通过拓扑结构进行数据关联,即麦克风的数据的来......
BOT 数据传输过程
按照USB规范,Bulk-Only 传输规范是系统也是通过默认管道(地址0 、端点 0 )进行枚举,枚举后重新分配地址,再次枚举。枚举后,实际工作仅仅使用批量( Bulk )端点传送数据 / 命令 / 状态,批量传输方式不受时间限制并能保证数据的完整性。在取得的端点描述符中包含了 Bulk-In 和......
BOT 命令块包CBW
CBW即Command Block Wrapper,命令块包)是从 USB 主机发送到设备的命令包,它由 31 个字节构成,其中包含的命令遵从接口描述表中的 bInterfaceSubClass 域所指定的命令集,一般采用 SCSI 传输命令集。 USB 设备从 CBW 中取出并执行相应命令,......
BOT 命令状态包CSW
CSW 应从包的边界开始,在传输了 13 个字节以后结束, CSW 的说明如下表:struct CSW{ DWORD dCSWSignature; // CSW的标识,固定值:53425355h (小端模式) DWORD dCSWTag; //主机发送的一个命令块标......
BOT CBWCSW数据例解析
读写数据抓包USB传输中:每一个传输包含一笔或多笔事务,每一笔事务又包含一个、两个或三个信息包。事务:Setup(设置)事务、IN(输入)事务、OUT(输出)事务信息包:令牌信息包、数据信息包、联络信息包传输|——>事务——>令牌信息包+数据信息包+联络信息包|——>事务——&......
BOT CBWCSW的校验
Bulk-Only Protocol传输是通过主机向设备发送CBW请求,设备响应CBW返回CSW响应。Bulk-Only Protocol传输开始是从设备复位(MASS_STORAGE_RESET)之后开始的,设备在接收到CBW请求和主机收到CSW回应后,是需要对CBWCSW进行拆包解析。CBW......
Win10 x64下USB-UAC虚拟麦克风的实现
对于虚拟的UAC设备,实现了虚拟的UAC扬声器,总是想着再一个USB虚拟的UAC麦克风。因为这样,才算完美。本着完了完美的结果,自己又忍不住给自己找了一个活-USB虚拟麦克风虚拟麦克风的大体开发和USB虚拟扬声器类似,只是一个是输入设备,另一个是输出设备而已。所以参考UAC规范,基于UAC虚拟扬声......
USB中文网虚拟麦克风驱动程序视频演示
0.整个软件的框架如图1.安装虚拟麦克风由于本人机器处于是禁用驱动签名模式,所以会弹出签名询问对话框2.打开设备管理器可以看到虚拟的麦克风USBZH Microphone3.在音频控制面板打开设备,并使用扬声器监听该设备。这样麦克风如果有声音会通过扬声器播放出来。4.打开测试程序MicApp......
USB虚拟鼠标功能演示
该功能是USB中文网的开发例程,其设计原理见:http://www.usbzh.com/article/detail-476.html使用驱动程序实现的是虚拟USB鼠标功能。鼠标的事件由应用应用层下发:当前完成的功能:鼠标指针的移动鼠标的点击事件动态创建和销毁鼠标设备支持WIN7,WIN10 ......
USB中文网虚拟UVC摄像头DEMO演示
请查看UCAM简介 https://www.usbzh.com/article/detail-1187.html其实最开始搞的就是虚拟的UVC摄像头,没想到今天才开始展示。这次展示的是自己虚拟4个1920X1080x30的NV12数据格式的摄像头,摄像头的编号自己也就随意一些,分别为UsbzhVC......
USB中文网出品-HID虚拟全局坐标鼠标
以往我们的鼠标指针移动都是相对当前的坐标进行移动,如果要移动到指定的位置,需要不停地获取当前应用层的鼠标指针进行逼近,这样实现鼠标的定位移动或者按下等动作。但是在实际的USB鼠标分类中,还存在另一种鼠标类型,叫做全局坐标鼠标类型,即通过在指定相关的XY坐标进行相应的鼠标动作,其实现原理也和触摸屏类似......
USB 虚拟显示器
虚拟显示器需求呃,有一个需求,说要搞一个显示虚拟器,用来干什么了,我也不清楚,反下干就对了。手中无任何资料,不过在网友的建议下买了一个USB转HDMI的设备,这个安装完成后,用它自带的驱动就可以在电脑上有一个显示器。当然,如果接上HDMI的显示器,会真的出现一个显示器的。虚拟显示器实现本人经过认......
关注公众号
取消
感谢您的支持,我会继续努力的!
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

您的支持,是我们前进的动力!