DECLHIDDEN(NTSTATUS) vboxUsbDispatchPower(IN PDEVICE_OBJECT pDeviceObject, IN PIRP pIrp) { PVBOXUSBDEV_EXT pDevExt = (PVBOXUSBDEV_EXT)pDeviceObject->DeviceExtension; ENMVBOXUSB_PNPSTATE enmState = vboxUsbDdiStateRetainIfNotRemoved(pDevExt); switch (enmState) { case ENMVBOXUSB_PNPSTATE_REMOVED: { PoStartNextPowerIrp(pIrp); pIrp->IoStatus.Status = STATUS_DELETE_PENDING; pIrp->IoStatus.Information = 0; IoCompleteRequest(pIrp, IO_NO_INCREMENT); vboxUsbDdiStateRelease(pDevExt); return STATUS_DELETE_PENDING; } case ENMVBOXUSB_PNPSTATE_START_PENDING: { PoStartNextPowerIrp(pIrp); IoSkipCurrentIrpStackLocation(pIrp); vboxUsbDdiStateRelease(pDevExt); return PoCallDriver(pDevExt->pLowerDO, pIrp); } default: { return vboxUsbPwrDispatch(pDevExt, pIrp); } } }
DECLHIDDEN(NTSTATUS) vboxUsbDispatchPnP(IN PDEVICE_OBJECT pDeviceObject, IN PIRP pIrp) { PVBOXUSBDEV_EXT pDevExt = (PVBOXUSBDEV_EXT)pDeviceObject->DeviceExtension; ENMVBOXUSB_PNPSTATE enmState = vboxUsbPnPStateGet(pDevExt); if (!vboxUsbDdiStateRetainIfNotRemoved(pDevExt)) { return VBoxDrvToolIoComplete(pIrp, STATUS_DELETE_PENDING, 0); } PIO_STACK_LOCATION pSl = IoGetCurrentIrpStackLocation(pIrp); switch (pSl->MinorFunction) { case IRP_MN_START_DEVICE: { return vboxUsbPnPMnStartDevice(pDevExt, pIrp); } case IRP_MN_QUERY_STOP_DEVICE: { return vboxUsbPnPMnQueryStopDevice(pDevExt, pIrp); } case IRP_MN_STOP_DEVICE: { return vboxUsbPnPMnStopDevice(pDevExt, pIrp); } case IRP_MN_CANCEL_STOP_DEVICE: { return vboxUsbPnPMnCancelStopDevice(pDevExt, pIrp); } case IRP_MN_QUERY_REMOVE_DEVICE: { return vboxUsbPnPMnQueryRemoveDevice(pDevExt, pIrp); } case IRP_MN_REMOVE_DEVICE: { return vboxUsbPnPMnRemoveDevice(pDevExt, pIrp); } case IRP_MN_CANCEL_REMOVE_DEVICE: { return vboxUsbPnPMnCancelRemoveDevice(pDevExt, pIrp); } case IRP_MN_SURPRISE_REMOVAL: { return vboxUsbPnPMnSurpriseRemoval(pDevExt, pIrp); } case IRP_MN_QUERY_CAPABILITIES: { return vboxUsbPnPMnQueryCapabilities(pDevExt, pIrp); } default: { return vboxUsbPnPMnDefault(pDevExt, pIrp); } } }
static NTSTATUS vboxUsbDevAccessDeviedDispatchStub(IN PDEVICE_OBJECT pDeviceObject, IN PIRP pIrp) { PVBOXUSBDEV_EXT pDevExt = (PVBOXUSBDEV_EXT)pDeviceObject->DeviceExtension; if (!vboxUsbDdiStateRetainIfNotRemoved(pDevExt)) { VBoxDrvToolIoComplete(pIrp, STATUS_DELETE_PENDING, 0); return STATUS_DELETE_PENDING; } NTSTATUS Status = STATUS_ACCESS_DENIED; Status = VBoxDrvToolIoComplete(pIrp, Status, 0); vboxUsbDdiStateRelease(pDevExt); return Status; }
static NTSTATUS vboxUsbDispatchSystemControl(IN PDEVICE_OBJECT pDeviceObject, IN PIRP pIrp) { PVBOXUSBDEV_EXT pDevExt = (PVBOXUSBDEV_EXT)pDeviceObject->DeviceExtension; if (!vboxUsbDdiStateRetainIfNotRemoved(pDevExt)) { VBoxDrvToolIoComplete(pIrp, STATUS_DELETE_PENDING, 0); return STATUS_DELETE_PENDING; } IoSkipCurrentIrpStackLocation(pIrp); NTSTATUS Status = IoCallDriver(pDevExt->pLowerDO, pIrp); vboxUsbDdiStateRelease(pDevExt); return Status; }