希望经常与设备驱动程序打交道的人可以帮助我。我的任务是在不使用 Android 调试桥 (ADB) 的情况下与 Android 设备进行通信。因此,我的发现使我开始使用WinUsb
并基本上编写自己的设备驱动程序。现在绊倒/拖了太久,我正在寻求帮助。这是我试图在 C# 而不是 C++ 中完成的,但到目前为止,我已经通过在语言差异之间进行适当转换来完成大部分开发工作。
这是在 C#/WPF 下完成的(而不是使用 .NetCore 或 UWP)
我没有提供源代码作为工作,做的事情,对于那些不工作的事情,我已经尝试了很多不做的迭代,我不想增加任何混淆来影响任何答案。那些知道这些东西很冷的人可能无论如何都不需要它,因为我已经有了通信所需的句柄。
作为一个给定的,使用 ManagementEventWatcher,我能够检测到设备何时与我的设备连接/断开。由此,我能够获取设备信息并读取最终为我提供ENUM\USB\VID_????&PID_????_Interface\GUID DeviceInterface
更多信息的设置。
简而言之,函数调用的实际参数仅显示已知方向/意图的上下文,而不是所有实际参数。
从那以后,我可以成功地通过CreateFile( deviceSymbolicName, … )
并打开带有 OVERLAPPED 标志的文件(设备)来获得良好的处理,因为文档一直在向我指出。
接下来,我可以调用WinUsb_Initialize()
从CreateFile()
句柄返回的 IntPtr 并获得正确的 WinUSB 句柄。顺便说一句,CreateFile() 和 WinUsb_Initialize() 都返回 IntPtr 句柄。
然后我就可以成功地调用WinUsb_QueryDeviceInformation
速度设置,并且工作正常。与WinUsb_QueryInterfaceSettings
和相同WinUsb_QueryPipe
。从管道信息中,我发现 2 个散装管道分别用于入站和出站。
现在,我正在尝试实际的交流。我从我的研究的其他页面准备了一个请求数据包,以请求代码 0x1001 的 GetDeviceInfo,我获得了成功WinUsb_WritePipe( outboundBulk.PipeId )
并获得了 TRUE 返回值。
现在,问题
现在,我有问题。我无法从管道中读取。如果我在没有 Overlapped 标志的情况下打开 CreateFile,则WinUsb_ReadPipe( inboundBulk.PipeId )
调用将无限期挂起。当使用 Overlapped 标志时,WinUsb_ReadPipe() 立即返回 true。
所以现在,获取信息是我卡住的地方,我所做的所有阅读都让我扭曲了。
一些代码示例显示我需要执行 ControlTransfers,但我不明白需要什么/何时/为什么。我只是向 WritePipe 索要一些东西,期待并用 ReadPipe 回复。重叠和处理手动重置事件的问题(相对于自动,显然你不能从阅读的东西中使用),但无法弄清楚。此外,必须有某种回调方法,但不知道如何。我的意思是,如果我应该处理手动重置事件,则必须给我某种方式说……嘿,当您完成向我发送数据以使用时调用此方法……对吗?
所以这就是我卡住的地方,并真诚地感谢帮助解决和前进。
评论反馈
最终,我想直接从 PC 复制文件,但必须在没有 Android Debug Bridge 的情况下进行。我需要在我的应用程序用于存储的公共访问文件夹中获取/发送文件......所以,我试图最终学习基本的文件传输等。我不想使用第 3 方实用程序,因为我需要拥有可以针对静态代码分析 (HP Fortify) 运行的完整源代码控制。我看过的大多数其他东西都是基于 java 的,我对此没有经验,更不用说用它编写和理解设备驱动程序了。
虽然对通信的替代方案有点开放,但不确定他们可能会受到我的受限访问要求。