赞
踩
由于最近在看rndis,因此把协议大概看下,整理如下,仅供参考,有些写的不对的地方希望路过的同学多家指正。
配置描述符:
09 02 4b 00 02 02 00 c0 00 //配置描述符
09 配置描述符固定长度 09
02 描述符类型,配置描述符02
4b 00 配置所返回的数据长度 0x004B
02 接口个数
02 set_configuration所需要的参数值
00 描述配置符的字符串的索引
c0 供电模式
00 最大电流
08 0b 00 02 e0 01 03 06 //接口关联描述符
08 //长度
0b //接口关联描述符类型 0B
00 //第一个接口编号
02 接口总数量
e0 bFunctionClass //通常跟第一个接口class一样
01 bFunctionSubClass //通常跟第一个接口SubClass一样
03 bFunctionProtocol //通常跟第一个接口protocol一样
06 字符串描述符索引
09 04 00 00 01 e0 01 03 04 //接口描述符
09 长度
04 接口描述符类型
00 接口编号
00 备用接口描述符编号
01 端点个数
e0 接口类型 bInterfaceClass
01 接口子类型 bInterfaceSubClass
03 接口协议 bInterfaceProtocol
04 字符串描述符索引接口
05 24 00 10 01
05 24 01 00 01
04 24 02 00
05 24 06 00 01
07 05 82 03 08 00 09 //端点描述符
07 长度
05 类型,端点描述符
82 端点地址和输入输出属性 IN 端点号 2
03 端点传输类型属性 中断
08 00 端点收发最大包大小 0x0008
09 间隔时间
09 04 01 00 02 0a 00 00 05
09 长度
04 接口描述符
01 接口编号
00 备用接口编号
02 端点个数
0a 接口类型
00 接口子类型
00 接口协议
05 字符串描述符索引
07 05 81 02 00 02 00 端点描述符
07 长度
05 端点类型
81 IN 端点号1
02 bluk属性
00 02 最大包长度 0x0200(512)
00 间隔时间
07 05 01 02 00 02 00 端点描述符
07 长度
05 端点类型
01 OUT 端点号1
02 bluk属性
00 02 最大包长度 0x0200(512)
00 间隔时间
REMOTE_XX_MSG和REMOTE_XX_CMPLT这几对控制消息命令都是需要通过ep0发送SEND_ENCAPSULATED_COMMAND ,后发送REMOTE xx MSG(BlukOUT端点) ,收到RESPONSE_AVAILED后之后发送GetEncapsulatedResponse请求收到REMOTE_XX_CMPLY(BlukIN端点)
如图
枚举成功后,HOST 发送REMOTE_NDIS_INITIALIZE_MSG到DEVICE,具体报文如下:
例程:02 00 00 00 18 00 00 00 02 00 00 00 01 00 00 00 00 00 00 00 00 40 00 00
解析如下:
02 00 00 00 MessageType 0x00000002
18 00 00 00 MessageType 0x00000018
02 00 00 00 RequestId 0x00000002
01 00 00 00 MajorVersion
00 00 00 00 MinorVersion
00 40 00 00 MaxTransferSize 0x000004000
DEVICE响应REMOTE_NDIS_INITIALIZE_MSG反馈回REMOTE_NDIS_INITIALIZE_CMPLT ,具体内容如下:
例程:
02 00 00 80 34 00 00 00 02 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 2c 06 00 00 00 00 00 00 00 00 00 00 00 00 00 00
解析如下:
02 00 00 80 MessageType 0x80000002
34 00 00 00 长度
02 00 00 00 RequestId 0x00000002
00 00 00 00 状态
01 00 00 00 Major
00 00 00 00 Minor
01 00 00 00 RNDIS_DF_CONNECTIONLESS 0x00000001
00 00 00 00 Medium
01 00 00 00
2c 06 00 00
00 00 00 00
00 00 00 00
00 00 00 00
HOST 发送REMOTE_NDIS_QUERY_MSG请求具体信息
例程:
04 00 00 00 1c 00 00 00 03 00 00 00 01 01 01 00 00 00 00 00 14 00 00 00 00 00 00 00
解析:
04 00 00 00 //0x00000004
1c 00 00 00
03 00 00 00 //RequestId 0x00000003
01 01 01 00 //Oid 0x00010101
00 00 00 00
14 00 00 00
00 00 00 00
DEVICE响应REMOTE_NDIS_QUERY_MSG反馈回REMOTE_NDIS_QUERY_CMPLT
例程
04 00 00 80 88 00 00 00 03 00 00 00 00 00 00 00 70 00 00 00 10 00 00 00 01 01 01 00 02 01 01 00 03 01 01 00 04 01 01 00 06 01 01 00 07 01 01 00 0a 01 01 00 0b 01 01 00 0c 01 01 00 0d 01 01 00 16 01 01 00 0e 01 01 00 11 01 01 00 14 01 01 00 02 02 01 00 01 01 02 00 02 01 02 00 03 01 02 00 04 01 02 00 05 01 02 00 01 01 01 01 02 01 01 01
03 01 01 01 05 01 01 01 04 01 01 01 01 01 02 01 02 01 02 01 03 01 02 01
解析
04 00 00 80
88 00 00 00
03 00 00 00
00 00 00 00
70 00 00 00 //长度
10 00 00 00 //从RequestId开始的偏移位置 0x00000010
01 01 01 00 02 01 01 00 03 01 01 00 04 01 01 00
06 01 01 00 07 01 01 00 0a 01 01 00 0b 01 01 00
0c 01 01 00 0d 01 01 00 16 01 01 00 0e 01 01 00
11 01 01 00 14 01 01 00 02 02 01 00 01 01 02 00
02 01 02 00 03 01 02 00 04 01 02 00 05 01 02 00
01 01 01 01 02 01 01 01 03 01 01 01 05 01 01 01
04 01 01 01 01 01 02 01 02 01 02 01 03 01 02 01
HOST 发送 REMOTE_NDIS_SET_MSG设置指定OID的参数信息
例程:05 00 00 00 20 00 00 00 0c 00 00 00 0e 01 01 00 04 00 00 00 14 00 00 00 00 00 00 00 0b 00 00 00
解析:
05 00 00 00
20 00 00 00
0c 00 00 00 RequestId
0e 01 01 00 Oid
04 00 00 00 长度
14 00 00 00 偏移
00 00 00 00 DeviceVcHandle
0b 00 00 00 数据
Deivce 响应REMOTE_NDIS_SET_MSG 反馈 REMOTE_NDIS_SET_CMPLT
例程:05 00 00 80 10 00 00 00 0c 00 00 00 00 00 00 00
解析:
05 00 00 80
10 00 00 00
0c 00 00 00 RequestId
00 00 00 00 Status
当没有其他控制或数据流量从设备发送到总线定义的 KeepAliveTimeoutPeriod 主机时,
主机会定期发送此消息。 在没有其他消息流量的情况下,主机至少每
RNDIS_KEEPALIVE_TIMEOUT秒发送一次此消息,以检测远程设备的状态。 远程设备可以
在相反方向使用相同的消息,但这不是必需的。
例程:08 00 00 00 0c 00 00 00 6f 00 00 00
设备将通过发送 REMOTE_NDIS_KEEPALIVE_CMPLT 响应消息来响应来自主机
的REMOTE_NDIS_KEEPALIVE_MSG消息。 如果返回的状态未RNDIS_STATUS_SUCCESS,
主机将发送 REMOTE_NDIS_RESET_MSG 来重置设备。
例程:08 00 00 80 10 00 00 00 6f 00 00 00 00 00 00 00
其他消息可以参考
https://learn.microsoft.com/zh-cn/windows-hardware/drivers/network/remote-ndis-messaging
REMOTE_NDIS_PACKET_MSG封装 NDIS 数据包以形成单个数据消息。
串联多个REMOTE_NDIS_PACKET_MSG元素会形成多包消息。 每个单独的REMOTE_NDIS_PACKET_MSG组件都按如下所述构造。 与单数据包消息的区别在于,每个REMOTE_NDIS_PACKET_MSG标头中的 MessageLength 字段包括一些额外的填充字节。 这些填充字节将追加到除最后一个REMOTE_NDIS_PACKET_MSG,以便后续REMOTE_NDIS_PACKET_MSG从适当的字节边界开始。 对于从设备发送到主机的消息,此填充应导致每个REMOTE_NDIS_PACKET_MSG从多包消息开头开始的字节偏移量为 8 个字节的倍数。 当主机向设备发送多包消息时,它将遵循设备指定的 PacketAlignmentFactor 。
下表中定义了REMOTE_NDIS_PACKET_MSG格式。
下表中指明了单个 OOB 数据记录的格式。
下表定义了每数据包信息数据记录的格式。
01 00 00 00 cb 00 00 00 24 00 00 00 9f 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
33 33 00 01 00 02 目的地址
22 9b f9 76 8b 9f 源地址
86 dd 类型IPV6
60 05 ae 5e 00 69 11 01 fe 80 00 00 00 00 00 00 a9 10 18 cc 9c a7 b1 5c ff 02 00 00 00 00 00 00 00 00 00 00 00 01 00 02 02 22 02 23 00 69 47 37 01 64 82 1d 00 08 00 02 00 00 00 01 00 0e 00 01 00 01 2b 51 18 be 00 e0 70 eb e4 33 00 03 00 0c 28 d6 e1 31 00 00 00 00 00 00 00 00 00 27 00 13 00 11 59 46 5a 58 2d 43 48 45 4e 4c 49 41 4e 44 49 4e 47 00 10 00 0e 00 00 01 37 00 08 4d 53 46 54 20 35 2e 30 00 06 00 08 00 11 00 17 00 18 00 27
报文2:
01 00 00 00 56 00 00 00 24 00 00 00 2a 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
ff ff ff ff ff ff
22 9b f9 76 8b 9f 源地址
08 06 //类型 ARP请求
00 01 08 00 06 04 00 01 22 9b f9 76 8b 9f 00 00 00 00 00 00 00 00 00 00 c0 a8 01 6a
无连接 ((如 802.3) )和面向连接的 ((如 ATM) 设备)使用相同的数据包消息结构来简
化数据包处理的通用代码。 每个 REMOTE_NDIS_PACKET_MSG 消息都包含有关单个网络
数据单元的信息, (以太网 802.3 帧) 。详细报文结构如下:
参考:
远程 NDIS 消息传送 - Windows drivers | Microsoft Learn
STM32驱动开发(二)--USB Device RNDIS虚拟网卡(usb hound抓包完整数据流分析)_stm32 usb rndis驱动-CSDN博客
赞
踩
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。