Android RNDIS gadget Windows免驱修改方案
过程简单粗暴,拿到竞品的设备,然后使用UsbTreeView查看设备的相关描述符。
对比发现接口抽象描述符和接口描述符不一致,直接修改Linux RNDIS gadget 驱动,将驱动中有关的两个描述符结构体都改成预想的配置。
diff --git a/kernel-4.19/drivers/usb/gadget/function/f_rndis.c b/kernel-4.19/drivers/usb/gadget/function/f_rndis.c
index 0d8e4a3..a83a591 100644
--- a/kernel-4.19/drivers/usb/gadget/function/f_rndis.c
+++ b/kernel-4.19/drivers/usb/gadget/function/f_rndis.c
@@ -113,9 +113,12 @@ static struct usb_interface_descriptor rndis_control_intf = {
/* .bInterfaceNumber = DYNAMIC */
/* status endpoint is optional; this could be patched later */
.bNumEndpoints = 1,
- .bInterfaceClass = USB_CLASS_COMM,
- .bInterfaceSubClass = USB_CDC_SUBCLASS_ACM,
- .bInterfaceProtocol = USB_CDC_ACM_PROTO_VENDOR,
+ // .bInterfaceClass = USB_CLASS_COMM,
+ // .bInterfaceSubClass = USB_CDC_SUBCLASS_ACM,
+ // .bInterfaceProtocol = USB_CDC_ACM_PROTO_VENDOR,
+ .bInterfaceClass = USB_CLASS_WIRELESS_CONTROLLER,
+ .bInterfaceSubClass = USB_CDC_SUBCLASS_RNDIS,
+ .bInterfaceProtocol = USB_CDC_ACM_PROTO_AT_PCCA101_WAKE,
/* .iInterface = DYNAMIC */
};
@@ -174,9 +177,12 @@ rndis_iad_descriptor = {
.bFirstInterface = 0, /* XXX, hardcoded */
.bInterfaceCount = 2, // control + data
- .bFunctionClass = USB_CLASS_COMM,
- .bFunctionSubClass = USB_CDC_SUBCLASS_ETHERNET,
- .bFunctionProtocol = USB_CDC_PROTO_NONE,
+ // .bFunctionClass = USB_CLASS_COMM, // 0x02
+ // .bFunctionSubClass = USB_CDC_SUBCLASS_ETHERNET, // 0x06
+ // .bFunctionProtocol = USB_CDC_PROTO_NONE, // 0x00
+ .bFunctionClass = USB_CLASS_WIRELESS_CONTROLLER, // 0xe0
+ .bFunctionSubClass = USB_CDC_SUBCLASS_RNDIS, // 0x01
+ .bFunctionProtocol = USB_CDC_ACM_PROTO_AT_PCCA101_WAKE, // 0x03
/* .iFunction = DYNAMIC */
};
修改完成后的情况

其实这个问题难点并不是在修改描述符上,而是找微软RNDIS驱动资料上。Windows上虽然自带rndis驱动,但是找了半天也没找到对应的inf文件,也就无从知道rndis相关的usb描述符配置需求。只能找竞品对比。
Android RNDIS gadget Windows免驱修改方案的更多相关文章
- [Xamarin.Android] 結合Windows Azure與Google cloud message 來實現Push Notification (转帖)
這一篇要討論如何使用Xamarin.Android 整合GCM以及Windows Azure來實作Android手機上的推播通知服務. 這篇文章比較著重概念的部分,在開始讀這篇之前,也可以先參考一下X ...
- linux(以ubuntu为例)下Android利用ant自动编译、修改配置文件、批量多渠道,打包生成apk文件
原创,转载请注明:http://www.cnblogs.com/ycxyyzw/p/4555328.html 之前写过一篇<windows下Android利用ant自动编译.修改配置文件.批量 ...
- Android为TV端助力:(转载)修改TextView字体样式
一.开篇 因为 Android 字体相关的内容还比较多的.有时候其实我们只需要调整一下属性就可以满足设计师的需求,或者是一个退后的方案(毕竟有发版的时间卡住了),有一些效果可以大概满足需求. 那么本文 ...
- Android Studio for windows环境搭建
Android Studio环境搭建 个人博客 欢迎大家多多关注该独立博客: csdn博客 一直想把自己的经验分享出来,记得上次写博客还是ok6410的笔记,感觉时代久远啊.记得那个时候我还一心 ...
- USB免驱RFID读写器编程解析之一:智能卡篇
随着RFID应用的普及,越来越多的软件工程师需要使用RFID读写器编程来实现自己的需求.为了使软件工程师更快的了解RFID读写器的使 用,本文选择一款市面上常用的USB免驱RFID读写器SDT-HA来 ...
- Windows 程序自动更新方案: Squirrel.Windows
Windows 程序自动更新方案: Squirrel.Windows 1. Squirrel Squirrel 是一组工具和适用于.Net的库,用于管理 Desktop Windows 应用程序的安装 ...
- Android 高清加载巨图方案 拒绝压缩图片
Android 高清加载巨图方案 拒绝压缩图片 转载请标明出处: http://blog.csdn.net/lmj623565791/article/details/49300989: 本文出自:[张 ...
- Android之hint提示字体大小修改,显示完全
Android之hint提示字体大小修改,显示完全 1.工作中遇到一个问题,就是自定义EditText的hint提示在超大字体下会显示不全, 2.然后在网上搜索了一下,在这里记录一下,分享给大家,在此 ...
- 关于WIndows内核自映射方案的通俗解释
在一次操作系统课程上听老师说了这么一个有意思的东西,windows的自映射方案居然达到了把4K的页目录的线性地址“藏”在4M页表里的效果,感觉甚是奇特,于是乎就想着说怎么去算.光会算之后仍旧不满足,我 ...
- windows下如何修改远程登录端口
windows下如何修改远程登录端口 windows远程桌面默认端口为3389,修改 方法如下:在"开始>运行"中输入"regedit" 点击“确定”,打 ...
随机推荐
- Octave 安装教程
Octave 用心写著. Octave为GNU项目下的开源软件.同时它也是一种语言,专注于解决线性计算问题.因为对于矩阵计算的优化,使得其速度远高于循环计算.语法兼容Linux shell. Octa ...
- python操作pptx设置title字体大小插入全屏图片A4尺寸实例一枚
pip install python-pptx 安装好pptx,设置标题最大的作用是ppt里面的摘要视图显示摘要文字 参考:https://python-pptx.readthedocs.io/en/ ...
- Jenkins Job触发其他远程Job
https://blog.csdn.net/diaojian66/article/details/117334537 如果不想遇到连接远程Jenkins主机失败后的反复尝试,去掉认证会是一个不错的选择 ...
- Python计算1到100偶数的加和
sum_value = 0 for i in range(1,101): if i % 2 == 1: continue sum_value += i print(sum_value) print(s ...
- 一文彻底弄懂JUC工具包的CountDownLatch的设计理念与底层原理
CountDownLatch 是 Java 并发包(java.util.concurrent)中的一个同步辅助类,它允许一个或多个线程等待一组操作完成. 一.设计理念 CountDownLatch 是 ...
- CubeIDE 主题美化与颜色设置
一.主题美化 搜索引擎里很多,这里不必多说. 二.颜色设置 2.1.关于控制台 菜单栏里:window→preference→输入"console"并回车,然后按照下图指示来: 2 ...
- 15.Kubernetes持久化存储
Kubernetes持久化存储 前言 之前我们有提到数据卷:emptydir ,是本地存储,pod重启,数据就不存在了,需要对数据持久化存储 对于数据持久化存储[pod重启,数据还存在],有两种方式 ...
- Fork/Join框架之Fork、Join操作
Fork Fork就是一个不断分枝的过程,在当前任务的基础上长出n多个子任务. 当一个ForkJoinTask任务调用fork()方法时,当前线程会把这个任务放入到queue数组的queueTop位置 ...
- if else的多种替换方式
1)利用逻辑判断的短路运算来实现 && 和 ||(&& 中第一个表达式为假就不会去处理第二个表达式,|| 则相反) // if为真 if (bool) { value ...
- 开源 - Ideal库 - Excel帮助类,TableHelper实现(三)
书接上回,我们今天继续讲解实现对象集合与DataTable的相互转换. 01.把表格转换为对象集合 该方法是将表格的列名称作为类的属性名,将表格的行数据转为类的对象.从而实现表格转换为对象集合.同时我 ...