static NTSTATUS vboxUsbPnPMnQueryCapabilities(PVBOXUSBDEV_EXT pDevExt, PIRP pIrp) { PIO_STACK_LOCATION pSl = IoGetCurrentIrpStackLocation(pIrp); PDEVICE_CAPABILITIES pDevCaps = pSl->Parameters.DeviceCapabilities.Capabilities; if (pDevCaps->Version < 1 || pDevCaps->Size < sizeof (*pDevCaps)) { Assert(0); /* todo: return more appropriate status ?? */ return STATUS_UNSUCCESSFUL; } pDevCaps->SurpriseRemovalOK = TRUE; pIrp->IoStatus.Status = STATUS_SUCCESS; IoCopyCurrentIrpStackLocationToNext(pIrp); NTSTATUS Status = VBoxDrvToolIoPostSync(pDevExt->pLowerDO, pIrp); Assert(NT_SUCCESS(Status)); if (NT_SUCCESS(Status)) { pDevCaps->SurpriseRemovalOK = 1; pDevExt->DdiState.DevCaps = *pDevCaps; } VBoxDrvToolIoComplete(pIrp, Status, 0); vboxUsbDdiStateRelease(pDevExt); return Status; }
VBOXUSBTOOL_DECL(NTSTATUS) VBoxUsbToolGetDeviceSpeed(PDEVICE_OBJECT pDevObj, BOOLEAN *pbIsHigh) { Assert(pbIsHigh); *pbIsHigh = FALSE; PIRP pIrp = IoAllocateIrp(pDevObj->StackSize, FALSE); Assert(pIrp); if (!pIrp) { return STATUS_INSUFFICIENT_RESOURCES; } USB_BUS_INTERFACE_USBDI_V1 BusIf; PIO_STACK_LOCATION pSl = IoGetNextIrpStackLocation(pIrp); pSl->MajorFunction = IRP_MJ_PNP; pSl->MinorFunction = IRP_MN_QUERY_INTERFACE; pSl->Parameters.QueryInterface.InterfaceType = &USB_BUS_INTERFACE_USBDI_GUID; pSl->Parameters.QueryInterface.Size = sizeof (BusIf); pSl->Parameters.QueryInterface.Version = USB_BUSIF_USBDI_VERSION_1; pSl->Parameters.QueryInterface.Interface = (PINTERFACE)&BusIf; pSl->Parameters.QueryInterface.InterfaceSpecificData = NULL; pIrp->IoStatus.Status = STATUS_NOT_SUPPORTED; NTSTATUS Status = VBoxDrvToolIoPostSync(pDevObj, pIrp); Assert(NT_SUCCESS(Status) || Status == STATUS_NOT_SUPPORTED); if (NT_SUCCESS(Status)) { *pbIsHigh = BusIf.IsDeviceHighSpeed(BusIf.BusContext); BusIf.InterfaceDereference(BusIf.BusContext); } IoFreeIrp(pIrp); return Status; }
static NTSTATUS vboxUsbPnPMnCancelStopDevice(PVBOXUSBDEV_EXT pDevExt, PIRP pIrp) { ENMVBOXUSB_PNPSTATE enmState = vboxUsbPnPStateGet(pDevExt); NTSTATUS Status = STATUS_SUCCESS; IoCopyCurrentIrpStackLocationToNext(pIrp); Status = VBoxDrvToolIoPostSync(pDevExt->pLowerDO, pIrp); if (NT_SUCCESS(Status) && enmState == ENMVBOXUSB_PNPSTATE_STOP_PENDING) { vboxUsbPnPStateRestore(pDevExt); } Status = STATUS_SUCCESS; VBoxDrvToolIoComplete(pIrp, Status, 0); vboxUsbDdiStateRelease(pDevExt); return Status; }
static NTSTATUS vboxUsbPnPMnStartDevice(PVBOXUSBDEV_EXT pDevExt, PIRP pIrp) { IoCopyCurrentIrpStackLocationToNext(pIrp); NTSTATUS Status = VBoxDrvToolIoPostSync(pDevExt->pLowerDO, pIrp); Assert(NT_SUCCESS(Status) || Status == STATUS_NOT_SUPPORTED); if (NT_SUCCESS(Status)) { Status = vboxUsbRtStart(pDevExt); Assert(Status == STATUS_SUCCESS); if (NT_SUCCESS(Status)) { vboxUsbPnPStateSet(pDevExt, ENMVBOXUSB_PNPSTATE_STARTED); } } VBoxDrvToolIoComplete(pIrp, Status, 0); vboxUsbDdiStateRelease(pDevExt); return Status; }
static NTSTATUS vboxUsbPnPMnCancelRemoveDevice(PVBOXUSBDEV_EXT pDevExt, PIRP pIrp) { ENMVBOXUSB_PNPSTATE enmState = vboxUsbPnPStateGet(pDevExt); NTSTATUS Status = STATUS_SUCCESS; if (enmState == ENMVBOXUSB_PNPSTATE_REMOVE_PENDING) { IoCopyCurrentIrpStackLocationToNext(pIrp); Status = VBoxDrvToolIoPostSync(pDevExt->pLowerDO, pIrp); if (NT_SUCCESS(Status)) { vboxUsbPnPStateRestore(pDevExt); } } else { Assert(0); Assert(enmState == ENMVBOXUSB_PNPSTATE_STARTED); } VBoxDrvToolIoComplete(pIrp, Status, 0); vboxUsbDdiStateRelease(pDevExt); return Status; }