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);
        }
    }
}
Beispiel #2
0
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;
}