Сведения о вопросе

LiKIY

09:14, 18th August, 2020

Теги

c++   winapi   usb   hid   device    

Узнайте, какой процесс имеет эксклюзивную блокировку на дескрипторе устройства USB

Просмотров: 411   Ответов: 4

У меня есть библиотека, которая читает / записывает на устройство USB, используя CreateFile() API. Устройство реализует профиль HID-device, так что оно совместимо с драйвером класса 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);

Я рассматривал такой инструмент, как FileMon или Process Monitor от SysInternals. Но я не могу заставить его сообщать об использовании дескрипторов файлов устройств, подобных перечисленным выше.



  Сведения об ответе

SSESION

13:17, 13th August, 2020

Вы пробовали инструмент под названием handle от sysinternals?

Во всяком случае, ни windows не делает этого (отображает имя приложения, которое заблокировало устройство): при попытке извлечь устройство USB, Windows просто говорит, что устройство в настоящее время используется и не может быть удалено прямо сейчас.


  Сведения об ответе

piter

17:57, 20th August, 2020

Это то, что я использую для чтения устройство для чтения карт 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 была в основном неправильной в нескольких местах.

[Edit] там не так уж много об этой проблеме. Вот ссылка на codeproject , которая слегка касается темы в потоке внизу. Похоже, что если это клавиатура или мышь windows захватывает его исключительно.


  Сведения об ответе

prince

05:24, 3rd August, 2020

Есть трюк, который вы можете сделать, когда вы открываете дескриптор устройства, не запрашивая разрешения на чтение или запись, и взаимодействуете с ним, используя только отчеты о функциях. Ян Аксельсон упоминает этот трюк в своих книгах о USB скрытых устройствах. Я считаю, что это позволяет обойти проблему с эксклюзивным замком, с которой вы столкнетесь (например) при попытке открыть дескриптор устройства, которое Windows считает системной клавиатурой или мышью. Даже если вы не можете прочитать или записать дескриптор, вы все равно можете отправить отчет о функции на устройство с помощью HidD_SetFeature и прочитать отчет с устройства с помощью HidD_GetFeature . Я не знаю навскидку способа читать входные отчеты или отправлять выходные отчеты в этих обстоятельствах, и, возможно, это невозможно сделать, но вам может не понадобиться ни то, ни другое, особенно если устройство является устройством "your" в том смысле, что вы управляете прошивкой. Строго говоря, это ничего не дает, чтобы ответить на ваш вопрос, как он был задан, но он казался потенциально уместным, поэтому я решил выбросить его там.


  Сведения об ответе

park

17:21, 29th August, 2020

Круто - я попробую эти варианты, так как они, вероятно, лучше по умолчанию, учитывая мои намерения. К сожалению, я знаю, что мое устройство находится там, и мне в конечном итоге понадобится доступ для чтения/записи позже (как только я проверю дескрипторы и проверю, что это влияет на мое устройство).

Это означает, что моя настоящая цель IS-узнать, что использует его, чтобы я мог сообщить customer/user: "Эй, парень, 'iexplore.exe' в настоящее время использует ваше устройство SuperWidget. Вам придется закрыть его, чтобы использовать приложение SuperWidget."(если не на уровне приложения, то хотя бы на уровне поддержки телефона.)

Я забыл упомянуть, что ошибка windows, о которой сообщает GetLastError(), является:

0x20. Процесс не может получить доступ к файлу, поскольку он используется другим процессом.

(Таким образом, ваши альтернативы совместного использования, вероятно, откроют файл, предполагая, что нет FILE_SHARE_NONE от имени другого процесса).

[редактировать]

Да, это действительно больно. Я видел, как мыши и клавиатуры блокируются тем, что Windows использует для чтения с них. Я также видел, что у многих людей возникают проблемы внутри VM, как у Paralells на OS X, где драйвер класса HID имеет устройство открытым исключительно для предотвращения использования VM стандартных запросов USB.

Я видел какой-то код, который воссоздает то, что делает ProcessMonitor . Возможно, SysInternals просто игнорирует дескрипторы устройств, но тот же метод (или небольшое изменение) может быть использован здесь для определения PID.

Майк


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться