Как проверить дескриптор USB HID как недействительный из-за переподключения устройства - PullRequest
1 голос
/ 10 апреля 2019

В Windows 7 у меня есть дескриптор пользовательского USB HID устройства.Я пытаюсь определить, не может ли ручка больше не иметь доступа к устройству, потому что устройство было отключено и повторно подключено.Когда это происходит, попытки ввода-вывода с использованием WriteFile завершаются неудачей.Однако я ищу способ проверить дескриптор перед выполнением любого ввода-вывода, чтобы определить, является ли дескриптор устройства HID все еще действительным.И когда я говорю «действительный», я имею в виду, что дескриптор подключен к устройству таким образом, что я смогу выполнить ввод-вывод на устройство.Я понимаю, что технически сама ручка может быть действительной, даже если она потеряла связь с физическим устройством.Текущий метод в моем коде состоит в том, чтобы проверить с помощью попытки открыть новый дескриптор для устройства, и если это успешно, то дескриптор действителен, и если он терпит неудачу, дескриптор недопустим.Это обнаруживает отключение, как и ожидалось, если устройство отключено во время теста.Проблема заключается в том, что если устройство было снова подключено, то тестовое открытие завершается успешно, но фактическая ручка, используемая для ввода / вывода (открытая до отключения / повторного подключения), больше не подключается к устройству.Я ищу добросовестный вызов, который я могу сделать с фактическим дескриптором ввода-вывода, который сообщит мне, если устройство подключено, но без выполнения какого-либо фактического ввода-вывода.

Я пробовал несколько вызовов, такдалеко, но ни один не возвращает указание на подключение устройства, как мне требуется.

DWORD handleInformation;
LARGE_INTEGER size = { 0, 0 };
BOOL isConnected;

isConnected = GetFileSizeEx(m_HidWriteHandle, &size);
isConnected = GetHandleInformation(m_HidWriteHandle, &handleInformation);

GetFileSizeEx всегда завершается ошибкой, и GetLastError () сообщает (1) Неверная функция

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

1 Ответ

0 голосов
/ 10 апреля 2019

Используемый вызов: HidD_GetAttributes (дескриптор и атрибуты)

// Try to get the HID attributes.  This will fail if device is
// unplugged or has been unplugged since CreateFile() call that
// created m_HidWritehandle
HIDD_ATTRIBUTES Attributes;
Attributes.Size = sizeof(Attributes);
m_HidPresent = HidD_GetAttributes(m_HidWriteHandle, &Attributes) != 0;

Это вернет false, даже если устройство было снова подключено, и, следовательно, может использоваться как индикатор необходимости повторного подключения к HID-устройству.

...