Подтвердить что ты не робот

Windows - Как перечислить все пути подключенных устройств USB-устройств?

Я пытаюсь использовать функции SetupDi для перечисления всех подключенных устройств устройств устройств USB. Путь устройства - это путь, используемый в CreateFile(), поэтому я могу общаться с устройством.

Однако SetupDiGetDeviceInterface требует GUID интерфейса, но я не специально ищу конкретный интерфейс (кроме всех подключенных USB-устройств). Эта часть была прокомментирована как /*??? */в источнике ниже.

Попытка решения:

Я попытался предоставить GUID_DEVCLASS_UNKNOWN = {0x4d36e97e, 0xe325, 0x11ce, {0xbf, 0xc1, 0x08, 0x00, 0x2b, 0xe1, 0x03, 0x18}}; но это породило ошибку "больше интерфейсов".

Я также попытался предоставить deviceInfoData.ClassGuid в SetupDiGetDeviceInterface, но получаю ту же ошибку, что и выше, "больше нет интерфейсов".

Вопросы:

Существует ли общий класс интерфейса, который будет охватывать все USB-устройства? (HID, общий и т.д.)

Или есть альтернативная функция, которая даст мне путь к устройству? (Instread из структуры SP_DEVICE_INTERFACE_DETAIL_DATA, возвращаемой SetupDiGetDeviceInterfaceDetail).

Источник:

HDEVINFO deviceInfoList
SP_DEVINFO_DATA deviceInfoData;
deviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA);
SP_DEVICE_INTERFACE_DATA deviceInterfaceData;
PSP_DEVICE_INTERFACE_DETAIL_DATA deviceInterfaceDetailData = NULL;
DWORD requiredLength = 0;
char *hardwareID = 0;

// Retrieve a list of all present devices
deviceInfoList = SetupDiGetClassDevs(NULL, NULL, NULL, DIGCF_PRESENT | DIGCF_DEVICEINTERFACE | DIGCF_ALLCLASSES);

if (deviceInfoList == INVALID_HANDLE_VALUE) {
    SetupDiDestroyDeviceInfoList(deviceInfoList);
    return false;
}

// Iterate over the list
for (DWORD i = 0; SetupDiEnumDeviceInfo(deviceInfoList, i, &deviceInfoData); i++) {
    if (deviceInterfaceDetailData) LocalFree(deviceInterfaceDetailData);

    requiredLength = 0;

    SetupDiGetDeviceRegistryProperty(deviceInfoList, &deviceInfoData, SPDRP_HARDWAREID, &DataT, NULL, 0, &requiredLength);

    if (requiredLength <= 0) {
        SetupDiDestroyDeviceInfoList(deviceInfoList);
        return false;
    }

    hardwareID = new char[requiredLength]();

    SetupDiGetDeviceRegistryProperty(deviceInfoList, &deviceInfoData, SPDRP_HARDWAREID, &DataT, (PBYTE)hardwareID, requiredLength, NULL);

    // Parse hardwareID for vendor ID and product ID

    delete hardwareID;
    hardwareID = 0;

    deviceInterfaceData.cbSize = sizeof(SP_INTERFACE_DEVICE_DATA);

    // Requires an interface GUID, for which I have none to specify
    if (!SetupDiEnumDeviceInterfaces(deviceInfoList, &deviceInfoData, /* ??? */, 0, &deviceInterfaceData)) {
        SetupDiDestroyDeviceInfoList(deviceInfoList);
        return false;
    }

    if (!SetupDiGetDeviceInterfaceDetail(deviceInfoList, &deviceInterfaceData, NULL, 0, &requiredLength, NULL)) {
        if (GetLastError() == ERROR_INSUFFICIENT_BUFFER && requiredLength > 0) {
            deviceInterfaceDetailData = (PSP_DEVICE_INTERFACE_DETAIL_DATA)LocalAlloc(LPTR, requiredLength);

            if (!deviceInterfaceDetailData) {
                SetupDiDestroyDeviceInfoList(deviceInfoList);
                return false;
            }
        } else {
            SetupDiDestroyDeviceInfoList(deviceInfoList);
            return false;
        }
    }

    deviceInterfaceDetailData->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);

    if (!SetupDiGetDeviceInterfaceDetail(deviceInfoList, &deviceInterfaceData, deviceInterfaceDetailData, requiredLength, NULL, &deviceInfoData)) {
        SetupDiDestroyDeviceInfoList(deviceInfoList);
        return false;
    }

    SetupDiDestroyDeviceInfoList(deviceInfoList);

    // deviceInterfaceDetailData->DevicePath yields the device path
}
4b9b3361

Ответ 1

MSDN говорит, что существует общий интерфейс USB-устройства с именем GUID_DEVINTERFACE_USB_DEVICE с идентификатором GUID {A5DCBF10-6530-11D2-901F-00C04FB951ED}:

Драйвер USB-концентратора, входящий в комплект поставки, регистрирует экземпляры GUID_DEVINTERFACE_USB_DEVICE для уведомления системы и приложений о наличии USB-устройств, подключенных к USB-концентратору.

Вот пример кода, который, похоже, делает то, что вы хотите сделать, используя GUID DEVINTERFACE_USB_DEVICE.