- Timestamp:
- Oct 15, 2014 5:00:50 PM (10 years ago)
- svn:sync-xref-src-repo-rev:
- 96576
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Devices/USB/VUSBSniffer.cpp
r53060 r53071 26 26 #include <iprt/string.h> 27 27 #include <iprt/system.h> 28 #include <iprt/semaphore.h> 28 29 29 30 #include "VUSBSniffer.h" … … 254 255 /** Pointer to the block data which will be written on commit. */ 255 256 uint8_t *pbBlockData; 257 /** Fast Mutex protecting the state against concurrent access. */ 258 RTSEMFASTMUTEX hMtx; 256 259 } VUSBSNIFFERINT; 257 260 /** Pointer to the internal VUSB sniffer state. */ … … 431 434 pThis->cbBlockMax = 0; 432 435 pThis->pbBlockData = NULL; 433 434 rc = RTFileOpen(&pThis->hFile, pszCaptureFilename, RTFILE_O_DENY_NONE | RTFILE_O_CREATE | RTFILE_O_WRITE | RTFILE_O_READ); 436 pThis->hMtx = NIL_RTSEMFASTMUTEX; 437 438 rc = RTSemFastMutexCreate(&pThis->hMtx); 435 439 if (RT_SUCCESS(rc)) 436 440 { 437 /* Write header and link type blocks. */ 438 DumpFileShb Shb; 439 440 Shb.Hdr.u32BlockType = DUMPFILE_SHB_BLOCK_TYPE; 441 Shb.Hdr.u32BlockTotalLength = 0; /* Filled out by lower layer. */ 442 Shb.u32ByteOrderMagic = DUMPFILE_SHB_BYTE_ORDER_MAGIC; 443 Shb.u16VersionMajor = DUMPFILE_SHB_VERSION_MAJOR; 444 Shb.u16VersionMinor = DUMPFILE_SHB_VERSION_MINOR; 445 Shb.u64SectionLength = UINT64_C(0xffffffffffffffff); /* -1 */ 446 447 /* Write the blocks. */ 448 rc = vusbSnifferBlockNew(pThis, &Shb.Hdr, sizeof(Shb)); 441 rc = RTFileOpen(&pThis->hFile, pszCaptureFilename, RTFILE_O_DENY_NONE | RTFILE_O_CREATE | RTFILE_O_WRITE | RTFILE_O_READ); 449 442 if (RT_SUCCESS(rc)) 450 443 { 451 const char *pszOpt = RTBldCfgTargetDotArch(); 452 rc = vusbSnifferAddOption(pThis, DUMPFILE_OPTION_CODE_HARDWARE, pszOpt, strlen(pszOpt) + 1); 453 } 454 455 if (RT_SUCCESS(rc)) 456 { 457 char szTmp[512]; 458 size_t cbTmp = sizeof(szTmp); 459 460 RT_ZERO(szTmp); 461 462 /* Build the OS code. */ 463 rc = RTSystemQueryOSInfo(RTSYSOSINFO_PRODUCT, szTmp, cbTmp); 444 /* Write header and link type blocks. */ 445 DumpFileShb Shb; 446 447 Shb.Hdr.u32BlockType = DUMPFILE_SHB_BLOCK_TYPE; 448 Shb.Hdr.u32BlockTotalLength = 0; /* Filled out by lower layer. */ 449 Shb.u32ByteOrderMagic = DUMPFILE_SHB_BYTE_ORDER_MAGIC; 450 Shb.u16VersionMajor = DUMPFILE_SHB_VERSION_MAJOR; 451 Shb.u16VersionMinor = DUMPFILE_SHB_VERSION_MINOR; 452 Shb.u64SectionLength = UINT64_C(0xffffffffffffffff); /* -1 */ 453 454 /* Write the blocks. */ 455 rc = vusbSnifferBlockNew(pThis, &Shb.Hdr, sizeof(Shb)); 464 456 if (RT_SUCCESS(rc)) 465 457 { 466 size_t cb = strlen(szTmp); 467 468 szTmp[cb] = ' '; 469 rc = RTSystemQueryOSInfo(RTSYSOSINFO_RELEASE, &szTmp[cb + 1], cbTmp - (cb + 1)); 458 const char *pszOpt = RTBldCfgTargetDotArch(); 459 rc = vusbSnifferAddOption(pThis, DUMPFILE_OPTION_CODE_HARDWARE, pszOpt, strlen(pszOpt) + 1); 460 } 461 462 if (RT_SUCCESS(rc)) 463 { 464 char szTmp[512]; 465 size_t cbTmp = sizeof(szTmp); 466 467 RT_ZERO(szTmp); 468 469 /* Build the OS code. */ 470 rc = RTSystemQueryOSInfo(RTSYSOSINFO_PRODUCT, szTmp, cbTmp); 470 471 if (RT_SUCCESS(rc)) 471 472 { 472 cb = strlen(szTmp); 473 size_t cb = strlen(szTmp); 474 473 475 szTmp[cb] = ' '; 474 rc = RTSystemQueryOSInfo(RTSYSOSINFO_VERSION, &szTmp[cb + 1], cbTmp - (cb + 1)); 476 rc = RTSystemQueryOSInfo(RTSYSOSINFO_RELEASE, &szTmp[cb + 1], cbTmp - (cb + 1)); 477 if (RT_SUCCESS(rc)) 478 { 479 cb = strlen(szTmp); 480 szTmp[cb] = ' '; 481 rc = RTSystemQueryOSInfo(RTSYSOSINFO_VERSION, &szTmp[cb + 1], cbTmp - (cb + 1)); 482 } 475 483 } 484 485 if (RT_SUCCESS(rc) || rc == VERR_BUFFER_OVERFLOW) 486 rc = vusbSnifferAddOption(pThis, DUMPFILE_OPTION_CODE_OS, szTmp, strlen(szTmp) + 1); 487 else 488 rc = VINF_SUCCESS; /* Skip OS code if building the string failed. */ 476 489 } 477 490 478 if (RT_SUCCESS(rc) || rc == VERR_BUFFER_OVERFLOW)479 rc = vusbSnifferAddOption(pThis, DUMPFILE_OPTION_CODE_OS, szTmp, strlen(szTmp) + 1);480 else481 rc = VINF_SUCCESS; /* Skip OS code if building the string failed. */482 }483 484 if (RT_SUCCESS(rc))485 {486 /** @todo: Add product info. */487 }488 489 if (RT_SUCCESS(rc))490 rc = vusbSnifferAddOption(pThis, DUMPFILE_OPTION_CODE_END, NULL, 0);491 if (RT_SUCCESS(rc))492 rc = vusbSnifferBlockCommit(pThis);493 494 /* Write Interface descriptor block. */495 if (RT_SUCCESS(rc))496 {497 DumpFileIdb Idb;498 499 Idb.Hdr.u32BlockType = DUMPFILE_IDB_BLOCK_TYPE;500 Idb.Hdr.u32BlockTotalLength = 0; /* Filled out by lower layer. */501 Idb.u16LinkType = DUMPFILE_IDB_LINK_TYPE_USB_LINUX_MMAPED;502 Idb.u16Reserved = 0;503 Idb.u32SnapLen = UINT32_C(0xffffffff);504 505 rc = vusbSnifferBlockNew(pThis, &Idb.Hdr, sizeof(Idb));506 491 if (RT_SUCCESS(rc)) 507 492 { 508 uint8_t u8TsResolution = 9; /* Nano second resolution. */ 509 /* Add timestamp resolution option. */ 510 rc = vusbSnifferAddOption(pThis, DUMPFILE_IDB_OPTION_TS_RESOLUTION, 511 &u8TsResolution, sizeof(u8TsResolution)); 493 /** @todo: Add product info. */ 512 494 } 495 513 496 if (RT_SUCCESS(rc)) 514 497 rc = vusbSnifferAddOption(pThis, DUMPFILE_OPTION_CODE_END, NULL, 0); 515 498 if (RT_SUCCESS(rc)) 516 499 rc = vusbSnifferBlockCommit(pThis); 500 501 /* Write Interface descriptor block. */ 502 if (RT_SUCCESS(rc)) 503 { 504 DumpFileIdb Idb; 505 506 Idb.Hdr.u32BlockType = DUMPFILE_IDB_BLOCK_TYPE; 507 Idb.Hdr.u32BlockTotalLength = 0; /* Filled out by lower layer. */ 508 Idb.u16LinkType = DUMPFILE_IDB_LINK_TYPE_USB_LINUX_MMAPED; 509 Idb.u16Reserved = 0; 510 Idb.u32SnapLen = UINT32_C(0xffffffff); 511 512 rc = vusbSnifferBlockNew(pThis, &Idb.Hdr, sizeof(Idb)); 513 if (RT_SUCCESS(rc)) 514 { 515 uint8_t u8TsResolution = 9; /* Nano second resolution. */ 516 /* Add timestamp resolution option. */ 517 rc = vusbSnifferAddOption(pThis, DUMPFILE_IDB_OPTION_TS_RESOLUTION, 518 &u8TsResolution, sizeof(u8TsResolution)); 519 } 520 if (RT_SUCCESS(rc)) 521 rc = vusbSnifferAddOption(pThis, DUMPFILE_OPTION_CODE_END, NULL, 0); 522 if (RT_SUCCESS(rc)) 523 rc = vusbSnifferBlockCommit(pThis); 524 } 525 526 if (RT_SUCCESS(rc)) 527 { 528 *phSniffer = pThis; 529 return VINF_SUCCESS; 530 } 531 532 RTFileClose(pThis->hFile); 533 pThis->hFile = NIL_RTFILE; 534 RTFileDelete(pszCaptureFilename); 517 535 } 518 519 if (RT_SUCCESS(rc)) 520 { 521 *phSniffer = pThis; 522 return VINF_SUCCESS; 523 } 524 525 RTFileClose(pThis->hFile); 526 pThis->hFile = NIL_RTFILE; 527 RTFileDelete(pszCaptureFilename); 536 RTSemFastMutexDestroy(pThis->hMtx); 528 537 } 529 538 VUSBSnifferDestroy(pThis); … … 545 554 PVUSBSNIFFERINT pThis = hSniffer; 546 555 556 int rc = RTSemFastMutexRequest(pThis->hMtx); 557 AssertRC(rc); 558 547 559 if (pThis->hFile != NIL_RTFILE) 548 560 RTFileClose(pThis->hFile); 549 561 if (pThis->pbBlockData) 550 562 RTMemFree(pThis->pbBlockData); 563 564 RTSemFastMutexRelease(pThis->hMtx); 565 RTSemFastMutexDestroy(pThis->hMtx); 551 566 RTMemFree(pThis); 552 567 } … … 669 684 UsbHdr.u8SetupFlag = '-'; /* Follow usbmon source here. */ 670 685 671 rc = vusbSnifferBlockNew(pThis, &Epb.Hdr, sizeof(Epb)); 686 /* Write the packet to the capture file. */ 687 rc = RTSemFastMutexRequest(pThis->hMtx); 672 688 if (RT_SUCCESS(rc)) 673 rc = vusbSnifferBlockAddData(pThis, &UsbHdr, sizeof(UsbHdr));674 675 if (pUrb->enmType == VUSBXFERTYPE_ISOC)676 {677 /* Add Isochronous descriptors now. */ 678 for (unsigned i = 0; i < pUrb->cIsocPkts && RT_SUCCESS(rc); i++)689 { 690 rc = vusbSnifferBlockNew(pThis, &Epb.Hdr, sizeof(Epb)); 691 if (RT_SUCCESS(rc)) 692 rc = vusbSnifferBlockAddData(pThis, &UsbHdr, sizeof(UsbHdr)); 693 694 if (pUrb->enmType == VUSBXFERTYPE_ISOC) 679 695 { 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)); 696 /* Add Isochronous descriptors now. */ 697 for (unsigned i = 0; i < pUrb->cIsocPkts && RT_SUCCESS(rc); i++) 698 { 699 DumpFileUsbIsoDesc IsoDesc; 700 IsoDesc.i32Status = pUrb->aIsocPkts[i].enmStatus; 701 IsoDesc.u32Offset = pUrb->aIsocPkts[i].off; 702 IsoDesc.u32Len = pUrb->aIsocPkts[i].cb; 703 rc = vusbSnifferBlockAddData(pThis, &IsoDesc, sizeof(IsoDesc)); 704 } 685 705 } 686 } 687 688 /* Record data. */ 689 if ( RT_SUCCESS(rc) 690 && fRecordData) 691 rc = vusbSnifferBlockAddData(pThis, pUrb->abData, pUrb->cbData); 692 693 if (RT_SUCCESS(rc)) 694 rc = vusbSnifferAddOption(pThis, DUMPFILE_OPTION_CODE_END, NULL, 0); 695 696 if (RT_SUCCESS(rc)) 697 rc = vusbSnifferBlockCommit(pThis); 706 707 /* Record data. */ 708 if ( RT_SUCCESS(rc) 709 && fRecordData) 710 rc = vusbSnifferBlockAddData(pThis, pUrb->abData, pUrb->cbData); 711 712 if (RT_SUCCESS(rc)) 713 rc = vusbSnifferAddOption(pThis, DUMPFILE_OPTION_CODE_END, NULL, 0); 714 715 if (RT_SUCCESS(rc)) 716 rc = vusbSnifferBlockCommit(pThis); 717 718 RTSemFastMutexRelease(pThis->hMtx); 719 } 698 720 699 721 return rc;
Note:
See TracChangeset
for help on using the changeset viewer.