static void print_bos(libusb_device_handle *handle) { struct libusb_bos_descriptor *bos; int ret; ret = libusb_get_bos_descriptor(handle, &bos); if (0 > ret) { return; } printf(" Binary Object Store (BOS):\n"); printf(" wTotalLength: %d\n", bos->wTotalLength); printf(" bNumDeviceCaps: %d\n", bos->bNumDeviceCaps); if(bos->dev_capability[0]->bDevCapabilityType == LIBUSB_BT_USB_2_0_EXTENSION) { struct libusb_usb_2_0_extension_descriptor *usb_2_0_extension; ret = libusb_get_usb_2_0_extension_descriptor(NULL, bos->dev_capability[0],&usb_2_0_extension); if (0 > ret) { return; } print_2_0_ext_cap(usb_2_0_extension); libusb_free_usb_2_0_extension_descriptor(usb_2_0_extension); } if(bos->dev_capability[0]->bDevCapabilityType == LIBUSB_BT_SS_USB_DEVICE_CAPABILITY) { struct libusb_ss_usb_device_capability_descriptor *dev_cap; ret = libusb_get_ss_usb_device_capability_descriptor(NULL, bos->dev_capability[0],&dev_cap); if (0 > ret) { return; } print_ss_usb_cap(dev_cap); libusb_free_ss_usb_device_capability_descriptor(dev_cap); } libusb_free_bos_descriptor(bos); }
static void print_device_cap(struct libusb_bos_dev_capability_descriptor *dev_cap) { switch(dev_cap->bDevCapabilityType) { case LIBUSB_BT_USB_2_0_EXTENSION: { struct libusb_usb_2_0_extension_descriptor *usb_2_0_ext = NULL; libusb_get_usb_2_0_extension_descriptor(NULL, dev_cap, &usb_2_0_ext); if (usb_2_0_ext) { printf(" USB 2.0 extension:\n"); printf(" attributes : %02X\n", usb_2_0_ext->bmAttributes); libusb_free_usb_2_0_extension_descriptor(usb_2_0_ext); } break; } case LIBUSB_BT_SS_USB_DEVICE_CAPABILITY: { struct libusb_ss_usb_device_capability_descriptor *ss_usb_device_cap = NULL; libusb_get_ss_usb_device_capability_descriptor(NULL, dev_cap, &ss_usb_device_cap); if (ss_usb_device_cap) { printf(" USB 3.0 capabilities:\n"); printf(" attributes : %02X\n", ss_usb_device_cap->bmAttributes); printf(" supported speeds : %04X\n", ss_usb_device_cap->wSpeedSupported); printf(" supported functionality: %02X\n", ss_usb_device_cap->bFunctionalitySupport); libusb_free_ss_usb_device_capability_descriptor(ss_usb_device_cap); } break; } case LIBUSB_BT_CONTAINER_ID: { struct libusb_container_id_descriptor *container_id = NULL; libusb_get_container_id_descriptor(NULL, dev_cap, &container_id); if (container_id) { printf(" Container ID:\n %s\n", uuid_to_string(container_id->ContainerID)); libusb_free_container_id_descriptor(container_id); } break; } default: printf(" Unknown BOS device capability %02x:\n", dev_cap->bDevCapabilityType); } }