#include #include #include "usb.h" void printdev(libusb_device *dev); int main() { libusb_device **devs; // указатель на указатель на устройство, используется для получения списка устройств libusb_context *ctx = NULL; // контекст сессии libusb int r; // для возвращаемых значений ssize_t cnt; // число найденных USB-устройств ssize_t i; // индексная переменная цикла перебора всех устройств r = libusb_init(&ctx); // инициализировать библиотеку libusb, открыть сессию работы с libusb if (r < 0) { fprintf(stderr, "Ошибка: инициализация не выполнена, код: %d.\n", r); return 1; } libusb_set_option(ctx, 3); // задать уровень подробности отладочных сообщений cnt = libusb_get_device_list(ctx, &devs); // получить список всех найденных USB- устройств if (cnt < 0) { fprintf(stderr, "Ошибка: список USB устройств не получен.\n"); return 1; } printf("найдено устройств: %li\n", cnt); printf("===========================================================\n"); printf("* количество возможных конфигураций\n"); printf("| * класс устройства\n"); printf("| | * идентификатор производителя\n"); printf("| | | * идентификатор устройства\n"); printf("| | | | * количество интерфейсов\n"); printf("| | | | | * количество альтернативных настроек\n"); printf("| | | | | | * класс устройства\n"); printf("| | | | | | | * номер интерфейса\n"); printf("| | | | | | | | * USB-IF код класса интерфейса\n"); printf("| | | | | | | | | * количество конечных точек\n"); printf("| | | | | | | | | | * тип дескриптора\n"); printf("| | | | | | | | | | | * адрес конечной точки\n"); printf("+--+---+-----+-----+---+--+---+--+---+--+--+-------------------\n"); for (i = 0; i < cnt; i++) // цикл перебора всех устройств { printUSB(devs[i]); // печать параметров устройства printdev(devs[i]); // печать только устройства MASS STORAGE } printf("===========================================================\n"); libusb_free_device_list(devs, 1); // освободить память, выделенную функцией получения списка устройств libusb_exit(ctx); // завершить работу с библиотекой libusb, закрыть сессию работы с libusb return 0; } void printdev(libusb_device *dev) { struct libusb_device_descriptor desc; // дескриптор устройства struct libusb_config_descriptor *config; // дескриптор конфигурации объекта const struct libusb_interface *inter; const struct libusb_interface_descriptor *interdesc; const struct libusb_endpoint_descriptor *epdesc; int r = libusb_get_device_descriptor(dev, &desc); if (r < 0) { fprintf(stderr, "Ошибка: дескриптор устройства не получен, код: %d.\n", r); return; } libusb_get_config_descriptor(dev, 0, &config); // получить конфигурацию устройства printf("%.2d %.3d %.5d %.5d %.3d | | | | | | |\n", (int) desc.bNumConfigurations, (int) desc.bDeviceClass, desc.idVendor, desc.idProduct, (int) config->bNumInterfaces); for (int i = 0; i < (int) config->bNumInterfaces; i++) { inter = &config->interface[i]; printf("| | | | | %.2d %.3d | | | | |\n", inter->num_altsetting, (int) desc.bDeviceClass); for (int j = 0; j < inter->num_altsetting; j++) { interdesc = &inter->altsetting[j]; printf("| | | | | | | %.2d %.3d %.2d | |\n", (int) interdesc->bInterfaceNumber, (int) interdesc->bInterfaceClass, (int) interdesc->bNumEndpoints); for (int k = 0; k < (int) interdesc->bNumEndpoints; k++) { epdesc = &interdesc->endpoint[k]; printf("| | | | | | | | | | %.2d %.9d\n", (int) epdesc->bDescriptorType, (int) (int) epdesc->bEndpointAddress); } } } libusb_free_config_descriptor(config); }