VirtualBox

Changeset 53060 in vbox for trunk


Ignore:
Timestamp:
Oct 15, 2014 12:09:51 PM (11 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
96562
Message:

VUSBSniffer: Fixes

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Devices/USB/VUSBSniffer.cpp

    r53014 r53060  
    221221typedef DumpFileUsbHeaderLnxMmapped *PDumpFileUsbHeaderLnxMmapped;
    222222
     223AssertCompileSize(DumpFileUsbHeaderLnxMmapped, 64);
     224
    223225/**
    224226 * USB packet isochronous descriptor.
     
    291293
    292294/**
     295 * Adds new data to the current block.
     296 *
     297 * @returns VBox status code.
     298 * @param   pThis           The VUSB sniffer instance.
     299 * @param   pvData          The data to add.
     300 * @param   cbData          Amount of data to add.
     301 */
     302static int vusbSnifferBlockAddData(PVUSBSNIFFERINT pThis, const void *pvData, uint32_t cbData)
     303{
     304    int rc = VINF_SUCCESS;
     305
     306    Assert(pThis->cbBlockCur);
     307    AssertPtr(pThis->pBlockHdr);
     308
     309    void *pv = vusbSnifferBlockAllocSpace(pThis, cbData);
     310    if (pv)
     311        memcpy(pv, pvData, cbData);
     312    else
     313        rc = VERR_NO_MEMORY;
     314
     315    return rc;
     316}
     317
     318/**
    293319 * Commits the current block to the capture file.
    294320 *
     
    302328    AssertPtr(pThis->pBlockHdr);
    303329
    304     /* Update the block total length field. */
    305     uint32_t *pcbTotalLength = (uint32_t *)vusbSnifferBlockAllocSpace(pThis, 4);
    306     if (pcbTotalLength)
    307     {
    308         *pcbTotalLength = pThis->cbBlockCur;
    309         pThis->pBlockHdr->u32BlockTotalLength = pThis->cbBlockCur;
    310 
    311         /* Write the data. */
    312         rc = RTFileWrite(pThis->hFile, pThis->pbBlockData, pThis->cbBlockCur, NULL);
    313         pThis->cbBlockCur = 0;
    314         pThis->pBlockHdr  = NULL;
    315     }
    316     else
    317         rc = VERR_NO_MEMORY;
     330    /* Pad to 32bits. */
     331    uint8_t abPad[3] = { 0 };
     332    uint32_t cbPad = RT_ALIGN_32(pThis->cbBlockCur, 4) - pThis->cbBlockCur;
     333
     334    Assert(cbPad <= 3);
     335    if (cbPad)
     336        rc = vusbSnifferBlockAddData(pThis, abPad, cbPad);
     337
     338    if (RT_SUCCESS(rc))
     339    {
     340        /* Update the block total length field. */
     341        uint32_t *pcbTotalLength = (uint32_t *)vusbSnifferBlockAllocSpace(pThis, 4);
     342        if (pcbTotalLength)
     343        {
     344            *pcbTotalLength = pThis->cbBlockCur;
     345            pThis->pBlockHdr->u32BlockTotalLength = pThis->cbBlockCur;
     346
     347            /* Write the data. */
     348            rc = RTFileWrite(pThis->hFile, pThis->pbBlockData, pThis->cbBlockCur, NULL);
     349            pThis->cbBlockCur = 0;
     350            pThis->pBlockHdr  = NULL;
     351        }
     352        else
     353            rc = VERR_NO_MEMORY;
     354    }
    318355
    319356    return rc;
     
    338375    if (pThis->pBlockHdr)
    339376        memcpy(pThis->pBlockHdr, pBlockHdr, cbData);
    340     else
    341         rc = VERR_NO_MEMORY;
    342 
    343     return rc;
    344 }
    345 
    346 /**
    347  * Adds new data to the current block.
    348  *
    349  * @returns VBox status code.
    350  * @param   pThis           The VUSB sniffer instance.
    351  * @param   pvData          The data to add.
    352  * @param   cbData          Amount of data to add.
    353  */
    354 static int vusbSnifferBlockAddData(PVUSBSNIFFERINT pThis, const void *pvData, uint32_t cbData)
    355 {
    356     int rc = VINF_SUCCESS;
    357 
    358     Assert(pThis->cbBlockCur);
    359     AssertPtr(pThis->pBlockHdr);
    360 
    361     void *pv = vusbSnifferBlockAllocSpace(pThis, cbData);
    362     if (pv)
    363         memcpy(pv, pvData, cbData);
    364377    else
    365378        rc = VERR_NO_MEMORY;
     
    562575    Epb.u32TimestampHigh        = (u64TimestampEvent >> 32) & UINT32_C(0xffffffff);
    563576    Epb.u32TimestampLow         = u64TimestampEvent & UINT32_C(0xffffffff);
    564     Epb.u32CapturedLen          = sizeof(UsbHdr) + pUrb->cbData;
    565     Epb.u32PacketLen            = sizeof(UsbHdr) + pUrb->cbData;
    566577
    567578    UsbHdr.u64Id = (uint64_t)pUrb; /** @todo: check whether the pointer is a good ID. */
     
    601612
    602613    bool fRecordData = false;
     614    size_t cbUrbLength = 0;
    603615
    604616    if (   pUrb->cbData
     
    609621             || (   pUrb->enmDir == VUSBDIRECTION_IN
    610622                 && enmEvent == VUSBSNIFFEREVENT_COMPLETE)))
     623    {
     624        Epb.u32CapturedLen = sizeof(UsbHdr) + pUrb->cbData;
     625        Epb.u32PacketLen   = sizeof(UsbHdr) + pUrb->cbData;
    611626        fRecordData = true;
    612 
    613     UsbHdr.u8EndpointNumber = pUrb->EndPt | pUrb->enmDir == VUSBDIRECTION_IN ? 0x80 : 0x00;
     627    }
     628    else
     629    {
     630        Epb.u32CapturedLen = sizeof(UsbHdr);
     631        Epb.u32PacketLen   = sizeof(UsbHdr);
     632    }
     633
     634    if (pUrb->enmType == VUSBXFERTYPE_MSG || pUrb->enmType == VUSBXFERTYPE_CTRL)
     635    {
     636        PVUSBSETUP pSetup = (PVUSBSETUP)pUrb->abData;
     637        cbUrbLength = pSetup->wLength;
     638    }
     639    else
     640        cbUrbLength = pUrb->cbData;
     641
     642    UsbHdr.u8EndpointNumber = pUrb->EndPt | (pUrb->enmDir == VUSBDIRECTION_IN ? 0x80 : 0x00);
    614643    UsbHdr.u8DeviceAddress  = pUrb->DstAddress;
    615644    UsbHdr.u16BusId         = 0;
    616     UsbHdr.u8SetupFlag      = pUrb->enmType == VUSBXFERTYPE_MSG || pUrb->enmType == VUSBXFERTYPE_CTRL ? 0 : 1;
    617645    UsbHdr.u8DataFlag       = fRecordData ? 0 : 1;
    618646    UsbHdr.u64TimestampSec  = u64TimestampEvent / RT_NS_1SEC_64;;
    619647    UsbHdr.u32TimestampUSec = u64TimestampEvent / RT_NS_1US_64 - UsbHdr.u64TimestampSec * RT_US_1SEC;
    620648    UsbHdr.i32Status        = pUrb->enmStatus;
    621     UsbHdr.u32UrbLength     = pUrb->cbData;
     649    UsbHdr.u32UrbLength     = cbUrbLength;
    622650    UsbHdr.u32DataLength    = fRecordData ? pUrb->cbData : 0;
    623651    UsbHdr.i32Interval      = 0;
    624652    UsbHdr.i32StartFrame    = 0;
    625653    UsbHdr.u32XferFlags     = 0;
    626     UsbHdr.u32NumDesc       = pUrb->enmType == VUSBXFERTYPE_ISOC ? : 0;
    627 
    628     if (   pUrb->enmType == VUSBXFERTYPE_CTRL
    629         || pUrb->enmType == VUSBXFERTYPE_MSG)
     654    UsbHdr.u32NumDesc       = pUrb->enmType == VUSBXFERTYPE_ISOC ? pUrb->cIsocPkts : 0;
     655
     656    if (   (pUrb->enmType == VUSBXFERTYPE_MSG || pUrb->enmType == VUSBXFERTYPE_CTRL)
     657        && enmEvent == VUSBSNIFFEREVENT_SUBMIT)
    630658    {
    631659        PVUSBSETUP pSetup = (PVUSBSETUP)pUrb->abData;
     
    636664        UsbHdr.u.UsbSetup.wIndex        = pSetup->wIndex;
    637665        UsbHdr.u.UsbSetup.wLength       = pSetup->wLength;
    638     }
     666        UsbHdr.u8SetupFlag              = 0;
     667    }
     668    else
     669        UsbHdr.u8SetupFlag  = '-'; /* Follow usbmon source here. */
    639670
    640671    rc = vusbSnifferBlockNew(pThis, &Epb.Hdr, sizeof(Epb));
     
    642673        rc = vusbSnifferBlockAddData(pThis, &UsbHdr, sizeof(UsbHdr));
    643674
    644     /* Add Isochronous descriptors now. */
    645     for (unsigned i = 0; i < pUrb->cIsocPkts && RT_SUCCESS(rc); i++)
    646     {
    647         DumpFileUsbIsoDesc IsoDesc;
    648         IsoDesc.i32Status = pUrb->aIsocPkts[i].enmStatus;
    649         IsoDesc.u32Offset = pUrb->aIsocPkts[i].off;
    650         IsoDesc.u32Len    = pUrb->aIsocPkts[i].cb;
    651         rc = vusbSnifferBlockAddData(pThis, &IsoDesc, sizeof(IsoDesc));
     675    if (pUrb->enmType == VUSBXFERTYPE_ISOC)
     676    {
     677        /* Add Isochronous descriptors now. */
     678        for (unsigned i = 0; i < pUrb->cIsocPkts && RT_SUCCESS(rc); i++)
     679        {
     680            DumpFileUsbIsoDesc IsoDesc;
     681            IsoDesc.i32Status = pUrb->aIsocPkts[i].enmStatus;
     682            IsoDesc.u32Offset = pUrb->aIsocPkts[i].off;
     683            IsoDesc.u32Len    = pUrb->aIsocPkts[i].cb;
     684            rc = vusbSnifferBlockAddData(pThis, &IsoDesc, sizeof(IsoDesc));
     685        }
    652686    }
    653687
     
    658692
    659693    if (RT_SUCCESS(rc))
     694        rc = vusbSnifferAddOption(pThis, DUMPFILE_OPTION_CODE_END, NULL, 0);
     695
     696    if (RT_SUCCESS(rc))
    660697        rc = vusbSnifferBlockCommit(pThis);
    661698
Note: See TracChangeset for help on using the changeset viewer.

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