找出哪个进程具有USB设备句柄的独占锁定

时间:2008-08-22 18:58:29

标签: c++ winapi usb hid device

我有一个使用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这样的工具。但我似乎无法报告上面列出的设备文件句柄的使用情况。

4 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分: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文档在几个地方基本上都是错误的。

[编辑]这个问题并不多。这是一个codeproject link,它在底部的一个主题中轻轻触及主题。听起来好像是键盘或鼠标窗口专门抓住它。

答案 2 :(得分:1)

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

答案 3 :(得分:0)

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

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

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

  

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

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

[编辑]

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

     

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

     

<强>麦克