问题标签 [winusb]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
4247 浏览

android - Windows 上基于软件的 Android 配件

我想用我的应用程序把我的电脑变成一个安卓配件。因此,这将不是专门的硬件,而是将手机切换到附件模式的 PC,从而在手机上启动与主机硬件相关联的一些 Java 应用程序并创建通信通道。

我找到了使用 libusb 在 Linux 上执行此操作的示例代码(以及一些 Java Android 应用程序)。它通过使用标准 VID 和 PID “打开”手机来工作。然后它发送一个打开附件模式的命令,以及模型、版本等元数据。

如果手机支持附件模式,它将断开连接并使用不同的 PID 重新枚举。示例代码然后检查它是否这样做并打开新设备。

但是,我试图让它在 Windows 上运行。我找到了一些 USB 库,例如LibUsbDotNet,但它们似乎都需要使用 WinUSB/libusb 驱动程序的设备。我使用 LibUsbDotNet 中的工具为我的手机生成 libusb 驱动程序,将其安装在旧的通用可移动驱动器上。但这意味着我现在无法将手机作为可移动驱动器访问,因此这不是解决方案。

有没有一种方法(最好是库)可以根据 VID 和 PID 打开任何连接的 USB 设备,然后向它发送一些原始命令?

之后,设备将使用不同的 PID 重新枚举,我可以使用它来创建自己的 WinUSB 驱动程序,所以这不是问题。我只需要通过/围绕默认驱动程序注入一些命令来打开附件模式。

(我更喜欢 .NET 解决方案,但任何 Windows 都可以,我可以编写自己的互操作包装器)

0 投票
1 回答
6328 浏览

windows - 用自定义驱动程序替换 Windows USB 类驱动程序?

我想知道是否有人可以提供帮助,这有点专业问题。

我有一个应用程序需要读取和分析多个 USB 设备(不是同时,它们都在单独的测试中运行,理论上可以在不同的机器上运行)。

每个 USB 设备都基于 USB HID 类,由不同的公司制造,这些 USB 设备都不是为在 PC 上运行而设计的,而是用于不同的平台,但是为了测试设备的目的客户端已请求从 PC 运行测试应用程序。

一些设备将启动,被 windows 识别,windows 将使用内置在 windows 中的通用 HID 类驱动程序初始化并正确启动它们,然后设备将开始发送要测试的数据的正确数据包。

一些设备将启动,被窗口识别,窗口将尝试启动它们但未能完全初始化它们,使它们处于半初始化状态。这很好,因为我可以使用我的 beagle 协议分析器从正版平台捕获初始化数据包,然后使用 LibUSBDotNet 库复制初始化序列中的剩余数据包,并让它们开始正确发送数据包。

我遇到的问题是一个特定的设备(虽然还有一些我还没有测试过,所以很可能其中一个也可能出现同样的问题)。问题是 Windows HID 类驱动程序识别设备并尝试初始化和启动它,这在一段时间后工作并且设备开始发送数据。

问题是发送的数据与发送到真正平台的数据不同(仅包含完整数据的一个子集)。就好像 Windows 已将设备初始化为不同的模式。

当我使用我的 USB 协议分析器从 PC 和正版平台捕获初始化数据包时,我看到 Windows 正在发送一些略有不同的初始化数据包。一旦 Windows 已经启动设备,使用 LibUSBDotNet 重新发送正确的数据包似乎没有效果。

我的问题是我需要阻止 Windows 尝试使用标准 HID 类驱动程序初始化设备,我尝试在设备管理器中删除驱动程序,但它仍然初始化它(并且驱动程序在设备管理器中神奇地重新分配)。我已经进行了一些调查,并且有可能的替代方案:

  1. 创建一个特定的驱动程序,windows 将分配给设备的特定 VID/PID 但什么都不做,然后我可以使用 LibUSBDotNet 从我自己的代码中将正确的初始化序列发送到设备。

  2. 使用 WinUSB 之类的东西为设备创建一个合适的驱动程序(或者可能创建一个像 1.x 一样的“死”驱动程序)。

Windows 是否会优先使用定义了特定 VID/PID 的驱动程序而不是其内置的 USB HID 类驱动程序?如果没有,那么我会浪费我的时间走这条路吗?

请注意,我的 mac 正确初始化了问题设备,并且我已经询问了客户端是否可以为 Mac 开发应用程序的问题,他们的回答只是让 Windows 感到沮丧。

我没有编写适当的 Windows 驱动程序的经验,尽管我有在相对较低的水平上与 USB 通信的经验(所以这部分不用太担心)。任何人都可以提出一个好的行动方案(在我可能会浪费数周时间研究如何为 PC 编写驱动程序只是发现我选择的行动方案无法满足我的要求之前)。

任何帮助或建议都非常感谢。

谢谢,丰富


尝试以下建议后添加:

我尝试使用 LibUsbDotNet inf 向导来创建必要的文件并安装它们,这似乎可以工作 - 当然该设备现在作为 libusb-win32 设备出现在设备管理器中 - 而不是 HID 设备,相关的驱动程序是 libusb 驱动程序。即使在这样做之后,设备似乎仍然被初始化并开始发送错误类型的数据包,尽管现在这些数据包不再由类驱动程序处理并且只是丢失了。

我还遇到了 Zadig,它有一个类似的用于 WinUSB 的 inf 创建向导,结果完全相同。

一位同事建议,将设备切换到此模式的可能不是 windows 本身,而是设备识别它已连接到 windows 机器并将自己切换到此模式。我怀疑是这种情况,在这种情况下我被困住了——是时候与客户进行另一次对话了。

非常感谢您的帮助。

0 投票
1 回答
2499 浏览

.net - WinUSB驱动安装,错误0x00000003

以下 .inf 文件改编自Microsoft WinUSB 安装指南

硬件密钥USBPRINT\DatamaxM4308-MarkII013B,Vendor和PID应该是正确的(从官方驱动.inf文件复制)

尝试在 Vista 32 位上安装驱动程序时,我得到“操作无法完成(错误 0x00000003)” Windows eventviewer 没有记录我安装驱动程序的任何尝试。

C:\Windows\inf\setupapi.dev.log 记录以下内容:

我究竟做错了什么?我需要将 winusb.sys 复制到驱动程序文件夹结构吗?我认为这是通过使用 CoInstaller 自动完成的?

文件夹结构如下:

数据最大值.Inf:

0 投票
2 回答
4778 浏览

.net - 如何在没有窗口句柄的情况下使用 RegisterDeviceNotification?

我正在编写一个 DLL 库,它在 VB.NET 中使用 winusb 连接到 USB 设备。

因为它是一个 DLL,所以我没有窗口,而且我的库的用户也可能没有窗口(例如命令行应用程序)。

我见过的示例检测设备附加和分离所有使用RegisterDeviceNotification,这需要一个窗口句柄来接收附加/分离消息。

如何在没有窗口的情况下将这些消息直接接收到函数中以获取句柄?

0 投票
1 回答
1331 浏览

multithreading - 是否调用方法和函数

我有一个关于从不同线程调用方法的问题。好吧,我正在使用 WinUSB 驱动程序与 USB 设备进行通信。我有单独的线程从设备读取数据。设备命令在主线程中设置。实际上我正在使用 WinUSB_WritePipe 和 WinUSB_ReadPipe 方法来执行此类操作。在读取数据的线程中,我使用具有重叠结构和 WaitForMultipleObject 的异步读取方法。我的设备有一些我需要设置的功能,这是通过主线程中的 GUI 完成的。

我正在观察一些奇怪的行为。我的问题是我是否需要锁定对这些方法的调用(例如,使用互斥锁),所以每次只有一个线程正在访问或调用方法。

旧方式:

新方法:

这是非常简化的代码,其意图仅用于描述我的问题,并不反映我的编程技能。:) 当然,我使用相同的互斥锁,然后在主线程中调用相同的方法。

我希望我尽可能简单地描述我的问题......再说一遍:我需要在不同的线程中锁定对这些方法的调用吗?

感谢您的时间和提前回答。我真的很感激!

兄弟,尼克斯

0 投票
1 回答
790 浏览

windows - libUSB / WinUSB 转 WinDDK 驱动程序端口

我想使用 WDK(在内核模式下)将 libUSB 驱动程序移植到 Windows 驱动程序。我发现 libUSB 在内部使用了 winUSB(来自 libUSB Sources)。

这就是我在 libusb 中所做的,

  1. 我使用 libusb_open_device_with_vid_pid 获取句柄

    或 libusb 内部使用 pSetupDiGetClassDevsA 和其他 pSetupDi*** 函数

  2. 我使用 libusb_control_transfer 或内部 WinUSB 的 WinUsb_WritePipe 发送数据

在内核模式下,WDK 中 this 的等效功能是什么?有没有我可以使用的样本?

注意: 我要求内核模式的原因是,我需要获取这些数据并将其重新路由为 HID 迷你驱动程序。

0 投票
1 回答
953 浏览

kernel - 从内核模式访问 WinUSB 设备

我确实有一个使用 WinUSB 驱动程序 (winusb.sys) 作为其功能驱动程序的 USB 设备。现在我需要编写一个访问该设备的视频捕获驱动程序(必须是内核模式驱动程序)。

我的问题是:我可以从内核模式访问和使用 WinUSB 设备吗?如果是这样,是否有任何文件可以这样做?

我发现的所有文档都在谈论使用 WinUSB.dll 从用户模式访问 WinUSB 但这不是我的选择。我已经尝试使用 IoGetDeviceObjectPointer() 来获取我在 USB 设备上与之通信的 USB 管道所需的文件句柄,但调用总是以 STATUS_ACCESS_DENIED 失败。我知道我可以为 USB 设备编写自己的 KMDF 驱动程序,但使用已经到位的 WinUSB 驱动程序会容易得多。

任何帮助将不胜感激。

0 投票
1 回答
6260 浏览

windows - WinUSB 安装

我想尝试一下 WinUSB。我已经安装了 WinDDK,并且即将为我的驱动程序创建我的第一个 INF 文件。我正在按照MSDN 指南执行此操作。该指南包含一个示例 INF 文件和“将部分名称中的 USB_Install 更改为适当的 DDInstall 值”的说明。

很公平,唯一的问题是我不知道“适当的 DDInstall 值”是什么。

我并不是真正的 INF 文件专家,我只能猜测指南可能希望我更改示例文件中的部分名称

与节标题中的内容不同[USB_Install]。我发现的关于 DDInstall 的唯一解释只是关于如何处理本节的一般解释(也在 MSDN 上)。

我的问题是,我应该将什么放入 INF 文件而不是[USB_Install]字符串?

0 投票
0 回答
661 浏览

windows - libusb Windows 使用 WinUSB BulkTransfer 接收不一致

我正在尝试使用 libusbx 通过 Windows 与自定义 USB 设备进行通信。我为该设备安装了 WinUSB 驱动程序,并且能够进行一些通信。它只是没有按我的预期运行。

我试图从 PC 上进行一些基本的双向通信,我发送一个字节并期望返回一些字节。目前,如果我重置设备并运行发送字节的程序,我只会收到一个字节。如果我重新运行我的程序,我只会得到下一个字节。这种情况又发生了几次,直到最终我收到我所期望的。

例如:PC 发送一个“a”

预期的输出是

我实际得到的是:

当我使用串行通信通过 com 端口测试 USB 设备时,一切都按预期运行。

这是正在运行的代码的 pastebin:http: //pastebin.com/bQtyS6vq

有没有人遇到过类似的问题或有任何修复建议?

0 投票
1 回答
4313 浏览

android - Windows PC 作为 USB 主机通过 USB 与 Android 设备通信

我想通过 USB 将数据(以编程方式)从 Android 应用程序传输到 Windows PC 上的服务器。我在网上搜索了超过 3-4 天,但找不到任何示例代码等。

有没有办法在 Java、C# 等中实现这一点?我已经通过 adb 建立了连接,但 adb 不是一个选项。