Advertisement
Guest User

Untitled

a guest
Nov 17th, 2019
113
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.20 KB | None | 0 0
  1. #include <iostream>
  2. #include <libusb-1.0/libusb.h>
  3. #include <stdio.h>
  4. using namespace std;
  5. void printdev(libusb_device *dev);
  6. int main() {
  7. libusb_device **devs; // указатель на указатель на устройство,
  8. // используется для получения списка устройств
  9. libusb_context *ctx = nullptr; // контекст сессии libusb
  10. int r; // для возвращаемых значений
  11. ssize_t cnt; // число найденных USB-устройств
  12. ssize_t i; // индексная переменная цикла перебора всех устройств
  13. // инициализировать библиотеку libusb, открыть сессию работы с libusb
  14. r = libusb_init(&ctx);
  15. if(r < 0){
  16. fprintf(stderr,
  17. "Ошибка: инициализация не выполнена, код: %d.\n", r);
  18. return 1;
  19. }
  20. // задать уровень подробности отладочных сообщений
  21. libusb_set_debug(ctx, 3);
  22. // получить список всех найденных USB- устройств
  23. cnt = libusb_get_device_list(ctx, &devs);
  24. if(cnt < 0){
  25. fprintf(stderr,
  26. "Ошибка: список USB устройств не получен.\n");
  27. return 1;
  28. }
  29. printf("найдено устройств: %d\n", (int)cnt);
  30. printf("==============================="
  31. "================================\n");
  32. printf("* количество возможных конфигураций\n");
  33. printf("| * класс устройства\n");
  34. printf("| | * идентификатор производителя\n");
  35. printf("| | | * идентификатор устройства\n");
  36. printf("| | | | * количество интерфейсов\n");
  37. printf("| | | | | * количество "
  38. "альтернативных настроек\n");
  39. printf("| | | | | | * класс устройства\n");
  40. printf("| | | | | | | * номер интерфейса\n");
  41. printf("| | | | | | | | * количество "
  42. "конечных точек\n");
  43. printf("| | | | | | | | | * тип дескриптора\n");
  44. printf("| | | | | | | | | | * адрес "
  45. "конечной точки\n");
  46. printf("| | | | | | | | | | | * серийный номер\n");
  47.  
  48. for(i = 0; i < cnt; i++) { // цикл перебора всех устройств
  49. printf("+--+---+-----+-----+---+--+---+--+"
  50. "--+--+---------+-------------\n");
  51. printdev(devs[i]); // печать параметров устройства
  52. }
  53. printf("==============================="
  54. "================================\n");
  55. // освободить память, выделенную функцией получения списка устройств
  56. libusb_free_device_list(devs, 1);
  57. libusb_exit(ctx); // завершить работу с библиотекой libusb,
  58. // закрыть сессию работы с libusb
  59. return 0;
  60. }
  61.  
  62. void printdev(libusb_device *dev) {
  63. libusb_device_descriptor desc; // дескриптор устройства
  64. libusb_config_descriptor *config; // дескриптор конфигурации объекта
  65. const libusb_interface *inter;
  66. const libusb_interface_descriptor *interdesc;
  67. const libusb_endpoint_descriptor *epdesc;
  68. const int serial_number_size = 256;
  69. unsigned char serial_number[serial_number_size];
  70. libusb_device_handle* handle = nullptr;
  71. int r = libusb_get_device_descriptor(dev, &desc);
  72. if (r < 0) {
  73. fprintf(stderr,
  74. "Ошибка: дескриптор устройства не получен, код: %d.\n", r);
  75. return;
  76. }
  77. r = libusb_open(dev, &handle);
  78. if (r != LIBUSB_SUCCESS) {
  79. fprintf(stderr,
  80. "Ошибка: недостаточно прав для открытия устройства, код: %d.\n", r);
  81. return;
  82. }
  83. // получить конфигурацию устройства
  84. libusb_get_config_descriptor(dev, 0, &config);
  85. //получить серийный номер устройства
  86. if (handle != nullptr && desc.iSerialNumber > 0) {
  87. r = libusb_get_string_descriptor_ascii(handle, desc.iSerialNumber, serial_number, serial_number_size);
  88. if (r < 0) {
  89. fprintf(stderr,
  90. "Ошибка: серийный номер устройства не получен, код: %d.\n", r);
  91. return;
  92. }
  93. }
  94. printf("|%.2d|%.3d|%.5d|%.5d|%.3d| | | | | | |%s\n",
  95. (int) desc.bNumConfigurations,
  96. (int) desc.bDeviceClass,
  97. desc.idVendor,
  98. desc.idProduct,
  99. (int) config->bNumInterfaces,
  100. serial_number
  101. );
  102. for (int i = 0; i < (int) config->bNumInterfaces; i++) {
  103. inter = &config->interface[i];
  104. printf("| | | | | |"
  105. "%.2d|%.3d| | | | |\n",
  106. inter->num_altsetting,
  107. (int) desc.bDeviceClass
  108. );
  109. for (int j = 0; j < inter->num_altsetting; j++) {
  110. interdesc = &inter->altsetting[j];
  111. printf("| | | | | | | |"
  112. "%.2d|%.2d| | |\n",
  113. (int) interdesc->bInterfaceNumber,
  114. (int) interdesc->bNumEndpoints
  115. );
  116. for (int k = 0; k < (int) interdesc->bNumEndpoints; k++) {
  117. epdesc = &interdesc->endpoint[k];
  118. printf(
  119. "| | | | | | | | | |"
  120. "%.2d|%.9d|\n",
  121. (int) epdesc->bDescriptorType,
  122. (int) (int) epdesc->bEndpointAddress
  123. );
  124. }
  125. }
  126. }
  127. libusb_close(handle);
  128. libusb_free_config_descriptor(config);
  129. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement