25#include <winpr/assert.h> 
   26#include <winpr/cast.h> 
   27#include <winpr/wtypes.h> 
   28#include <winpr/sysinfo.h> 
   29#include <winpr/collections.h> 
   33#include "libusb_udevice.h" 
   35#include "../common/urbdrc_types.h" 
   37#define BASIC_STATE_FUNC_DEFINED(_arg, _type)             \ 
   38  static _type udev_get_##_arg(IUDEVICE* idev)          \ 
   40    UDEVICE* pdev = (UDEVICE*)idev;                   \ 
   43  static void udev_set_##_arg(IUDEVICE* idev, _type _t) \ 
   45    UDEVICE* pdev = (UDEVICE*)idev;                   \ 
   49#define BASIC_POINT_FUNC_DEFINED(_arg, _type)               \ 
   50  static _type udev_get_p_##_arg(IUDEVICE* idev)          \ 
   52    UDEVICE* pdev = (UDEVICE*)idev;                     \ 
   55  static void udev_set_p_##_arg(IUDEVICE* idev, _type _t) \ 
   57    UDEVICE* pdev = (UDEVICE*)idev;                     \ 
   61#define BASIC_STATE_FUNC_REGISTER(_arg, _dev) \ 
   62  _dev->iface.get_##_arg = udev_get_##_arg; \ 
   63  (_dev)->iface.set_##_arg = udev_set_##_arg 
   65#if LIBUSB_API_VERSION >= 0x01000103 
   66#define HAVE_STREAM_ID_API 1 
   77  UINT32 OutputBufferSize;
 
   79  t_isoch_transfer_cb cb;
 
   81#if !defined(HAVE_STREAM_ID_API) 
   84} ASYNC_TRANSFER_USER_DATA;
 
   86static void request_free(
void* value);
 
   88static struct libusb_transfer* list_contains(wArrayList* list, UINT32 streamID)
 
   93  count = ArrayList_Count(list);
 
   94  for (
size_t x = 0; x < count; x++)
 
   96    struct libusb_transfer* transfer = ArrayList_GetItem(list, x);
 
   98#if defined(HAVE_STREAM_ID_API) 
   99    const UINT32 currentID = libusb_transfer_get_stream_id(transfer);
 
  101    const ASYNC_TRANSFER_USER_DATA* user_data = (ASYNC_TRANSFER_USER_DATA*)transfer->user_data;
 
  102    const UINT32 currentID = user_data->streamID;
 
  104    if (currentID == streamID)
 
  110static UINT32 stream_id_from_buffer(
struct libusb_transfer* transfer)
 
  114#if defined(HAVE_STREAM_ID_API) 
  115  return libusb_transfer_get_stream_id(transfer);
 
  117  ASYNC_TRANSFER_USER_DATA* user_data = (ASYNC_TRANSFER_USER_DATA*)transfer->user_data;
 
  120  return user_data->streamID;
 
  124static void set_stream_id_for_buffer(
struct libusb_transfer* transfer, UINT32 streamID)
 
  126#if defined(HAVE_STREAM_ID_API) 
  127  libusb_transfer_set_stream_id(transfer, streamID);
 
  129  ASYNC_TRANSFER_USER_DATA* user_data = (ASYNC_TRANSFER_USER_DATA*)transfer->user_data;
 
  132  user_data->streamID = streamID;
 
  136WINPR_ATTR_FORMAT_ARG(3, 8)
 
  137static BOOL log_libusb_result_(wLog* log, DWORD lvl, WINPR_FORMAT_ARG const 
char* fmt,
 
  138                               const 
char* fkt, const 
char* file, 
size_t line, 
int error, ...)
 
  144    char buffer[8192] = { 0 };
 
  147    (void)vsnprintf(buffer, 
sizeof(buffer), fmt, ap);
 
  150    WLog_Print(log, lvl, 
"[%s:%" PRIuz 
"]: %s: error %s[%d]", fkt, line, buffer,
 
  151               libusb_error_name(error), error);
 
  157#define log_libusb_result(log, lvl, fmt, error, ...) \ 
  158  log_libusb_result_((log), (lvl), (fmt), __func__, __FILE__, __LINE__, error, ##__VA_ARGS__) 
  160const char* usb_interface_class_to_string(uint8_t 
class)
 
  164    case LIBUSB_CLASS_PER_INTERFACE:
 
  165      return "LIBUSB_CLASS_PER_INTERFACE";
 
  166    case LIBUSB_CLASS_AUDIO:
 
  167      return "LIBUSB_CLASS_AUDIO";
 
  168    case LIBUSB_CLASS_COMM:
 
  169      return "LIBUSB_CLASS_COMM";
 
  170    case LIBUSB_CLASS_HID:
 
  171      return "LIBUSB_CLASS_HID";
 
  172    case LIBUSB_CLASS_PHYSICAL:
 
  173      return "LIBUSB_CLASS_PHYSICAL";
 
  174    case LIBUSB_CLASS_PRINTER:
 
  175      return "LIBUSB_CLASS_PRINTER";
 
  176    case LIBUSB_CLASS_IMAGE:
 
  177      return "LIBUSB_CLASS_IMAGE";
 
  178    case LIBUSB_CLASS_MASS_STORAGE:
 
  179      return "LIBUSB_CLASS_MASS_STORAGE";
 
  180    case LIBUSB_CLASS_HUB:
 
  181      return "LIBUSB_CLASS_HUB";
 
  182    case LIBUSB_CLASS_DATA:
 
  183      return "LIBUSB_CLASS_DATA";
 
  184    case LIBUSB_CLASS_SMART_CARD:
 
  185      return "LIBUSB_CLASS_SMART_CARD";
 
  186    case LIBUSB_CLASS_CONTENT_SECURITY:
 
  187      return "LIBUSB_CLASS_CONTENT_SECURITY";
 
  188    case LIBUSB_CLASS_VIDEO:
 
  189      return "LIBUSB_CLASS_VIDEO";
 
  190    case LIBUSB_CLASS_PERSONAL_HEALTHCARE:
 
  191      return "LIBUSB_CLASS_PERSONAL_HEALTHCARE";
 
  192    case LIBUSB_CLASS_DIAGNOSTIC_DEVICE:
 
  193      return "LIBUSB_CLASS_DIAGNOSTIC_DEVICE";
 
  194    case LIBUSB_CLASS_WIRELESS:
 
  195      return "LIBUSB_CLASS_WIRELESS";
 
  196    case LIBUSB_CLASS_APPLICATION:
 
  197      return "LIBUSB_CLASS_APPLICATION";
 
  198    case LIBUSB_CLASS_VENDOR_SPEC:
 
  199      return "LIBUSB_CLASS_VENDOR_SPEC";
 
  201      return "UNKNOWN_DEVICE_CLASS";
 
  205static ASYNC_TRANSFER_USER_DATA* async_transfer_user_data_new(IUDEVICE* idev, UINT32 MessageId,
 
  206                                                              size_t offset, 
size_t BufferSize,
 
  207                                                              const BYTE* data, 
size_t packetSize,
 
  208                                                              BOOL NoAck, t_isoch_transfer_cb cb,
 
  211  ASYNC_TRANSFER_USER_DATA* user_data = NULL;
 
  214  if (BufferSize > UINT32_MAX)
 
  217  user_data = calloc(1, 
sizeof(ASYNC_TRANSFER_USER_DATA));
 
  221  user_data->data = Stream_New(NULL, offset + BufferSize + packetSize);
 
  223  if (!user_data->data)
 
  229  Stream_Seek(user_data->data, offset); 
 
  231    memcpy(Stream_Pointer(user_data->data), data, BufferSize);
 
  233    user_data->OutputBufferSize = (UINT32)BufferSize;
 
  235  user_data->noack = NoAck;
 
  237  user_data->callback = callback;
 
  238  user_data->idev = idev;
 
  239  user_data->MessageId = MessageId;
 
  241  user_data->queue = pdev->request_queue;
 
  246static void async_transfer_user_data_free(ASYNC_TRANSFER_USER_DATA* user_data)
 
  250    Stream_Free(user_data->data, TRUE);
 
  255static void LIBUSB_CALL func_iso_callback(
struct libusb_transfer* transfer)
 
  257  ASYNC_TRANSFER_USER_DATA* user_data = (ASYNC_TRANSFER_USER_DATA*)transfer->user_data;
 
  258  const UINT32 streamID = stream_id_from_buffer(transfer);
 
  259  wArrayList* list = user_data->queue;
 
  261  ArrayList_Lock(list);
 
  262  switch (transfer->status)
 
  264    case LIBUSB_TRANSFER_COMPLETED:
 
  267      BYTE* dataStart = Stream_Pointer(user_data->data);
 
  268      Stream_SetPosition(user_data->data,
 
  271      for (uint32_t i = 0; i < WINPR_ASSERTING_INT_CAST(uint32_t, transfer->num_iso_packets);
 
  274        const UINT32 act_len = transfer->iso_packet_desc[i].actual_length;
 
  275        Stream_Write_UINT32(user_data->data, index);
 
  276        Stream_Write_UINT32(user_data->data, act_len);
 
  277        Stream_Write_UINT32(user_data->data, transfer->iso_packet_desc[i].status);
 
  279        if (transfer->iso_packet_desc[i].status != USBD_STATUS_SUCCESS)
 
  280          user_data->ErrorCount++;
 
  283          const unsigned char* packetBuffer =
 
  284              libusb_get_iso_packet_buffer_simple(transfer, i);
 
  285          BYTE* data = dataStart + index;
 
  287          if (data != packetBuffer)
 
  288            memmove(data, packetBuffer, act_len);
 
  296    case LIBUSB_TRANSFER_CANCELLED:
 
  299    case LIBUSB_TRANSFER_TIMED_OUT:
 
  302    case LIBUSB_TRANSFER_ERROR:
 
  304      const UINT32 InterfaceId =
 
  305          ((STREAM_ID_PROXY << 30) | user_data->idev->get_ReqCompletion(user_data->idev));
 
  307      if (list_contains(list, streamID))
 
  309        if (!user_data->noack)
 
  311          const UINT32 RequestID = streamID & INTERFACE_ID_MASK;
 
  312          user_data->cb(user_data->idev, user_data->callback, user_data->data,
 
  313                        InterfaceId, user_data->noack, user_data->MessageId, RequestID,
 
  314                        WINPR_ASSERTING_INT_CAST(uint32_t, transfer->num_iso_packets),
 
  315                        transfer->status, user_data->StartFrame, user_data->ErrorCount,
 
  316                        user_data->OutputBufferSize);
 
  317          user_data->data = NULL;
 
  319        ArrayList_Remove(list, transfer);
 
  326  ArrayList_Unlock(list);
 
  329static const LIBUSB_ENDPOINT_DESCEIPTOR* func_get_ep_desc(LIBUSB_CONFIG_DESCRIPTOR* LibusbConfig,
 
  331                                                          UINT32 EndpointAddress)
 
  334  const LIBUSB_INTERFACE* 
interface = LibusbConfig->interface;
 
  336  for (UINT32 inum = 0; inum < MsConfig->NumInterfaces; inum++)
 
  338    BYTE alt = MsInterfaces[inum]->AlternateSetting;
 
  339    const LIBUSB_ENDPOINT_DESCEIPTOR* endpoint = interface[inum].altsetting[alt].endpoint;
 
  341    for (UINT32 pnum = 0; pnum < MsInterfaces[inum]->NumberOfPipes; pnum++)
 
  343      if (endpoint[pnum].bEndpointAddress == EndpointAddress)
 
  345        return &endpoint[pnum];
 
  353static void LIBUSB_CALL func_bulk_transfer_cb(
struct libusb_transfer* transfer)
 
  355  ASYNC_TRANSFER_USER_DATA* user_data = NULL;
 
  356  uint32_t streamID = 0;
 
  357  wArrayList* list = NULL;
 
  359  user_data = (ASYNC_TRANSFER_USER_DATA*)transfer->user_data;
 
  362    WLog_ERR(TAG, 
"[%s]: Invalid transfer->user_data!");
 
  365  list = user_data->queue;
 
  366  ArrayList_Lock(list);
 
  367  streamID = stream_id_from_buffer(transfer);
 
  369  if (list_contains(list, streamID))
 
  371    const UINT32 InterfaceId =
 
  372        ((STREAM_ID_PROXY << 30) | user_data->idev->get_ReqCompletion(user_data->idev));
 
  373    const UINT32 RequestID = streamID & INTERFACE_ID_MASK;
 
  375    user_data->cb(user_data->idev, user_data->callback, user_data->data, InterfaceId,
 
  376                  user_data->noack, user_data->MessageId, RequestID,
 
  377                  WINPR_ASSERTING_INT_CAST(uint32_t, transfer->num_iso_packets),
 
  378                  transfer->status, user_data->StartFrame, user_data->ErrorCount,
 
  379                  WINPR_ASSERTING_INT_CAST(uint32_t, transfer->actual_length));
 
  380    user_data->data = NULL;
 
  381    ArrayList_Remove(list, transfer);
 
  383  ArrayList_Unlock(list);
 
  389  if (!urbdrc || !status)
 
  395      *status = USBD_STATUS_SUCCESS;
 
  398    case LIBUSB_ERROR_IO:
 
  399      *status = USBD_STATUS_STALL_PID;
 
  402    case LIBUSB_ERROR_INVALID_PARAM:
 
  403      *status = USBD_STATUS_INVALID_PARAMETER;
 
  406    case LIBUSB_ERROR_ACCESS:
 
  407      *status = USBD_STATUS_NOT_ACCESSED;
 
  410    case LIBUSB_ERROR_NO_DEVICE:
 
  411      *status = USBD_STATUS_DEVICE_GONE;
 
  415        if (!(pdev->status & URBDRC_DEVICE_NOT_FOUND))
 
  416          pdev->status |= URBDRC_DEVICE_NOT_FOUND;
 
  421    case LIBUSB_ERROR_NOT_FOUND:
 
  422      *status = USBD_STATUS_STALL_PID;
 
  425    case LIBUSB_ERROR_BUSY:
 
  426      *status = USBD_STATUS_STALL_PID;
 
  429    case LIBUSB_ERROR_TIMEOUT:
 
  430      *status = USBD_STATUS_TIMEOUT;
 
  433    case LIBUSB_ERROR_OVERFLOW:
 
  434      *status = USBD_STATUS_STALL_PID;
 
  437    case LIBUSB_ERROR_PIPE:
 
  438      *status = USBD_STATUS_STALL_PID;
 
  441    case LIBUSB_ERROR_INTERRUPTED:
 
  442      *status = USBD_STATUS_STALL_PID;
 
  445    case LIBUSB_ERROR_NO_MEM:
 
  446      *status = USBD_STATUS_NO_MEMORY;
 
  449    case LIBUSB_ERROR_NOT_SUPPORTED:
 
  450      *status = USBD_STATUS_NOT_SUPPORTED;
 
  453    case LIBUSB_ERROR_OTHER:
 
  454      *status = USBD_STATUS_STALL_PID;
 
  458      *status = USBD_STATUS_SUCCESS;
 
  465static int func_config_release_all_interface(
URBDRC_PLUGIN* urbdrc,
 
  466                                             LIBUSB_DEVICE_HANDLE* libusb_handle,
 
  467                                             UINT32 NumInterfaces)
 
  469  if (NumInterfaces > INT32_MAX)
 
  471  for (INT32 i = 0; i < (INT32)NumInterfaces; i++)
 
  473    int ret = libusb_release_interface(libusb_handle, i);
 
  475    if (log_libusb_result(urbdrc->log, WLOG_WARN, 
"libusb_release_interface", ret))
 
  482static int func_claim_all_interface(
URBDRC_PLUGIN* urbdrc, LIBUSB_DEVICE_HANDLE* libusb_handle,
 
  487  for (
int i = 0; i < NumInterfaces; i++)
 
  489    ret = libusb_claim_interface(libusb_handle, i);
 
  491    if (log_libusb_result(urbdrc->log, WLOG_ERROR, 
"libusb_claim_interface", ret))
 
  498static LIBUSB_DEVICE* udev_get_libusb_dev(libusb_context* context, uint8_t bus_number,
 
  501  LIBUSB_DEVICE** libusb_list = NULL;
 
  502  LIBUSB_DEVICE* device = NULL;
 
  503  const ssize_t total_device = libusb_get_device_list(context, &libusb_list);
 
  505  for (ssize_t i = 0; i < total_device; i++)
 
  507    LIBUSB_DEVICE* dev = libusb_list[i];
 
  508    if ((bus_number == libusb_get_bus_number(dev)) &&
 
  509        (dev_number == libusb_get_device_address(dev)))
 
  512      libusb_unref_device(dev);
 
  515  libusb_free_device_list(libusb_list, 0);
 
  519static LIBUSB_DEVICE_DESCRIPTOR* udev_new_descript(
URBDRC_PLUGIN* urbdrc, LIBUSB_DEVICE* libusb_dev)
 
  522  LIBUSB_DEVICE_DESCRIPTOR* descriptor =
 
  523      (LIBUSB_DEVICE_DESCRIPTOR*)calloc(1, 
sizeof(LIBUSB_DEVICE_DESCRIPTOR));
 
  526  ret = libusb_get_device_descriptor(libusb_dev, descriptor);
 
  528  if (log_libusb_result(urbdrc->log, WLOG_ERROR, 
"libusb_get_device_descriptor", ret))
 
  537static int libusb_udev_select_interface(IUDEVICE* idev, BYTE InterfaceNumber, BYTE AlternateSetting)
 
  546  if (!pdev || !pdev->urbdrc)
 
  549  urbdrc = pdev->urbdrc;
 
  550  MsConfig = pdev->MsConfig;
 
  554    MsInterfaces = MsConfig->MsInterfaces;
 
  557      WLog_Print(urbdrc->log, WLOG_INFO,
 
  558                 "select Interface(%" PRIu8 
") curr AlternateSetting(%" PRIu8
 
  559                 ") new AlternateSetting(%" PRIu8 
")",
 
  560                 InterfaceNumber, MsInterfaces[InterfaceNumber]->AlternateSetting,
 
  563      if (MsInterfaces[InterfaceNumber]->AlternateSetting != AlternateSetting)
 
  571      error = libusb_set_interface_alt_setting(pdev->libusb_handle, InterfaceNumber,
 
  574      log_libusb_result(urbdrc->log, WLOG_ERROR, 
"libusb_set_interface_alt_setting", error);
 
  591  LIBUSB_CONFIG_DESCRIPTOR* LibusbConfig = NULL;
 
  592  const LIBUSB_INTERFACE* LibusbInterface = NULL;
 
  593  const LIBUSB_INTERFACE_DESCRIPTOR* LibusbAltsetting = NULL;
 
  594  const LIBUSB_ENDPOINT_DESCEIPTOR* LibusbEndpoint = NULL;
 
  595  BYTE LibusbNumEndpoint = 0;
 
  597  UINT32 MsOutSize = 0;
 
  599  if (!pdev || !pdev->LibusbConfig || !pdev->urbdrc || !MsConfig)
 
  602  urbdrc = pdev->urbdrc;
 
  603  LibusbConfig = pdev->LibusbConfig;
 
  605  if (LibusbConfig->bNumInterfaces != MsConfig->NumInterfaces)
 
  607    WLog_Print(urbdrc->log, WLOG_ERROR,
 
  608               "Select Configuration: Libusb NumberInterfaces(%" PRIu8 
") is different " 
  609               "with MsConfig NumberInterfaces(%" PRIu32 
")",
 
  610               LibusbConfig->bNumInterfaces, MsConfig->NumInterfaces);
 
  614  MsInterfaces = MsConfig->MsInterfaces;
 
  616  for (UINT32 inum = 0; inum < MsConfig->NumInterfaces; inum++)
 
  618    MsInterface = MsInterfaces[inum];
 
  620    LibusbInterface = &LibusbConfig->interface[MsInterface->InterfaceNumber];
 
  621    LibusbAltsetting = &LibusbInterface->altsetting[MsInterface->AlternateSetting];
 
  622    LibusbNumEndpoint = LibusbAltsetting->bNumEndpoints;
 
  626    for (UINT32 pnum = 0; pnum < LibusbNumEndpoint; pnum++)
 
  630      if (pnum < MsInterface->NumberOfPipes && MsInterface->MsPipes)
 
  632        MsPipe = MsInterface->MsPipes[pnum];
 
  633        t_MsPipe->MaximumPacketSize = MsPipe->MaximumPacketSize;
 
  634        t_MsPipe->MaximumTransferSize = MsPipe->MaximumTransferSize;
 
  635        t_MsPipe->PipeFlags = MsPipe->PipeFlags;
 
  639        t_MsPipe->MaximumPacketSize = 0;
 
  640        t_MsPipe->MaximumTransferSize = 0xffffffff;
 
  641        t_MsPipe->PipeFlags = 0;
 
  644      t_MsPipe->PipeHandle = 0;
 
  645      t_MsPipe->bEndpointAddress = 0;
 
  646      t_MsPipe->bInterval = 0;
 
  647      t_MsPipe->PipeType = 0;
 
  648      t_MsPipe->InitCompleted = 0;
 
  649      t_MsPipes[pnum] = t_MsPipe;
 
  652    msusb_mspipes_replace(MsInterface, t_MsPipes, LibusbNumEndpoint);
 
  663  MsConfig->ConfigurationHandle = (uint32_t)MsConfig->bConfigurationValue |
 
  664                                  ((uint32_t)pdev->bus_number << 24) |
 
  665                                  (((uint32_t)pdev->dev_number << 16) & 0xFF0000);
 
  666  MsInterfaces = MsConfig->MsInterfaces;
 
  668  for (UINT32 inum = 0; inum < MsConfig->NumInterfaces; inum++)
 
  671    MsInterface = MsInterfaces[inum];
 
  673    LibusbInterface = &LibusbConfig->interface[MsInterface->InterfaceNumber];
 
  674    LibusbAltsetting = &LibusbInterface->altsetting[MsInterface->AlternateSetting];
 
  681    MsInterface->InterfaceHandle =
 
  682        WINPR_ASSERTING_INT_CAST(UINT32, (LibusbAltsetting->bInterfaceNumber |
 
  683                                          (LibusbAltsetting->bAlternateSetting << 8) |
 
  684                                          (pdev->dev_number << 16) | (pdev->bus_number << 24)));
 
  685    const size_t len = 16 + (MsInterface->NumberOfPipes * 20);
 
  686    MsInterface->Length = WINPR_ASSERTING_INT_CAST(UINT16, len);
 
  687    MsInterface->bInterfaceClass = LibusbAltsetting->bInterfaceClass;
 
  688    MsInterface->bInterfaceSubClass = LibusbAltsetting->bInterfaceSubClass;
 
  689    MsInterface->bInterfaceProtocol = LibusbAltsetting->bInterfaceProtocol;
 
  690    MsInterface->InitCompleted = 1;
 
  691    MsPipes = MsInterface->MsPipes;
 
  692    LibusbNumEndpoint = LibusbAltsetting->bNumEndpoints;
 
  694    for (UINT32 pnum = 0; pnum < LibusbNumEndpoint; pnum++)
 
  697      MsPipe = MsPipes[pnum];
 
  699      LibusbEndpoint = &LibusbAltsetting->endpoint[pnum];
 
  706      MsPipe->PipeHandle = LibusbEndpoint->bEndpointAddress |
 
  707                           (((uint32_t)pdev->dev_number << 16) & 0xFF0000) |
 
  708                           (((uint32_t)pdev->bus_number << 24) & 0xFF000000);
 
  710      unsigned max = LibusbEndpoint->wMaxPacketSize & 0x07ff;
 
  711      BYTE attr = LibusbEndpoint->bmAttributes;
 
  713      if ((attr & 0x3) == 1 || (attr & 0x3) == 3)
 
  715        max *= (1 + ((LibusbEndpoint->wMaxPacketSize >> 11) & 3));
 
  718      MsPipe->MaximumPacketSize = WINPR_ASSERTING_INT_CAST(uint16_t, max);
 
  719      MsPipe->bEndpointAddress = LibusbEndpoint->bEndpointAddress;
 
  720      MsPipe->bInterval = LibusbEndpoint->bInterval;
 
  721      MsPipe->PipeType = attr & 0x3;
 
  722      MsPipe->InitCompleted = 1;
 
  726  MsConfig->MsOutSize = WINPR_ASSERTING_INT_CAST(
int, MsOutSize);
 
  727  MsConfig->InitCompleted = 1;
 
  730  if (MsConfig != pdev->MsConfig)
 
  732    msusb_msconfig_free(pdev->MsConfig);
 
  733    pdev->MsConfig = MsConfig;
 
  739static int libusb_udev_select_configuration(IUDEVICE* idev, UINT32 bConfigurationValue)
 
  743  LIBUSB_DEVICE_HANDLE* libusb_handle = NULL;
 
  744  LIBUSB_DEVICE* libusb_dev = NULL;
 
  746  LIBUSB_CONFIG_DESCRIPTOR** LibusbConfig = NULL;
 
  749  if (!pdev || !pdev->MsConfig || !pdev->LibusbConfig || !pdev->urbdrc)
 
  752  urbdrc = pdev->urbdrc;
 
  753  MsConfig = pdev->MsConfig;
 
  754  libusb_handle = pdev->libusb_handle;
 
  755  libusb_dev = pdev->libusb_dev;
 
  756  LibusbConfig = &pdev->LibusbConfig;
 
  758  if (MsConfig->InitCompleted)
 
  760    func_config_release_all_interface(pdev->urbdrc, libusb_handle,
 
  761                                      (*LibusbConfig)->bNumInterfaces);
 
  765  if (bConfigurationValue == 0)
 
  766    ret = libusb_set_configuration(libusb_handle, -1);
 
  768    ret = libusb_set_configuration(libusb_handle,
 
  769                                   WINPR_ASSERTING_INT_CAST(
int, bConfigurationValue));
 
  771  if (log_libusb_result(urbdrc->log, WLOG_ERROR, 
"libusb_set_configuration", ret))
 
  773    func_claim_all_interface(urbdrc, libusb_handle, (*LibusbConfig)->bNumInterfaces);
 
  778    ret = libusb_get_active_config_descriptor(libusb_dev, LibusbConfig);
 
  780    if (log_libusb_result(urbdrc->log, WLOG_ERROR, 
"libusb_set_configuration", ret))
 
  782      func_claim_all_interface(urbdrc, libusb_handle, (*LibusbConfig)->bNumInterfaces);
 
  787  func_claim_all_interface(urbdrc, libusb_handle, (*LibusbConfig)->bNumInterfaces);
 
  791static int libusb_udev_control_pipe_request(IUDEVICE* idev, WINPR_ATTR_UNUSED UINT32 RequestId,
 
  792                                            UINT32 EndpointAddress, UINT32* UsbdStatus, 
int command)
 
  797  WINPR_ASSERT(EndpointAddress <= UINT8_MAX);
 
  805      idev->cancel_all_transfer_request(idev);
 
  811      error = libusb_control_transfer(pdev->libusb_handle,
 
  812                                      (uint8_t)LIBUSB_ENDPOINT_OUT |
 
  813                                          (uint8_t)LIBUSB_RECIPIENT_ENDPOINT,
 
  814                                      LIBUSB_REQUEST_SET_FEATURE, ENDPOINT_HALT,
 
  815                                      (uint16_t)EndpointAddress, NULL, 0, 1000);
 
  819      idev->cancel_all_transfer_request(idev);
 
  820      error = libusb_clear_halt(pdev->libusb_handle, (uint8_t)EndpointAddress);
 
  833static UINT32 libusb_udev_control_query_device_text(IUDEVICE* idev, UINT32 TextType,
 
  834                                                    UINT16 LocaleId, UINT8* BufferSize,
 
  838  LIBUSB_DEVICE_DESCRIPTOR* devDescriptor = NULL;
 
  839  const char strDesc[] = 
"Generic Usb String";
 
  840  char deviceLocation[25] = { 0 };
 
  842  BYTE device_address = 0;
 
  846  WCHAR* text = (WCHAR*)Buffer;
 
  849  const UINT8 inSize = *BufferSize;
 
  852  if (!pdev || !pdev->devDescriptor || !pdev->urbdrc)
 
  853    return ERROR_INVALID_DATA;
 
  855  urbdrc = pdev->urbdrc;
 
  856  devDescriptor = pdev->devDescriptor;
 
  860    case DeviceTextDescription:
 
  862      BYTE data[0x100] = { 0 };
 
  863      ret = libusb_get_string_descriptor(pdev->libusb_handle, devDescriptor->iProduct,
 
  864                                         LocaleId, data, 0xFF);
 
  873      if ((ret <= 0) || (ret <= 4) || (slen <= 4) || (locale != LIBUSB_DT_STRING) ||
 
  876        const char* msg = 
"SHORT_DESCRIPTOR";
 
  878          msg = libusb_error_name(ret);
 
  879        WLog_Print(urbdrc->log, WLOG_DEBUG,
 
  880                   "libusb_get_string_descriptor: " 
  881                   "%s [%d], iProduct: %" PRIu8 
"!",
 
  882                   msg, ret, devDescriptor->iProduct);
 
  884        len = MIN(
sizeof(strDesc), inSize);
 
  885        for (
size_t i = 0; i < len; i++)
 
  886          text[i] = (WCHAR)strDesc[i];
 
  888        *BufferSize = (BYTE)(len * 2);
 
  897        const size_t rchar = _wcsnlen((WCHAR*)&data[2], 
sizeof(data) / 2);
 
  898        len = MIN((BYTE)ret - 2, slen);
 
  899        len = MIN(len, inSize);
 
  900        len = MIN(len, rchar * 2 + 
sizeof(WCHAR));
 
  901        memcpy(Buffer, &data[2], len);
 
  905        Buffer[len - 2] = 
'\0';
 
  906        Buffer[len - 1] = 
'\0';
 
  907        *BufferSize = (BYTE)len;
 
  912    case DeviceTextLocationInformation:
 
  913      bus_number = libusb_get_bus_number(pdev->libusb_dev);
 
  914      device_address = libusb_get_device_address(pdev->libusb_dev);
 
  915      (void)sprintf_s(deviceLocation, 
sizeof(deviceLocation),
 
  916                      "Port_#%04" PRIu8 
".Hub_#%04" PRIu8 
"", device_address, bus_number);
 
  918      len = strnlen(deviceLocation,
 
  919                    MIN(
sizeof(deviceLocation), (inSize > 0) ? inSize - 1U : 0));
 
  920      for (
size_t i = 0; i < len; i++)
 
  921        text[i] = (WCHAR)deviceLocation[i];
 
  923      *BufferSize = (UINT8)(len * 
sizeof(WCHAR));
 
  927      WLog_Print(urbdrc->log, WLOG_DEBUG, 
"Query Text: unknown TextType %" PRIu32 
"",
 
  929      return ERROR_INVALID_DATA;
 
  935static int libusb_udev_os_feature_descriptor_request(IUDEVICE* idev,
 
  936                                                     WINPR_ATTR_UNUSED UINT32 RequestId,
 
  937                                                     BYTE Recipient, BYTE InterfaceNumber,
 
  938                                                     BYTE Ms_PageIndex, UINT16 Ms_featureDescIndex,
 
  939                                                     UINT32* UsbdStatus, UINT32* BufferSize,
 
  940                                                     BYTE* Buffer, UINT32 Timeout)
 
  943  BYTE ms_string_desc[0x13] = { 0 };
 
  947  WINPR_ASSERT(UsbdStatus);
 
  948  WINPR_ASSERT(BufferSize);
 
  949  WINPR_ASSERT(*BufferSize <= UINT16_MAX);
 
  954  error = libusb_control_transfer(pdev->libusb_handle, LIBUSB_ENDPOINT_IN | Recipient,
 
  955                                  LIBUSB_REQUEST_GET_DESCRIPTOR, 0x03ee, 0, ms_string_desc, 0x12,
 
  958  log_libusb_result(pdev->urbdrc->log, WLOG_DEBUG, 
"libusb_control_transfer", error);
 
  962    const BYTE bMS_Vendorcode = ms_string_desc[16];
 
  964    error = libusb_control_transfer(
 
  966        (uint8_t)LIBUSB_ENDPOINT_IN | (uint8_t)LIBUSB_REQUEST_TYPE_VENDOR | Recipient,
 
  967        bMS_Vendorcode, (UINT16)((InterfaceNumber << 8) | Ms_PageIndex), Ms_featureDescIndex,
 
  968        Buffer, (UINT16)*BufferSize, Timeout);
 
  969    log_libusb_result(pdev->urbdrc->log, WLOG_DEBUG, 
"libusb_control_transfer", error);
 
  972      *BufferSize = (UINT32)error;
 
  976    *UsbdStatus = USBD_STATUS_STALL_PID;
 
  978    *UsbdStatus = USBD_STATUS_SUCCESS;
 
  980  return ERROR_SUCCESS;
 
  983static int libusb_udev_query_device_descriptor(IUDEVICE* idev, 
int offset)
 
  990      return pdev->devDescriptor->bLength;
 
  992    case B_DESCRIPTOR_TYPE:
 
  993      return pdev->devDescriptor->bDescriptorType;
 
  996      return pdev->devDescriptor->bcdUSB;
 
  999      return pdev->devDescriptor->bDeviceClass;
 
 1001    case B_DEVICE_SUBCLASS:
 
 1002      return pdev->devDescriptor->bDeviceSubClass;
 
 1004    case B_DEVICE_PROTOCOL:
 
 1005      return pdev->devDescriptor->bDeviceProtocol;
 
 1007    case B_MAX_PACKET_SIZE0:
 
 1008      return pdev->devDescriptor->bMaxPacketSize0;
 
 1011      return pdev->devDescriptor->idVendor;
 
 1014      return pdev->devDescriptor->idProduct;
 
 1017      return pdev->devDescriptor->bcdDevice;
 
 1019    case I_MANUFACTURER:
 
 1020      return pdev->devDescriptor->iManufacturer;
 
 1023      return pdev->devDescriptor->iProduct;
 
 1025    case I_SERIAL_NUMBER:
 
 1026      return pdev->devDescriptor->iSerialNumber;
 
 1028    case B_NUM_CONFIGURATIONS:
 
 1029      return pdev->devDescriptor->bNumConfigurations;
 
 1036static BOOL libusb_udev_detach_kernel_driver(IUDEVICE* idev)
 
 1042  if (!pdev || !pdev->LibusbConfig || !pdev->libusb_handle || !pdev->urbdrc)
 
 1048  urbdrc = pdev->urbdrc;
 
 1050  if ((pdev->status & URBDRC_DEVICE_DETACH_KERNEL) == 0)
 
 1052    for (
int i = 0; i < pdev->LibusbConfig->bNumInterfaces; i++)
 
 1054      err = libusb_kernel_driver_active(pdev->libusb_handle, i);
 
 1055      log_libusb_result(urbdrc->log, WLOG_DEBUG, 
"libusb_kernel_driver_active", err);
 
 1059        err = libusb_detach_kernel_driver(pdev->libusb_handle, i);
 
 1060        log_libusb_result(urbdrc->log, WLOG_DEBUG, 
"libusb_detach_kernel_driver", err);
 
 1064    pdev->status |= URBDRC_DEVICE_DETACH_KERNEL;
 
 1071static BOOL libusb_udev_attach_kernel_driver(IUDEVICE* idev)
 
 1076  if (!pdev || !pdev->LibusbConfig || !pdev->libusb_handle || !pdev->urbdrc)
 
 1079  for (
int i = 0; i < pdev->LibusbConfig->bNumInterfaces && err != LIBUSB_ERROR_NO_DEVICE; i++)
 
 1081    err = libusb_release_interface(pdev->libusb_handle, i);
 
 1083    log_libusb_result(pdev->urbdrc->log, WLOG_DEBUG, 
"libusb_release_interface", err);
 
 1086    if (err != LIBUSB_ERROR_NO_DEVICE)
 
 1088      err = libusb_attach_kernel_driver(pdev->libusb_handle, i);
 
 1089      log_libusb_result(pdev->urbdrc->log, WLOG_DEBUG, 
"libusb_attach_kernel_driver if=%d",
 
 1098static int libusb_udev_is_composite_device(IUDEVICE* idev)
 
 1101  return pdev->isCompositeDevice;
 
 1104static int libusb_udev_is_exist(IUDEVICE* idev)
 
 1107  return (pdev->status & URBDRC_DEVICE_NOT_FOUND) ? 0 : 1;
 
 1110static int libusb_udev_is_channel_closed(IUDEVICE* idev)
 
 1113  IUDEVMAN* udevman = NULL;
 
 1114  if (!pdev || !pdev->urbdrc)
 
 1117  udevman = pdev->urbdrc->udevman;
 
 1120    if (udevman->status & URBDRC_DEVICE_CHANNEL_CLOSED)
 
 1124  if (pdev->status & URBDRC_DEVICE_CHANNEL_CLOSED)
 
 1130static int libusb_udev_is_already_send(IUDEVICE* idev)
 
 1133  return (pdev->status & URBDRC_DEVICE_ALREADY_SEND) ? 1 : 0;
 
 1138static void libusb_udev_mark_channel_closed(IUDEVICE* idev)
 
 1141  if (pdev && ((pdev->status & URBDRC_DEVICE_CHANNEL_CLOSED) == 0))
 
 1144    const uint8_t busNr = idev->get_bus_number(idev);
 
 1145    const uint8_t devNr = idev->get_dev_number(idev);
 
 1147    pdev->status |= URBDRC_DEVICE_CHANNEL_CLOSED;
 
 1148    urbdrc->udevman->unregister_udevice(urbdrc->udevman, busNr, devNr);
 
 1154static void libusb_udev_channel_closed(IUDEVICE* idev)
 
 1157  if (pdev && ((pdev->status & URBDRC_DEVICE_CHANNEL_CLOSED) == 0))
 
 1160    const uint8_t busNr = idev->get_bus_number(idev);
 
 1161    const uint8_t devNr = idev->get_dev_number(idev);
 
 1162    IWTSVirtualChannel* channel = NULL;
 
 1164    if (pdev->channelManager)
 
 1165      channel = IFCALLRESULT(NULL, pdev->channelManager->FindChannelById,
 
 1166                             pdev->channelManager, pdev->channelID);
 
 1168    pdev->status |= URBDRC_DEVICE_CHANNEL_CLOSED;
 
 1171      channel->Write(channel, 0, NULL, NULL);
 
 1173    urbdrc->udevman->unregister_udevice(urbdrc->udevman, busNr, devNr);
 
 1177static void libusb_udev_set_already_send(IUDEVICE* idev)
 
 1180  pdev->status |= URBDRC_DEVICE_ALREADY_SEND;
 
 1183static char* libusb_udev_get_path(IUDEVICE* idev)
 
 1189static int libusb_udev_query_device_port_status(IUDEVICE* idev, UINT32* UsbdStatus,
 
 1190                                                UINT32* BufferSize, BYTE* Buffer)
 
 1197  if (!pdev || !pdev->urbdrc)
 
 1200  urbdrc = pdev->urbdrc;
 
 1202  if (pdev->hub_handle != NULL)
 
 1204    ret = idev->control_transfer(
 
 1206        (uint8_t)LIBUSB_ENDPOINT_IN | (uint8_t)LIBUSB_REQUEST_TYPE_CLASS |
 
 1207            (uint8_t)LIBUSB_RECIPIENT_OTHER,
 
 1208        LIBUSB_REQUEST_GET_STATUS, 0, pdev->port_number, UsbdStatus, BufferSize, Buffer, 1000);
 
 1210    if (log_libusb_result(urbdrc->log, WLOG_DEBUG, 
"libusb_control_transfer", ret))
 
 1214      WLog_Print(urbdrc->log, WLOG_DEBUG,
 
 1215                 "PORT STATUS:0x%02" PRIx8 
"%02" PRIx8 
"%02" PRIx8 
"%02" PRIx8 
"", Buffer[3],
 
 1216                 Buffer[2], Buffer[1], Buffer[0]);
 
 1225                                      UINT32 MessageId, UINT32 RequestId, UINT32 EndpointAddress,
 
 1226                                      WINPR_ATTR_UNUSED UINT32 TransferFlags, UINT32 StartFrame,
 
 1227                                      UINT32 ErrorCount, BOOL NoAck,
 
 1228                                      WINPR_ATTR_UNUSED 
const BYTE* packetDescriptorData,
 
 1229                                      UINT32 NumberOfPackets, UINT32 BufferSize, 
const BYTE* Buffer,
 
 1230                                      t_isoch_transfer_cb cb, UINT32 Timeout)
 
 1233  UINT32 iso_packet_size = 0;
 
 1235  ASYNC_TRANSFER_USER_DATA* user_data = NULL;
 
 1236  struct libusb_transfer* iso_transfer = NULL;
 
 1238  size_t outSize = (12ULL * NumberOfPackets);
 
 1239  uint32_t streamID = 0x40000000 | RequestId;
 
 1241  if (!pdev || !pdev->urbdrc)
 
 1244  urbdrc = pdev->urbdrc;
 
 1245  user_data = async_transfer_user_data_new(idev, MessageId, 48, BufferSize, Buffer,
 
 1246                                           outSize + 1024, NoAck, cb, callback);
 
 1251  user_data->ErrorCount = ErrorCount;
 
 1252  user_data->StartFrame = StartFrame;
 
 1255    Stream_Seek(user_data->data, (12ULL * NumberOfPackets));
 
 1257  if (NumberOfPackets > 0)
 
 1259    iso_packet_size = BufferSize / NumberOfPackets;
 
 1260    iso_transfer = libusb_alloc_transfer((
int)NumberOfPackets);
 
 1263  if (iso_transfer == NULL)
 
 1265    WLog_Print(urbdrc->log, WLOG_ERROR,
 
 1266               "Error: libusb_alloc_transfer [NumberOfPackets=%" PRIu32 
", BufferSize=%" PRIu32
 
 1268               NumberOfPackets, BufferSize);
 
 1269    async_transfer_user_data_free(user_data);
 
 1274  libusb_fill_iso_transfer(
 
 1275      iso_transfer, pdev->libusb_handle, WINPR_ASSERTING_INT_CAST(uint8_t, EndpointAddress),
 
 1276      Stream_Pointer(user_data->data), WINPR_ASSERTING_INT_CAST(
int, BufferSize),
 
 1277      WINPR_ASSERTING_INT_CAST(
int, NumberOfPackets), func_iso_callback, user_data, Timeout);
 
 1278  set_stream_id_for_buffer(iso_transfer, streamID);
 
 1279  libusb_set_iso_packet_lengths(iso_transfer, iso_packet_size);
 
 1281  if (!ArrayList_Append(pdev->request_queue, iso_transfer))
 
 1283    WLog_Print(urbdrc->log, WLOG_WARN,
 
 1284               "Failed to queue iso transfer, streamID %08" PRIx32 
" already in use!",
 
 1286    request_free(iso_transfer);
 
 1289  rc = libusb_submit_transfer(iso_transfer);
 
 1290  if (log_libusb_result(urbdrc->log, WLOG_ERROR, 
"libusb_submit_transfer", rc))
 
 1295static BOOL libusb_udev_control_transfer(IUDEVICE* idev, WINPR_ATTR_UNUSED UINT32 RequestId,
 
 1296                                         WINPR_ATTR_UNUSED UINT32 EndpointAddress,
 
 1297                                         WINPR_ATTR_UNUSED UINT32 TransferFlags, BYTE bmRequestType,
 
 1298                                         BYTE Request, UINT16 Value, UINT16 Index,
 
 1299                                         UINT32* UrbdStatus, UINT32* BufferSize, BYTE* Buffer,
 
 1305  WINPR_ASSERT(BufferSize);
 
 1306  WINPR_ASSERT(*BufferSize <= UINT16_MAX);
 
 1308  if (!pdev || !pdev->urbdrc)
 
 1311  status = libusb_control_transfer(pdev->libusb_handle, bmRequestType, Request, Value, Index,
 
 1312                                   Buffer, (UINT16)*BufferSize, Timeout);
 
 1315    *BufferSize = (UINT32)status;
 
 1317    log_libusb_result(pdev->urbdrc->log, WLOG_ERROR, 
"libusb_control_transfer", status);
 
 1319  if (!func_set_usbd_status(pdev->urbdrc, pdev, UrbdStatus, status))
 
 1325static int libusb_udev_bulk_or_interrupt_transfer(IUDEVICE* idev,
 
 1327                                                  UINT32 MessageId, UINT32 RequestId,
 
 1328                                                  UINT32 EndpointAddress, UINT32 TransferFlags,
 
 1329                                                  BOOL NoAck, UINT32 BufferSize, 
const BYTE* data,
 
 1330                                                  t_isoch_transfer_cb cb, UINT32 Timeout)
 
 1333  UINT32 transfer_type = 0;
 
 1335  const LIBUSB_ENDPOINT_DESCEIPTOR* ep_desc = NULL;
 
 1336  struct libusb_transfer* transfer = NULL;
 
 1338  ASYNC_TRANSFER_USER_DATA* user_data = NULL;
 
 1339  uint32_t streamID = 0x80000000 | RequestId;
 
 1341  if (!pdev || !pdev->LibusbConfig || !pdev->urbdrc)
 
 1344  urbdrc = pdev->urbdrc;
 
 1346      async_transfer_user_data_new(idev, MessageId, 36, BufferSize, data, 0, NoAck, cb, callback);
 
 1352  transfer = libusb_alloc_transfer(0);
 
 1355    async_transfer_user_data_free(user_data);
 
 1358  transfer->user_data = user_data;
 
 1360  ep_desc = func_get_ep_desc(pdev->LibusbConfig, pdev->MsConfig, EndpointAddress);
 
 1364    WLog_Print(urbdrc->log, WLOG_ERROR, 
"func_get_ep_desc: endpoint 0x%" PRIx32 
" not found",
 
 1366    request_free(transfer);
 
 1370  transfer_type = (ep_desc->bmAttributes) & 0x3;
 
 1371  WLog_Print(urbdrc->log, WLOG_DEBUG,
 
 1372             "urb_bulk_or_interrupt_transfer: ep:0x%" PRIx32 
" " 
 1373             "transfer_type %" PRIu32 
" flag:%" PRIu32 
" OutputBufferSize:0x%" PRIx32 
"",
 
 1374             EndpointAddress, transfer_type, TransferFlags, BufferSize);
 
 1376  switch (transfer_type)
 
 1380      libusb_fill_bulk_transfer(
 
 1381          transfer, pdev->libusb_handle, WINPR_ASSERTING_INT_CAST(uint8_t, EndpointAddress),
 
 1382          Stream_Pointer(user_data->data), WINPR_ASSERTING_INT_CAST(
int, BufferSize),
 
 1383          func_bulk_transfer_cb, user_data, Timeout);
 
 1386    case INTERRUPT_TRANSFER:
 
 1388      libusb_fill_interrupt_transfer(
 
 1389          transfer, pdev->libusb_handle, WINPR_ASSERTING_INT_CAST(uint8_t, EndpointAddress),
 
 1390          Stream_Pointer(user_data->data), WINPR_ASSERTING_INT_CAST(
int, BufferSize),
 
 1391          func_bulk_transfer_cb, user_data, Timeout);
 
 1395      WLog_Print(urbdrc->log, WLOG_DEBUG,
 
 1396                 "urb_bulk_or_interrupt_transfer:" 
 1397                 " other transfer type 0x%" PRIX32 
"",
 
 1399      request_free(transfer);
 
 1403  set_stream_id_for_buffer(transfer, streamID);
 
 1405  if (!ArrayList_Append(pdev->request_queue, transfer))
 
 1407    WLog_Print(urbdrc->log, WLOG_WARN,
 
 1408               "Failed to queue transfer, streamID %08" PRIx32 
" already in use!", streamID);
 
 1409    request_free(transfer);
 
 1412  rc = libusb_submit_transfer(transfer);
 
 1413  if (log_libusb_result(urbdrc->log, WLOG_ERROR, 
"libusb_submit_transfer", rc))
 
 1418static int func_cancel_xact_request(
URBDRC_PLUGIN* urbdrc, 
struct libusb_transfer* transfer)
 
 1422  if (!urbdrc || !transfer)
 
 1425  status = libusb_cancel_transfer(transfer);
 
 1427  if (log_libusb_result(urbdrc->log, WLOG_WARN, 
"libusb_cancel_transfer", status))
 
 1429    if (status == LIBUSB_ERROR_NOT_FOUND)
 
 1438static void libusb_udev_cancel_all_transfer_request(IUDEVICE* idev)
 
 1443  if (!pdev || !pdev->request_queue || !pdev->urbdrc)
 
 1446  ArrayList_Lock(pdev->request_queue);
 
 1447  count = ArrayList_Count(pdev->request_queue);
 
 1449  for (
size_t x = 0; x < count; x++)
 
 1451    struct libusb_transfer* transfer = ArrayList_GetItem(pdev->request_queue, x);
 
 1452    func_cancel_xact_request(pdev->urbdrc, transfer);
 
 1455  ArrayList_Unlock(pdev->request_queue);
 
 1458static int libusb_udev_cancel_transfer_request(IUDEVICE* idev, UINT32 RequestId)
 
 1462  struct libusb_transfer* transfer = NULL;
 
 1463  uint32_t cancelID1 = 0x40000000 | RequestId;
 
 1464  uint32_t cancelID2 = 0x80000000 | RequestId;
 
 1466  if (!idev || !pdev->urbdrc || !pdev->request_queue)
 
 1469  ArrayList_Lock(pdev->request_queue);
 
 1470  transfer = list_contains(pdev->request_queue, cancelID1);
 
 1472    transfer = list_contains(pdev->request_queue, cancelID2);
 
 1478    rc = func_cancel_xact_request(urbdrc, transfer);
 
 1480  ArrayList_Unlock(pdev->request_queue);
 
 1484BASIC_STATE_FUNC_DEFINED(channelManager, IWTSVirtualChannelManager*)
 
 1485BASIC_STATE_FUNC_DEFINED(channelID, UINT32)
 
 1486BASIC_STATE_FUNC_DEFINED(ReqCompletion, UINT32)
 
 1487BASIC_STATE_FUNC_DEFINED(bus_number, BYTE)
 
 1488BASIC_STATE_FUNC_DEFINED(dev_number, BYTE)
 
 1489BASIC_STATE_FUNC_DEFINED(port_number, UINT8)
 
 1492BASIC_POINT_FUNC_DEFINED(udev, 
void*)
 
 1493BASIC_POINT_FUNC_DEFINED(prev, 
void*)
 
 1494BASIC_POINT_FUNC_DEFINED(next, 
void*)
 
 1496static UINT32 udev_get_UsbDevice(IUDEVICE* idev)
 
 1503  return pdev->UsbDevice;
 
 1506static void udev_set_UsbDevice(IUDEVICE* idev, UINT32 val)
 
 1513  pdev->UsbDevice = val;
 
 1516static void udev_free(IUDEVICE* idev)
 
 1522  if (!idev || !udev->urbdrc)
 
 1525  urbdrc = udev->urbdrc;
 
 1527  libusb_udev_cancel_all_transfer_request(&udev->iface);
 
 1528  if (udev->libusb_handle)
 
 1530    rc = libusb_reset_device(udev->libusb_handle);
 
 1532    log_libusb_result(urbdrc->log, WLOG_ERROR, 
"libusb_reset_device", rc);
 
 1541  udev->iface.attach_kernel_driver(idev);
 
 1542  ArrayList_Free(udev->request_queue);
 
 1544  msusb_msconfig_free(udev->MsConfig);
 
 1545  libusb_unref_device(udev->libusb_dev);
 
 1546  libusb_close(udev->libusb_handle);
 
 1547  libusb_close(udev->hub_handle);
 
 1548  free(udev->devDescriptor);
 
 1552static void udev_load_interface(
UDEVICE* pdev)
 
 1558  BASIC_STATE_FUNC_REGISTER(channelManager, pdev);
 
 1559  BASIC_STATE_FUNC_REGISTER(channelID, pdev);
 
 1560  BASIC_STATE_FUNC_REGISTER(UsbDevice, pdev);
 
 1561  BASIC_STATE_FUNC_REGISTER(ReqCompletion, pdev);
 
 1562  BASIC_STATE_FUNC_REGISTER(bus_number, pdev);
 
 1563  BASIC_STATE_FUNC_REGISTER(dev_number, pdev);
 
 1564  BASIC_STATE_FUNC_REGISTER(port_number, pdev);
 
 1565  BASIC_STATE_FUNC_REGISTER(MsConfig, pdev);
 
 1566  BASIC_STATE_FUNC_REGISTER(p_udev, pdev);
 
 1567  BASIC_STATE_FUNC_REGISTER(p_prev, pdev);
 
 1568  BASIC_STATE_FUNC_REGISTER(p_next, pdev);
 
 1569  pdev->iface.isCompositeDevice = libusb_udev_is_composite_device;
 
 1570  pdev->iface.isExist = libusb_udev_is_exist;
 
 1571  pdev->iface.isAlreadySend = libusb_udev_is_already_send;
 
 1572  pdev->iface.isChannelClosed = libusb_udev_is_channel_closed;
 
 1573  pdev->iface.setAlreadySend = libusb_udev_set_already_send;
 
 1574  pdev->iface.setChannelClosed = libusb_udev_channel_closed;
 
 1575  pdev->iface.markChannelClosed = libusb_udev_mark_channel_closed;
 
 1576  pdev->iface.getPath = libusb_udev_get_path;
 
 1578  pdev->iface.isoch_transfer = libusb_udev_isoch_transfer;
 
 1579  pdev->iface.control_transfer = libusb_udev_control_transfer;
 
 1580  pdev->iface.bulk_or_interrupt_transfer = libusb_udev_bulk_or_interrupt_transfer;
 
 1581  pdev->iface.select_interface = libusb_udev_select_interface;
 
 1582  pdev->iface.select_configuration = libusb_udev_select_configuration;
 
 1583  pdev->iface.complete_msconfig_setup = libusb_udev_complete_msconfig_setup;
 
 1584  pdev->iface.control_pipe_request = libusb_udev_control_pipe_request;
 
 1585  pdev->iface.control_query_device_text = libusb_udev_control_query_device_text;
 
 1586  pdev->iface.os_feature_descriptor_request = libusb_udev_os_feature_descriptor_request;
 
 1587  pdev->iface.cancel_all_transfer_request = libusb_udev_cancel_all_transfer_request;
 
 1588  pdev->iface.cancel_transfer_request = libusb_udev_cancel_transfer_request;
 
 1589  pdev->iface.query_device_descriptor = libusb_udev_query_device_descriptor;
 
 1590  pdev->iface.detach_kernel_driver = libusb_udev_detach_kernel_driver;
 
 1591  pdev->iface.attach_kernel_driver = libusb_udev_attach_kernel_driver;
 
 1592  pdev->iface.query_device_port_status = libusb_udev_query_device_port_status;
 
 1593  pdev->iface.free = udev_free;
 
 1597                                  UINT16 bus_number, UINT16 dev_number)
 
 1600  uint8_t port_numbers[16] = { 0 };
 
 1601  LIBUSB_DEVICE** libusb_list = NULL;
 
 1602  const ssize_t total_device = libusb_get_device_list(ctx, &libusb_list);
 
 1604  WINPR_ASSERT(urbdrc);
 
 1607  for (ssize_t i = 0; i < total_device; i++)
 
 1609    LIBUSB_DEVICE* dev = libusb_list[i];
 
 1611    if ((bus_number != libusb_get_bus_number(dev)) ||
 
 1612        (dev_number != libusb_get_device_address(dev)))
 
 1613      libusb_unref_device(dev);
 
 1616      error = libusb_open(dev, &pdev->libusb_handle);
 
 1618      if (log_libusb_result(urbdrc->log, WLOG_ERROR, 
"libusb_open", error))
 
 1620        libusb_unref_device(dev);
 
 1625      error = libusb_get_port_numbers(dev, port_numbers, 
sizeof(port_numbers));
 
 1629        log_libusb_result(urbdrc->log, WLOG_ERROR, 
"libusb_get_port_numbers", error);
 
 1630        libusb_unref_device(dev);
 
 1634      pdev->port_number = port_numbers[(error - 1)];
 
 1636      WLog_Print(urbdrc->log, WLOG_DEBUG, 
"  Port: %" PRIu8, pdev->port_number);
 
 1638      (void)_snprintf(pdev->path, 
sizeof(pdev->path), 
"%" PRIu16 
"-%d", bus_number,
 
 1641      WLog_Print(urbdrc->log, WLOG_DEBUG, 
"  DevPath: %s", pdev->path);
 
 1644  libusb_free_device_list(libusb_list, 0);
 
 1652                               UINT16 bus_number, WINPR_ATTR_UNUSED UINT16 dev_number)
 
 1655  LIBUSB_DEVICE** libusb_list = NULL;
 
 1656  LIBUSB_DEVICE_HANDLE* handle = NULL;
 
 1657  const ssize_t total_device = libusb_get_device_list(ctx, &libusb_list);
 
 1659  WINPR_ASSERT(urbdrc);
 
 1662  for (ssize_t i = 0; i < total_device; i++)
 
 1664    LIBUSB_DEVICE* dev = libusb_list[i];
 
 1666    if ((bus_number != libusb_get_bus_number(dev)) ||
 
 1667        (1 != libusb_get_device_address(dev))) 
 
 1668      libusb_unref_device(dev);
 
 1671      WLog_Print(urbdrc->log, WLOG_DEBUG, 
"  Open hub: %" PRIu16 
"", bus_number);
 
 1672      error = libusb_open(dev, &handle);
 
 1674      if (!log_libusb_result(urbdrc->log, WLOG_ERROR, 
"libusb_open", error))
 
 1675        pdev->hub_handle = handle;
 
 1677        libusb_unref_device(dev);
 
 1681  libusb_free_device_list(libusb_list, 0);
 
 1689static void request_free(
void* value)
 
 1691  ASYNC_TRANSFER_USER_DATA* user_data = NULL;
 
 1692  struct libusb_transfer* transfer = (
struct libusb_transfer*)value;
 
 1696  user_data = (ASYNC_TRANSFER_USER_DATA*)transfer->user_data;
 
 1697  async_transfer_user_data_free(user_data);
 
 1698  transfer->user_data = NULL;
 
 1699  libusb_free_transfer(transfer);
 
 1702static IUDEVICE* udev_init(
URBDRC_PLUGIN* urbdrc, libusb_context* context, LIBUSB_DEVICE* device,
 
 1703                           BYTE bus_number, BYTE dev_number)
 
 1706  int status = LIBUSB_ERROR_OTHER;
 
 1707  LIBUSB_DEVICE_DESCRIPTOR* devDescriptor = NULL;
 
 1708  LIBUSB_CONFIG_DESCRIPTOR* config_temp = NULL;
 
 1709  LIBUSB_INTERFACE_DESCRIPTOR interface_temp;
 
 1711  WINPR_ASSERT(urbdrc);
 
 1718  pdev->urbdrc = urbdrc;
 
 1719  udev_load_interface(pdev);
 
 1722    pdev->libusb_dev = device;
 
 1724    pdev->libusb_dev = udev_get_libusb_dev(context, bus_number, dev_number);
 
 1726  if (pdev->libusb_dev == NULL)
 
 1729  if (urbdrc->listener_callback)
 
 1730    udev_set_channelManager(&pdev->iface, urbdrc->listener_callback->channel_mgr);
 
 1733  status = udev_get_device_handle(urbdrc, context, pdev, bus_number, dev_number);
 
 1734  if (status != LIBUSB_SUCCESS)
 
 1736    struct libusb_device_descriptor desc;
 
 1737    const uint8_t port = libusb_get_port_number(pdev->libusb_dev);
 
 1738    libusb_get_device_descriptor(pdev->libusb_dev, &desc);
 
 1740    log_libusb_result(urbdrc->log, WLOG_ERROR,
 
 1741                      "libusb_open [b=0x%02X,p=0x%02X,a=0x%02X,VID=0x%04X,PID=0x%04X]", status,
 
 1742                      bus_number, port, dev_number, desc.idVendor, desc.idProduct);
 
 1747  status = udev_get_hub_handle(urbdrc, context, pdev, bus_number, dev_number);
 
 1750    pdev->hub_handle = NULL;
 
 1752  pdev->devDescriptor = udev_new_descript(urbdrc, pdev->libusb_dev);
 
 1754  if (!pdev->devDescriptor)
 
 1757  status = libusb_get_active_config_descriptor(pdev->libusb_dev, &pdev->LibusbConfig);
 
 1759  if (status == LIBUSB_ERROR_NOT_FOUND)
 
 1760    status = libusb_get_config_descriptor(pdev->libusb_dev, 0, &pdev->LibusbConfig);
 
 1764    log_libusb_result(urbdrc->log, WLOG_ERROR, 
"libusb_get_config_descriptor", status);
 
 1768  config_temp = pdev->LibusbConfig;
 
 1770  interface_temp = config_temp->interface[0].altsetting[0];
 
 1771  WLog_Print(urbdrc->log, WLOG_DEBUG,
 
 1772             "Registered Device: Vid: 0x%04" PRIX16 
" Pid: 0x%04" PRIX16 
"" 
 1773             " InterfaceClass = %s",
 
 1774             pdev->devDescriptor->idVendor, pdev->devDescriptor->idProduct,
 
 1775             usb_interface_class_to_string(interface_temp.bInterfaceClass));
 
 1777  devDescriptor = pdev->devDescriptor;
 
 1779  if ((devDescriptor->bNumConfigurations == 1) && (config_temp->bNumInterfaces > 1) &&
 
 1780      (devDescriptor->bDeviceClass == LIBUSB_CLASS_PER_INTERFACE))
 
 1782    pdev->isCompositeDevice = 1;
 
 1784  else if ((devDescriptor->bDeviceClass == 0xef) &&
 
 1785           (devDescriptor->bDeviceSubClass == LIBUSB_CLASS_COMM) &&
 
 1786           (devDescriptor->bDeviceProtocol == 0x01))
 
 1788    pdev->isCompositeDevice = 1;
 
 1791    pdev->isCompositeDevice = 0;
 
 1794  devDescriptor->bDeviceClass = interface_temp.bInterfaceClass;
 
 1795  devDescriptor->bDeviceSubClass = interface_temp.bInterfaceSubClass;
 
 1796  devDescriptor->bDeviceProtocol = interface_temp.bInterfaceProtocol;
 
 1798  pdev->bus_number = bus_number;
 
 1799  pdev->dev_number = dev_number;
 
 1800  pdev->request_queue = ArrayList_New(TRUE);
 
 1802  if (!pdev->request_queue)
 
 1805  ArrayList_Object(pdev->request_queue)->fnObjectFree = request_free;
 
 1808  pdev->MsConfig = msusb_msconfig_new();
 
 1810  if (!pdev->MsConfig)
 
 1814  return &pdev->iface;
 
 1816  pdev->iface.free(&pdev->iface);
 
 1820size_t udev_new_by_id(
URBDRC_PLUGIN* urbdrc, libusb_context* ctx, UINT16 idVendor, UINT16 idProduct,
 
 1821                      IUDEVICE*** devArray)
 
 1823  WINPR_ASSERT(urbdrc);
 
 1824  WINPR_ASSERT(devArray);
 
 1827  LIBUSB_DEVICE** libusb_list = NULL;
 
 1831  WLog_Print(urbdrc->log, WLOG_INFO, 
"VID: 0x%04" PRIX16 
", PID: 0x%04" PRIX16 
"", idVendor,
 
 1833  const ssize_t total_device = libusb_get_device_list(ctx, &libusb_list);
 
 1834  if (total_device < 0)
 
 1836    WLog_Print(urbdrc->log, WLOG_ERROR, 
"libusb_get_device_list -> [%" PRIdz 
"]", total_device);
 
 1839  if (total_device == 0)
 
 1841    WLog_Print(urbdrc->log, WLOG_WARN, 
"libusb_get_device_list -> [%" PRIdz 
"]", total_device);
 
 1850  for (ssize_t i = 0; i < total_device; i++)
 
 1852    LIBUSB_DEVICE* dev = libusb_list[i];
 
 1853    LIBUSB_DEVICE_DESCRIPTOR* descriptor = udev_new_descript(urbdrc, dev);
 
 1855    if ((descriptor->idVendor == idVendor) && (descriptor->idProduct == idProduct))
 
 1857      const uint8_t nr = libusb_get_bus_number(dev);
 
 1858      const uint8_t addr = libusb_get_device_address(dev);
 
 1859      array[num] = (
PUDEVICE)udev_init(urbdrc, ctx, dev, nr, addr);
 
 1861      if (array[num] != NULL)
 
 1865        WLog_Print(urbdrc->log, WLOG_WARN,
 
 1866                   "udev_init(nr=%" PRIu8 
", addr=%" PRIu8 
") failed", nr, addr);
 
 1870      libusb_unref_device(dev);
 
 1876  libusb_free_device_list(libusb_list, 0);
 
 1877  *devArray = (IUDEVICE**)array;
 
 1881IUDEVICE* udev_new_by_addr(
URBDRC_PLUGIN* urbdrc, libusb_context* context, BYTE bus_number,
 
 1884  WLog_Print(urbdrc->log, WLOG_DEBUG, 
"bus:%d dev:%d", bus_number, dev_number);
 
 1885  return udev_init(urbdrc, context, NULL, bus_number, dev_number);