Changeset 62702 in vbox for trunk/src/VBox/HostDrivers/VBoxUSB/win
- Timestamp:
- Jul 29, 2016 7:54:03 PM (9 years ago)
- svn:sync-xref-src-repo-rev:
- 109276
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/HostDrivers/VBoxUSB/win/dev/VBoxUsbRt.cpp
r62490 r62702 3 3 * VBox USB R0 runtime 4 4 */ 5 5 6 /* 6 7 * Copyright (C) 2011-2016 Oracle Corporation … … 15 16 */ 16 17 18 /********************************************************************************************************************************* 19 * Header Files * 20 *********************************************************************************************************************************/ 17 21 #include "VBoxUsbCmn.h" 18 22 #include "../cmn/VBoxUsbIdc.h" … … 22 26 #include <iprt/assert.h> 23 27 #include <VBox/log.h> 24 #define _USBD_ 28 29 30 /********************************************************************************************************************************* 31 * Defined Constants And Macros * 32 *********************************************************************************************************************************/ 33 #define _USBD_ /** @todo r=bird: What is this?? */ 25 34 26 35 #define USBD_DEFAULT_PIPE_TRANSFER 0x00000008 … … 28 37 #define VBOXUSB_MAGIC 0xABCF1423 29 38 39 /********************************************************************************************************************************* 40 * Structures and Typedefs * 41 *********************************************************************************************************************************/ 30 42 typedef struct VBOXUSB_URB_CONTEXT 31 43 { … … 47 59 } VBOXUSB_SETUP, *PVBOXUSB_SETUP; 48 60 61 62 49 63 static bool vboxUsbRtCtxSetOwner(PVBOXUSBDEV_EXT pDevExt, PFILE_OBJECT pFObj) 50 64 { 51 bool bRc = ASMAtomicCmpXchgPtr(&pDevExt->Rt.pOwner, pFObj, NULL); 52 if (bRc) 53 { 65 bool fRc = ASMAtomicCmpXchgPtr(&pDevExt->Rt.pOwner, pFObj, NULL); 66 if (fRc) 54 67 LogFunc(("pDevExt (0x%x) Owner(0x%x) acquired\n", pFObj)); 55 }56 68 else 57 {58 69 LogFunc(("pDevExt (0x%x) Owner(0x%x) FAILED!!\n", pFObj)); 59 } 60 return bRc; 70 return fRc; 61 71 } 62 72 63 73 static bool vboxUsbRtCtxReleaseOwner(PVBOXUSBDEV_EXT pDevExt, PFILE_OBJECT pFObj) 64 74 { 65 bool bRc = ASMAtomicCmpXchgPtr(&pDevExt->Rt.pOwner, NULL, pFObj); 66 if (bRc) 67 { 75 bool fRc = ASMAtomicCmpXchgPtr(&pDevExt->Rt.pOwner, NULL, pFObj); 76 if (fRc) 68 77 LogFunc(("pDevExt (0x%x) Owner(0x%x) released\n", pFObj)); 69 }70 78 else 71 {72 79 LogFunc(("pDevExt (0x%x) Owner(0x%x) release: is NOT an owner\n", pFObj)); 73 } 74 return bRc; 80 return fRc; 75 81 } 76 82 … … 100 106 if (NT_SUCCESS(Status)) 101 107 { 102 if (Version.u32Major == VBOXUSBIDC_VERSION_MAJOR 103 && Version.u32Minor >= VBOXUSBIDC_VERSION_MINOR) 108 if ( Version.u32Major == VBOXUSBIDC_VERSION_MAJOR 109 #if VBOXUSBIDC_VERSION_MINOR != 0 110 && Version.u32Minor >= VBOXUSBIDC_VERSION_MINOR 111 #endif 112 ) 104 113 return STATUS_SUCCESS; 105 114 AssertFailed(); … … 408 417 { 409 418 vboxUsbRtFreeCachedDescriptors(pDevExt); 410 bool bRc = vboxUsbRtCtxReleaseOwner(pDevExt, pFObj);411 Assert( bRc);419 bool fRc = vboxUsbRtCtxReleaseOwner(pDevExt, pFObj); 420 Assert(fRc); NOREF(fRc); 412 421 } 413 422 else … … 464 473 { 465 474 PIO_STACK_LOCATION pSl = IoGetCurrentIrpStackLocation(pIrp); 466 PUSBSUP_GETDEV pDev = (PUSBSUP_GETDEV)pIrp->AssociatedIrp.SystemBuffer; 467 NTSTATUS Status = STATUS_SUCCESS; 475 PUSBSUP_GETDEV pDev = (PUSBSUP_GETDEV)pIrp->AssociatedIrp.SystemBuffer; 468 476 ULONG cbOut = 0; 469 477 470 478 /* don't check for owner since this request is allowed for non-owners as well */ 471 472 if (pDev && pSl->Parameters.DeviceIoControl.InputBufferLength == sizeof (*pDev) 473 && pSl->Parameters.DeviceIoControl.OutputBufferLength == sizeof (*pDev)) 479 NTSTATUS Status; 480 if ( pDev 481 && pSl->Parameters.DeviceIoControl.InputBufferLength == sizeof(*pDev) 482 && pSl->Parameters.DeviceIoControl.OutputBufferLength == sizeof(*pDev)) 474 483 { 475 484 Status = VBoxUsbToolGetDeviceSpeed(pDevExt->pLowerDO, &pDevExt->Rt.fIsHighSpeed); … … 483 492 } 484 493 else 485 {486 494 Status = STATUS_INVALID_PARAMETER; 487 }488 495 489 496 Assert(Status != STATUS_PENDING); … … 495 502 static NTSTATUS vboxUsbRtDispatchUsbReset(PVBOXUSBDEV_EXT pDevExt, PIRP pIrp) 496 503 { 497 PIO_STACK_LOCATION pSl = IoGetCurrentIrpStackLocation(pIrp); 498 PFILE_OBJECT pFObj = pSl->FileObject; 499 PUSBSUP_GETDEV pDev = (PUSBSUP_GETDEV)pIrp->AssociatedIrp.SystemBuffer; 500 NTSTATUS Status = STATUS_SUCCESS; 501 502 do 503 { 504 if (!pFObj) 504 PIO_STACK_LOCATION pSl = IoGetCurrentIrpStackLocation(pIrp); 505 PFILE_OBJECT pFObj = pSl->FileObject; 506 NTSTATUS rcNt; 507 if (pFObj) 508 { 509 if (vboxUsbRtCtxIsOwner(pDevExt, pFObj)) 510 { 511 if ( pIrp->AssociatedIrp.SystemBuffer == NULL 512 && pSl->Parameters.DeviceIoControl.InputBufferLength == 0 513 && pSl->Parameters.DeviceIoControl.OutputBufferLength == 0) 514 { 515 rcNt = VBoxUsbToolIoInternalCtlSendSync(pDevExt->pLowerDO, IOCTL_INTERNAL_USB_RESET_PORT, NULL, NULL); 516 Assert(NT_SUCCESS(rcNt)); 517 } 518 else 519 { 520 AssertFailed(); 521 rcNt = STATUS_INVALID_PARAMETER; 522 } 523 } 524 else 505 525 { 506 526 AssertFailed(); 507 Status = STATUS_INVALID_PARAMETER; 508 break; 509 } 510 511 if (!vboxUsbRtCtxIsOwner(pDevExt, pFObj)) 512 { 513 AssertFailed(); 514 Status = STATUS_ACCESS_DENIED; 515 break; 516 } 517 518 if (pIrp->AssociatedIrp.SystemBuffer 519 || pSl->Parameters.DeviceIoControl.InputBufferLength 520 || pSl->Parameters.DeviceIoControl.OutputBufferLength) 521 { 522 AssertFailed(); 523 Status = STATUS_INVALID_PARAMETER; 524 break; 525 } 526 527 Status = VBoxUsbToolIoInternalCtlSendSync(pDevExt->pLowerDO, IOCTL_INTERNAL_USB_RESET_PORT, NULL, NULL); 528 Assert(NT_SUCCESS(Status)); 529 } while (0); 530 531 Assert(Status != STATUS_PENDING); 532 VBoxDrvToolIoComplete(pIrp, Status, 0); 527 rcNt = STATUS_ACCESS_DENIED; 528 } 529 } 530 else 531 { 532 AssertFailed(); 533 rcNt = STATUS_INVALID_PARAMETER; 534 } 535 536 Assert(rcNt != STATUS_PENDING); 537 VBoxDrvToolIoComplete(pIrp, rcNt, 0); 533 538 vboxUsbDdiStateRelease(pDevExt); 534 return Status;539 return rcNt; 535 540 } 536 541 … … 770 775 NTSTATUS Status = STATUS_SUCCESS; 771 776 PURB pUrb; 772 PUSBD_INTERFACE_INFORMATION pNewIFInfo ;773 VBOXUSB_PIPE_INFO *pNewPipeInfo ;777 PUSBD_INTERFACE_INFORMATION pNewIFInfo = NULL; 778 VBOXUSB_PIPE_INFO *pNewPipeInfo = NULL; 774 779 775 780 if (pDevExt->Rt.pVBIfaceInfo[InterfaceNumber].pInterfaceInfo) … … 898 903 { 899 904 if (EndPointAddress == 0) 900 {901 905 return pDevExt->Rt.hPipe0; 902 }903 906 904 907 for (ULONG i = 0; i < pDevExt->Rt.uNumInterfaces; i++) … … 1026 1029 static NTSTATUS vboxUsbRtUrbSendCompletion(PDEVICE_OBJECT pDevObj, IRP *pIrp, void *pvContext) 1027 1030 { 1031 RT_NOREF1(pDevObj); 1032 1028 1033 if (!pvContext) 1029 1034 { … … 1076 1081 default: 1077 1082 pUrbInfo->error = USBSUP_XFER_DNR; 1078 break;1083 break; 1079 1084 } 1080 1085 … … 1300 1305 * data length is therefore pUrb->len - 8 1301 1306 */ 1302 PVBOXUSB_SETUP pSetup = (PVBOXUSB_SETUP)pUrb->UrbControlTransfer.SetupPacket;1307 //PVBOXUSB_SETUP pSetup = (PVBOXUSB_SETUP)pUrb->UrbControlTransfer.SetupPacket; 1303 1308 memcpy(pUrb->UrbControlTransfer.SetupPacket, pBuffer, min(sizeof (pUrb->UrbControlTransfer.SetupPacket), pUrbInfo->len)); 1304 1309 … … 1488 1493 NTSTATUS Status = STATUS_SUCCESS; 1489 1494 1490 if (pVer && pSl->Parameters.DeviceIoControl.InputBufferLength == 0 1491 && pSl->Parameters.DeviceIoControl.OutputBufferLength == sizeof (*pVer)) 1495 if ( pVer 1496 && pSl->Parameters.DeviceIoControl.InputBufferLength == 0 1497 && pSl->Parameters.DeviceIoControl.OutputBufferLength == sizeof(*pVer)) 1492 1498 { 1493 1499 pVer->u32Major = USBDRV_MAJOR_VERSION; … … 1515 1521 DECLHIDDEN(NTSTATUS) vboxUsbRtCreate(PVBOXUSBDEV_EXT pDevExt, PIRP pIrp) 1516 1522 { 1523 RT_NOREF1(pDevExt); 1517 1524 PIO_STACK_LOCATION pSl = IoGetCurrentIrpStackLocation(pIrp); 1518 1525 PFILE_OBJECT pFObj = pSl->FileObject; 1519 if (!pFObj) 1520 { 1521 AssertFailed(); 1522 return STATUS_INVALID_PARAMETER; 1523 } 1524 1526 AssertReturn(pFObj, STATUS_INVALID_PARAMETER); 1525 1527 return STATUS_SUCCESS; 1526 1528 } … … 1543 1545 { 1544 1546 case SUPUSB_IOCTL_USB_CLAIM_DEVICE: 1545 {1546 1547 return vboxUsbRtDispatchClaimDevice(pDevExt, pIrp); 1547 } 1548 1548 1549 case SUPUSB_IOCTL_USB_RELEASE_DEVICE: 1549 {1550 1550 return vboxUsbRtDispatchReleaseDevice(pDevExt, pIrp); 1551 } 1551 1552 1552 case SUPUSB_IOCTL_GET_DEVICE: 1553 {1554 1553 return vboxUsbRtDispatchGetDevice(pDevExt, pIrp); 1555 } 1554 1556 1555 case SUPUSB_IOCTL_USB_RESET: 1557 {1558 1556 return vboxUsbRtDispatchUsbReset(pDevExt, pIrp); 1559 } 1557 1560 1558 case SUPUSB_IOCTL_USB_SET_CONFIG: 1561 {1562 1559 return vboxUsbRtDispatchUsbSetConfig(pDevExt, pIrp); 1563 } 1560 1564 1561 case SUPUSB_IOCTL_USB_SELECT_INTERFACE: 1565 {1566 1562 return vboxUsbRtDispatchUsbSelectInterface(pDevExt, pIrp); 1567 } 1563 1568 1564 case SUPUSB_IOCTL_USB_CLEAR_ENDPOINT: 1569 {1570 1565 return vboxUsbRtDispatchUsbClearEndpoint(pDevExt, pIrp); 1571 } 1566 1572 1567 case SUPUSB_IOCTL_USB_ABORT_ENDPOINT: 1573 {1574 1568 return vboxUsbRtDispatchUsbAbortEndpoint(pDevExt, pIrp); 1575 } 1569 1576 1570 case SUPUSB_IOCTL_SEND_URB: 1577 {1578 1571 return vboxUsbRtDispatchSendUrb(pDevExt, pIrp); 1579 } 1572 1580 1573 case SUPUSB_IOCTL_IS_OPERATIONAL: 1581 {1582 1574 return vboxUsbRtDispatchIsOperational(pDevExt, pIrp); 1583 } 1575 1584 1576 case SUPUSB_IOCTL_GET_VERSION: 1585 {1586 1577 return vboxUsbRtDispatchGetVersion(pDevExt, pIrp); 1587 } 1578 1588 1579 default: 1589 {1590 1580 return vboxUsbRtDispatchDefault(pDevExt, pIrp); 1591 } 1592 } 1593 } 1581 } 1582 }
Note:
See TracChangeset
for help on using the changeset viewer.