我有一个使用CreateFile()API读取/写入USB设备的库。 该设备恰好实现了HID设备配置文件,因此它与Microsoft的HID类驱动程序兼容。

系统上安装的其他一些应用程序是以读/写模式打开设备,没有共享模式。 这会阻止我的库(以及消耗它的任何东西)使用该设备。 我认为这是与HID兼容的设备 - 其他驱动程序软件(鼠标,控制器,PHIDGETS等)可能不合作。

无论如何,设备文件路径的形式如下:

1: "\\?\hid#hpqremhiddevice&col01#5&21ff20e7&0&0000#{4d1e55b2-f16f-11cf-88cb-001111000030}".

2: "\\?\hid#vid_045e&pid_0023#7&34aa9ece&0&0000#{4d1e55b2-f16f-11cf-88cb-001111000030}".

3: "\?\hid#vid_056a&pid_00b0&col01#6&5b05f29&0&0000#{4d1e55b2-f16f-11cf-88cb-001111000030}".

我正在尝试使用代码打开它,例如:

//  First, open it with minimum permissions, this device may not be ours.
//  we'll re-open it later in read/write
hid_device_ref = CreateFile(
    device_path, GENERIC_READ,
    0, NULL, OPEN_EXISTING,
    FILE_ATTRIBUTE_NORMAL, NULL);

我已经考虑过像SysInternals这样的工具,如FileMon或Process Monitor。 但我似乎无法报告上面列出的设备文件句柄的使用情况。

===============>>#1 票数:4

您是否尝试过sysinternals中名为handle的工具?

无论如何,两个窗口都没有这样做(显示锁定设备的应用程序的名称):当您尝试弹出USB设备时,Windows只是说该设备当前正在使用中,现在无法删除。

===============>>#2 票数:1

这是我从Magtek读卡器中读取的内容:

//Open file on the device
deviceHandle = 
    CreateFile (deviceDetail->DevicePath, 
    GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, 
    NULL, OPEN_EXISTING, 0, NULL);

尝试这些选项,看看你是否至少可以从设备上读取。

我理解你的痛苦......我发现USB HID文档在几个地方基本上都是错误的。

[编辑]这个问题并不多。 这是一个代码项目链接 ,它轻轻触及底部线程中的主题。 听起来好像是键盘或鼠标窗口专门抓取它。

===============>>#3 票数:1

在打开设备句柄时,您可以执行一项技巧,请求既不读取也不写入权限,并仅使用功能报告与其进行交互。 Jan Axelson在她关于USB HID设备的书中提到了这个技巧。 我相信这解决了独占锁的问题,例如,在尝试打开W​​indows认为是系统键盘或鼠标的设备的句柄时会遇到这种问题。 即使你不能读取或写入手柄,你可以使用仍然发送功能报告,设备HidD_SetFeature和读取使用该设备的报告HidD_GetFeature 我不知道在这种情况下读取输入报告或发送输出报告的方法,也许这是不可能的,但你可能不需要其中任何一种,特别是如果设备是“你的”设备在这个意义上你控制固件。 严格来说,这没有回答你的问题,但它似乎有可能相关,所以我想我会把它扔出去。

===============>>#4 票数:0

很酷 - 我会尝试这些选项,因为根据我的意图,它们可能是更好的默认值。 不幸的是,我知道我的设备在那里,我最终需要稍后进行读/写访问(一旦我检查了描述符并且已经验证它是我的设备)。

这意味着我的真正目标是知道使用它的是什么,所以我可以通知客户/用户:“嘿,'iexplore.exe'目前正在使用你的SuperWidget设备。你必须关闭它以便使用SuperWidget应用程序。“ (如果不是在应用程序级别,那么至少在电话支持级别。)

我忘了提到GetLastError()报告的Windows错误是:

为0x20。 该进程无法访问该文件,因为该文件正由另一个进程使用。

(因此,假设代表其他进程没有FILE_SHARE_NONE,您的共享备选方案可能会打开文件)。

[编辑]

是的,这很痛苦。 我已经看到鼠标和键盘被Windows用来读取它们锁定。 我也看到很多人在OS X上像Paralells这样的虚拟机中遇到麻烦,其中HID类驱动程序打开设备专门阻止虚拟机使用标准USB请求。

我见过一些重新创建ProcessMonitor的代码。 也许SysInternals只是选择忽略设备句柄,但是这里可以使用相同的方法(或稍微变化)来确定PID。

麦克风

  ask by Mike Haboustak translate from so

未解决问题?本站智能推荐:

2回复

USB隐藏设备插入/删除检测WinAPI

我创建了winapi应用程序,女巫通过createprocess使用其他.exe来获取/设置报告。 现在,我需要某种方法来检测该USB HID设备在应用程序运行时是否已从计算机插入/拔出。 最难的是,在该应用程序中,我只知道VID和PID,而对该USB HID设备却没有任何处理。 有什么办
2回复

Windows中USB设备的路径

我将使用USB集线器连接多个设备。 我想将特定的USB设备固定到特定的插槽。 然后检查是否正确完成。 我计划实现这一目标的方法是获得完整的USB路径,例如 我可以通过设备属性在w7中获得此特定字符串,但在wXP中不可用。
1回复

获取USB设备的产品字符串(C#/ C ++)

如何在C#或C ++上从USB设备描述符(设备不是硬盘驱动器,它是像耳机这样的外部设备)获取产品字符串? 我需要获得“My Headset”字符串。 目前我使用此代码示例来获取产品字符串,我打开集线器并使用IOCTL_USB_GET_DESCRIPTOR_FROM_NODE_CONNE
1回复

Windows卷设备检测失败,直到重新引导。 从未失败过

我有代码可以将USB闪存驱动器连接检测为卷。 该代码已经运行了好一阵子,但是最近一位工程师的机器开始出现故障,直到重新启动后才再次正常工作。 该项目使用Qt 4.5.0,但这与该问题无关。 我如下登记报名 然后,处理程序过滤WM_DEVICECHANGE消息。 然后
1回复

python:从USB HID设备读取

我有一个USB RFID设备出现在/ dev / hidraw中,而我的串行设备出现在/ dev / ttyUSB *中。我使用了pyserial,它的工作方式像魅力一样,但是对于这个,我无法使用cat /dev/hidraw0需要root权限加上我需要读一行而不继续听 我使用了evdev
1回复

我需要在HID设备上执行USB控制传输(设置,数据,状态)的哪些Android API?

我正在开发使用USB主机链接到我的Android设备的USB HID控制器的驱动程序。 所有使我能够轮询控制器状态或设置不同标志的特定于供应商的操作都被定义为特定于供应商的控制命令 ,其中包括设置阶段和数据阶段(设备->控制器)。 根据不同的命令,控制器可能会发回状态阶段消息。
2回复

iOS USB HID编程

我正在尝试制作一些有关USB HID设备的代码。 我找到了一篇关于使用Game Kit Framework的蓝牙编程的文章 。 现在我正在寻找一些教程或者一些代码来处理通过USB连接HID设备。 我应该在哪里看? Game Kit是正确的方法吗? iOS和HID设备之间的通信难以实
1回复

USB HID ATmega32u4 Arduino-系统设备ID /名称从默认Arduino Leonardo更改

我正在使用基于ATmega32u4的Arduino Leonardo迷你克隆构建USB HID设备。 那个特定的IC内置了USB控制器,将其上交至HID设备非常简单。 您只需要包含Keyboard.h ,然后使用Keyboard.print ... 当该Arduino连接到PC时,在哪里可以设置/
1回复

“获取输入报告”和“输入报告”之间的USB HID差异

我正在实现具有以下接口的自定义HID设备: 当我通过USB逻辑分析仪将此设备插入计算机时,我看到它是枚举的,然后某些东西(我不确定是什么,有什么主意吗?)使用隐藏的报告描述符智能地捕获大量报告: “输入输入报告”条目使我感到困惑,因为我认为输入报告是通过中断传输发送的。 如果我
1回复

从Windows CE访问USB HID设备

在现有应用程序中,我正在使用一些类似于https://github.com/obdev/v-usb/blob/master/libs-host/hiddata.c中的代码的代码与HID设备通信HDEVINFO,SP_DEVICE_INTERFACE_DATA和几个用于发送和接收报告的HidD _