关于c ++:找出哪个进程在USB设备句柄上具有排他锁

关于c ++:找出哪个进程在USB设备句柄上具有排他锁

Find out which process has an exclusive lock on a USB device handle

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

系统上安装的其他一些应用程序正在以读/写模式(没有共享模式)打开设备。 这会阻止我的库(以及占用它的所有资源)与设备一起使用。 我想这是与HID兼容的设备的困扰-其他驱动程序软件(鼠标,控制器,PHIDGETS等)可能无法配合使用。

无论如何,设备文件路径的格式为:

1
2
3
4
5
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}".

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

1
2
3
4
5
6
//  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这样的工具。 但是我似乎无法报告上面列出的设备文件句柄的使用情况。


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

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


您可以通过打开设备句柄来请求读或写权限,并仅使用功能报告与之交互,这是您可以做的一个窍门。扬·阿克森(Jan Axelson)在有关USB HID设备的书中提到了这一技巧。我相信这可以解决排他锁的问题,例如,当您尝试打开W??indows认为系统键盘或鼠标的设备的句柄时,会遇到该问题。即使您无法读取或写入句柄,您仍然可以使用HidD_SetFeature将功能报告发送到设备,并使用HidD_GetFeature从设备中读取报告。在这种情况下,我不知道一种读取输入报告或发送输出报告的方法,这也许是不可能的,但是您可能不需要这两种方法,特别是如果该设备在某种意义上是"您的"设备您可以控制固件。严格来说,这无助于回答您所提出的问题,但它似乎具有潜在的意义,因此我认为我会把它扔出去。


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

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

尝试这些选项,看看是否至少可以阅读该设备。

我知道您在这里的痛苦...我发现USB HID文档在很多地方基本上是错误的。

[编辑]在这个问题上没有很多。这是一个代码项目链接,该链接在底部的线程中轻轻触及了主题。听起来好像是键盘还是鼠标窗口专门抓住了它。


很酷-我会尝试这些选项,因为按照我的意图,它们可能是更好的默认设置。不幸的是,我知道我的设备在那里,以后我最终将需要读/写访问权限(一旦我检查了描述符并确认它确实在我的设备中)。

这意味着我的真正目标是知道正在使用什么,因此我可以通知客户/用户:"嘿,'iexplore.exe'当前正在使用您的SuperWidget设备。您必须将其关闭才能使用SuperWidget应用程序。" (如果不是在应用程序级别,则至少在电话支持级别。)

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

0x20. The process cannot access the file because it is being used by another process.

(因此,假设没有其他代表FILE_SHARE_NONE的共享选项,可能会打开文件)。

[编辑]

Yeah, it's painful alright. I have seen mice and keyboards get locked by whatever Windows uses to read from them. I've also seen a lot of people have trouble inside a VM like Paralells on OS X, where the HID class driver has the device open exclusively preventing the VM from using standard USB requests.

I've seen some code that recreates what ProcessMonitor does. Maybe SysInternals is just electing to ignore device handles, but the same method (or a slight variation) can be employed here to determine the PID.

Mike


推荐阅读

    学习写字楼新选择6000元主流配置

    学习写字楼新选择6000元主流配置,,这种配置需要考虑双核心的办公和娱乐平台,充分考虑办公室的办公需求和娱乐需求,以约6000元的预算和cost-e

    酷睿I7 配置

    酷睿I7 配置,配置,玩家国度啦华硕 Rampage II Extreme(3800元)如果米不够,也可以把Extreme改为Gene,不过是小板内存推荐金士顿6G DDR3 2000骇

    无法读取U盘中的数据

    无法读取U盘中的数据,,核心提示:我有一个512MB的U盘,把它插在电脑显示器里面是空的,但右键单击以查看已经使用USB 480mb文件的属性未设置为隐

    提高3A四核羿龙II游戏配置的性能

    提高3A四核羿龙II游戏配置的性能,,以节能环保为主题的IT产业,目前3A低端平台处理器、主板芯片组、独立开发卡性能突出,特别是在与AMD的处理

    opporeno8参数配置及价格

    opporeno8参数配置及价格,面部,亿元,Oppo的荣誉2020年1月4日,接近屏幕关闭传感器是否支持双卡:支持oppor11splus什么时候上市的Oppo R11S P

    查看配置:酷睿i3530集展示办公平台

    查看配置:酷睿i3530集展示办公平台,,由于时间和精力的关系,我们不可能对所有的配置进行评论,希望我们能理解,我希望我们的评论能在那些需要帮

    3500元超额值学生娱乐结构的优化配置

    3500元超额值学生娱乐结构的优化配置,,作为一个DIY的主流用户领域的学生,每个用户51学生攒机的高峰。因为学生用户没有稳定的收入来源,攒机

    电脑配置快捷键|查看电脑配置快捷键

    电脑配置快捷键|查看电脑配置快捷键,,查看电脑配置快捷键1.在win10中,快捷键组合win+E已经变成了“快速访问”,不再是以前的“我的电脑了”2