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

У меня есть библиотека, которая читает / записывает на USB-устройство с помощью CreateFile () API. В устройстве реализован профиль HID-устройства, поэтому он совместим с драйвером класса HID от Microsoft.

Некоторое другое приложение, установленное в системе, открывает устройство в режиме чтения / записи без режима совместного использования. Это мешает моей библиотеке (и всему, что ее использует) работать с устройством. Я полагаю, что проблема в том, что это 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. Но я не могу заставить его сообщать об использовании дескрипторов файлов устройства, подобных указанному выше.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
7
0
11 872
4

Ответы 4

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

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

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

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

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

Это то, что вам нужно: Изучите информацию о примитивах системного уровня Windows NT

Chibueze Opata 03.07.2015 15:19

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

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

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

Другие вопросы по теме