VirtualBox

Changeset 66989 in vbox for trunk/src/VBox


Ignore:
Timestamp:
May 19, 2017 2:42:59 PM (8 years ago)
Author:
vboxsync
Message:

VUSB: Collect opaque class-specific data between config and interface descriptors. See bugref:8769

Location:
trunk/src/VBox/Devices
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Devices/Input/UsbKbd.cpp

    r65919 r66989  
    346346    },
    347347    NULL,                           /* pvMore */
     348    NULL,                           /* pvClass */
     349    0,                              /* cbClass */
    348350    &g_aUsbHidInterfaces[0],
    349351    NULL                            /* pvOriginal */
  • trunk/src/VBox/Devices/Input/UsbMouse.cpp

    r65919 r66989  
    858858    },
    859859    NULL,                           /* pvMore */
     860    NULL,                           /* pvClass */
     861    0,                              /* cbClass */
    860862    &g_aUsbHidMInterfaces[0],
    861863    NULL                            /* pvOriginal */
     
    875877    },
    876878    NULL,                           /* pvMore */
     879    NULL,                           /* pvClass */
     880    0,                              /* cbClass */
    877881    &g_aUsbHidTInterfaces[0],
    878882    NULL                            /* pvOriginal */
     
    892896    },
    893897    NULL,                           /* pvMore */
     898    NULL,                           /* pvClass */
     899    0,                              /* cbClass */
    894900    &g_aUsbHidMTInterfaces[0],
    895901    NULL                            /* pvOriginal */
  • trunk/src/VBox/Devices/Storage/UsbMsd.cpp

    r65921 r66989  
    482482    },
    483483    NULL,                           /* pvMore */
     484    NULL,                           /* pvClass */
     485    0,                              /* cbClass */
    484486    &g_aUsbMsdInterfacesFS[0],
    485487    NULL                            /* pvOriginal */
     
    499501    },
    500502    NULL,                           /* pvMore */
     503    NULL,                           /* pvClass */
     504    0,                              /* cbClass */
    501505    &g_aUsbMsdInterfacesHS[0],
    502506    NULL                            /* pvOriginal */
     
    516520    },
    517521    NULL,                           /* pvMore */
     522    NULL,                           /* pvClass */
     523    0,                              /* cbClass */
    518524    &g_aUsbMsdInterfacesSS[0],
    519525    NULL                            /* pvOriginal */
  • trunk/src/VBox/Devices/USB/USBProxyDevice.cpp

    r66913 r66989  
    319319}
    320320
    321 /* Given the pointer to an interface or endpoint descriptor, find any following
     321/* Given the pointer to a configuration/interface/endpoint descriptor, find any following
    322322 * non-standard (vendor or class) descriptors.
    323323 */
     
    327327    uint8_t type;
    328328
    329     Assert(*(this_desc + 1) == VUSB_DT_INTERFACE || *(this_desc + 1) == VUSB_DT_ENDPOINT);
     329    Assert(*(this_desc + 1) == VUSB_DT_INTERFACE || *(this_desc + 1) == VUSB_DT_ENDPOINT || *(this_desc + 1) == VUSB_DT_CONFIG);
    330330    buf = this_desc;
    331331
    332     /* Skip the current interface/endpoint descriptor. */
     332    /* Skip the current configuration/interface/endpoint descriptor. */
    333333    buf += *(uint8_t *)buf;
    334334
     
    468468    size_t cbIface;
    469469    uint32_t i, x;
     470    uint8_t *tmp, *end;
    470471
    471472    descs = GetStdDescSync(pProxyDev, VUSB_DT_CONFIG, idx, 0, VUSB_DT_CONFIG_MIN_LEN);
     
    514515    out->Core.bmAttributes = cfg->bmAttributes;
    515516    out->Core.MaxPower = cfg->MaxPower;
     517
     518    tmp = (uint8_t *)out->pvOriginal;
     519    end = tmp + tot_len;
     520
     521    /* Point to additional configuration descriptor bytes, if any. */
     522    AssertCompile(sizeof(out->Core) == VUSB_DT_CONFIG_MIN_LEN);
     523    if (out->Core.bLength - VUSB_DT_CONFIG_MIN_LEN > 0)
     524        out->pvMore = tmp + VUSB_DT_CONFIG_MIN_LEN;
     525    else
     526        out->pvMore = NULL;
     527
     528    /* Typically there might be an interface association descriptor here. */
     529    out->pvClass = collect_stray_bits(tmp, end, &out->cbClass);
    516530
    517531    for(i=0; i < 4; i++)
  • trunk/src/VBox/Devices/USB/VUSBDevice.cpp

    r65976 r66989  
    714714    VUSBDESCCONFIG CfgDesc;
    715715    memcpy(&CfgDesc, pCfgDesc, VUSB_DT_CONFIG_MIN_LEN);
    716     uint32_t cbTotal = pCfgDesc->Core.bLength;
     716    uint32_t cbTotal = 0;
     717    cbTotal += pCfgDesc->Core.bLength;
     718    cbTotal += pCfgDesc->cbClass;
    717719    for (unsigned i = 0; i < pCfgDesc->Core.bNumInterfaces; i++)
    718720    {
     
    738740    COPY_DATA(pbBuf, cbLeft, &CfgDesc, VUSB_DT_CONFIG_MIN_LEN);
    739741    COPY_DATA(pbBuf, cbLeft, pCfgDesc->pvMore, pCfgDesc->Core.bLength - VUSB_DT_CONFIG_MIN_LEN);
     742    COPY_DATA(pbBuf, cbLeft, pCfgDesc->pvClass, pCfgDesc->cbClass);
    740743
    741744    /*
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette