微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

WinUSB、ReadPipe、Android 上的重叠

如何解决WinUSB、ReadPipe、Android 上的重叠

希望经常处理设备驱动程序的人可以帮助我解决这个问题。我的任务是在不使用 Android 调试桥 (ADB) 的情况下与 Android 设备进行通信。因此,我的发现引导我使用 WinUsb 并基本上编写我自己的设备驱动程序。现在跌跌撞撞/拖得太久,我正在寻求帮助。这是我试图在 C# 中而不是在 C++ 中完成的,但到目前为止,通过在语言差异之间进行适当的转换,我已经完成了大部分开发工作。

这是在 C#/WPF 下完成的(而不是使用 .NetCore 或 UWP)

我不提供源代码作为有效、有效的东西,对于那些无效的东西,我尝试了很多没有效果的迭代,我不想添加任何混淆来影响任何答案。那些知道这些冷知识的人可能无论如何都不需要它,因为我已经拥有通信所需的句柄。

当然,使用 ManagementEventWatcher,我能够检测设备何时与我的设备连接/断开连接。由此,我能够获取设备信息并读取最终为我提供 ENUM\USB\VID_????&PID_????_Interface\GUID DeviceInterface 和更多信息的设置。

简单来说,函数调用的实际参数仅显示已知方向/意图的上下文,而不是所有实际参数。

从那以后,我可以通过 CreateFile( deviceSymbolicName,… ) 成功地得到一个很好的处理,并打开带有 OVERLAPPED 标志的文件(设备),因为文档已经指出了我的方向。

接下来,我可以使用从 WinUsb_Initialize() 句柄返回的 IntPtr 调用 CreateFile() 并获得正确的 WinUSB 句柄。顺便说一句,CreateFile() 和 WinUsb_Initialize() 都返回 IntPtr 句柄。

然后我就可以成功调用 WinUsb_QueryDeviceinformation 进行速度设置,而且工作正常。与 WinUsb_QueryInterfaceSettingsWinUsb_QueryPipe 相同。从管道信息中,我找到了两个分别用于入站和出站的散装管道。

现在,我正在尝试实际沟通。我准备了一个来自我研究的其他页面的请求数据包来请求 GetDeviceInfo,它的代码为 0x1001,我获得了成功的 WinUsb_WritePipe( outboundBulk.PipeId ) 并获得了一个 TRUE 返回值。

现在是问题

现在,我遇到了问题。我无法从管道中回读。如果我在没有 Overlapped 标志的情况下打开 CreateFile,WinUsb_ReadPipe( inboundBulk.PipeId ) 调用将无限期挂起。当使用 Overlapped 标志时,WinUsb_ReadPipe() 立即返回 true。

所以现在,获取信息是我被卡住的地方,我所做的所有阅读都让我感到困惑。

一些代码示例显示我需要执行 ControlTransfers,但我不明白需要什么/何时/为什么需要这样做。我只是要求用 WritePipe 做一些事情,期待和回答用 ReadPipe 回来。 Overlapped 和处理手动重置事件的问题(与自动,显然你不能从读取的东西中使用),但无法弄清楚。此外,必须有某种回调方法,但不知道如何。我的意思是,如果我应该处理一个手动重置事件,我必须得到某种方式说......嘿,当你完成向我发送数据后调用这个方法......对吗?

这就是我被困住的地方,真诚地感谢帮助解决和前进。

评论反馈

最终,我想直接向/从 PC 复制文件,但必须在没有 Android 调试桥的情况下进行。我需要在我的应用程序用于存储的公共访问文件夹中获取/发送文件......所以,我试图最终学习基本的文件传输等。我不想使用 3rd 方实用程序,因为我需要有完整的源代码控制,可以针对静态代码分析 (HP Fortify) 运行。我看过的大多数其他东西都是基于 Java 的,我没有这方面的经验,更不用说用它编写和理解设备驱动程序了。

虽然对交流的替代方案有些开放,但不确定我的受限访问要求可能会满足哪些要求。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。