VirtualBox

Ignore:
Timestamp:
May 5, 2007 1:10:33 AM (18 years ago)
Author:
vboxsync
Message:

Implemented non-IDT patching mode for windows (not used anywhere yet but useful for debugging).

Location:
trunk/src/VBox/HostDrivers/Support/win32
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/HostDrivers/Support/win32/SUPDrv-win32.cpp

    r1850 r2515  
    6565static NTSTATUS _stdcall   VBoxSupDrvClose(PDEVICE_OBJECT pDevObj, PIRP pIrp);
    6666static NTSTATUS _stdcall   VBoxSupDrvDeviceControl(PDEVICE_OBJECT pDevObj, PIRP pIrp);
     67static int                 VBoxSupDrvDeviceControlSlow(PSUPDRVDEVEXT pDevExt, PSUPDRVSESSION pSession, PIRP pIrp, PIO_STACK_LOCATION pStack);
    6768static NTSTATUS _stdcall   VBoxSupDrvNotSupportedStub(PDEVICE_OBJECT pDevObj, PIRP pIrp);
    6869static NTSTATUS            VBoxSupDrvErr2NtStatus(int rc);
     
    136137                    return STATUS_SUCCESS;
    137138                }
    138                 else
    139                     dprintf(("VBoxSupDrvGipInit failed with rc=%#x!\n", rc));
     139                dprintf(("VBoxSupDrvGipInit failed with rc=%#x!\n", rc));
     140
    140141                supdrvDeleteDevExt(pDevExt);
    141142            }
     
    272273    PIO_STACK_LOCATION  pStack = IoGetCurrentIrpStackLocation(pIrp);
    273274    PSUPDRVSESSION      pSession = (PSUPDRVSESSION)pStack->FileObject->FsContext;
    274     char               *pBuf = (char *)pIrp->AssociatedIrp.SystemBuffer; /* all requests are buffered. */
    275     unsigned            cbOut = 0;
    276     dprintf2(("VBoxSupDrvDeviceControl(%p,%p): ioctl=%#x pBuf=%p cbIn=%#x cbOut=%#x pSession=%p\n",
     275
     276#ifdef VBOX_WITHOUT_IDT_PATCHING
     277    /*
     278     * Deal with the two high-speed IOCtl that takes it's arguments from
     279     * the session and iCmd, and only returns a VBox status code.
     280     */
     281    ULONG ulCmd = pStack->Parameters.DeviceIoControl.IoControlCode;
     282    if (    ulCmd == SUP_IOCTL_FAST_DO_RAW_RUN
     283        ||  ulCmd == SUP_IOCTL_FAST_DO_HWACC_RUN
     284        ||  ulCmd == SUP_IOCTL_FAST_DO_NOP)
     285    {
     286        int rc = supdrvIOCtlFast(ulCmd, pDevExt, pSession);
     287
     288        /* Complete the I/O request. */
     289        NTSTATUS rcNt = pIrp->IoStatus.Status = STATUS_SUCCESS;
     290        pIrp->IoStatus.Information = sizeof(rc);
     291        __try
     292        {
     293            *(int *)pIrp->UserBuffer = rc;
     294        }
     295        __except(EXCEPTION_EXECUTE_HANDLER)
     296        {
     297            rcNt = pIrp->IoStatus.Status = GetExceptionCode();
     298            dprintf(("VBoxSupDrvDeviceContorl: Exception Code %#x\n", rcNt));
     299        }
     300        IoCompleteRequest(pIrp, IO_NO_INCREMENT);
     301        return rcNt;
     302    }
     303#endif /* VBOX_WITHOUT_IDT_PATCHING */
     304
     305    return VBoxSupDrvDeviceControlSlow(pDevExt, pSession, pIrp, pStack);
     306}
     307
     308
     309/**
     310 * Worker for VBoxSupDrvDeviceControl that takes the slow IOCtl functions.
     311 *
     312 * @returns NT status code.
     313 *
     314 * @param   pDevObj     Device object.
     315 * @param   pSession    The session.
     316 * @param   pIrp        Request packet.
     317 * @param   pStack      The stack location containing the DeviceControl parameters.
     318 */
     319static int VBoxSupDrvDeviceControlSlow(PSUPDRVDEVEXT pDevExt, PSUPDRVSESSION pSession, PIRP pIrp, PIO_STACK_LOCATION pStack)
     320{
     321    NTSTATUS    rcNt = STATUS_NOT_SUPPORTED;
     322    unsigned    cbOut = 0;
     323    int         rc = 0;
     324    dprintf2(("VBoxSupDrvDeviceControlSlow(%p,%p): ioctl=%#x pBuf=%p cbIn=%#x cbOut=%#x pSession=%p\n",
    277325             pDevObj, pIrp, pStack->Parameters.DeviceIoControl.IoControlCode,
    278326             pBuf, pStack->Parameters.DeviceIoControl.InputBufferLength,
    279327             pStack->Parameters.DeviceIoControl.OutputBufferLength, pSession));
    280328
    281 #ifdef __WIN64__
    282     /*
    283      * Don't allow 32-bit processes to do any I/O controls.
    284      */
    285     if (IoIs32bitProcess(pIrp))
    286     {
    287         dprintf(("VBoxSupDrvDeviceControl: returns STATUS_NOT_SUPPORTED - WOW64 req\n"));
    288         return STATUS_NOT_SUPPORTED;
    289     }
     329#ifdef __AMD64__
     330    /* Don't allow 32-bit processes to do any I/O controls. */
     331    if (!IoIs32bitProcess(pIrp))
    290332#endif
    291 
    292     int rc = supdrvIOCtl(pStack->Parameters.DeviceIoControl.IoControlCode, pDevExt, pSession,
    293                          pBuf, pStack->Parameters.DeviceIoControl.InputBufferLength,
    294                          pBuf, pStack->Parameters.DeviceIoControl.OutputBufferLength,
    295                          &cbOut);
    296 
    297     /* sanity check. */
    298     AssertMsg(cbOut <= pStack->Parameters.DeviceIoControl.OutputBufferLength,
    299               ("cbOut is too large! cbOut=%d max=%d! ioctl=%#x\n",
    300                cbOut, pStack->Parameters.DeviceIoControl.OutputBufferLength,
    301                pStack->Parameters.DeviceIoControl.IoControlCode));
    302     if (cbOut > pStack->Parameters.DeviceIoControl.OutputBufferLength)
    303         cbOut = pStack->Parameters.DeviceIoControl.OutputBufferLength;
     333    {
     334        /* Verify that it's a buffered CTL. */
     335        if ((pStack->Parameters.DeviceIoControl.IoControlCode & 0x3) == METHOD_BUFFERED)
     336        {
     337            char *pBuf = (char *)pIrp->AssociatedIrp.SystemBuffer;
     338
     339            /*
     340             * Do the job.
     341             */
     342            rc = supdrvIOCtl(pStack->Parameters.DeviceIoControl.IoControlCode, pDevExt, pSession,
     343                             pBuf, pStack->Parameters.DeviceIoControl.InputBufferLength,
     344                             pBuf, pStack->Parameters.DeviceIoControl.OutputBufferLength,
     345                             &cbOut);
     346            rcNt = VBoxSupDrvErr2NtStatus(rc);
     347
     348            /* sanity check. */
     349            AssertMsg(cbOut <= pStack->Parameters.DeviceIoControl.OutputBufferLength,
     350                      ("cbOut is too large! cbOut=%d max=%d! ioctl=%#x\n",
     351                       cbOut, pStack->Parameters.DeviceIoControl.OutputBufferLength,
     352                       pStack->Parameters.DeviceIoControl.IoControlCode));
     353            if (cbOut > pStack->Parameters.DeviceIoControl.OutputBufferLength)
     354                cbOut = pStack->Parameters.DeviceIoControl.OutputBufferLength;
     355            dprintf2(("VBoxSupDrvDeviceControlSlow: returns %#x cbOut=%d rc=%#x\n", rcNt, cbOut, rc));
     356        }
     357        else
     358            dprintf(("VBoxSupDrvDeviceControlSlow: not buffered request (%#x) - not supported\n",
     359                     pStack->Parameters.DeviceIoControl.IoControlCode));
     360    }
     361#ifdef __AMD64__
     362    else
     363        dprintf(("VBoxSupDrvDeviceControlSlow: WOW64 req - not supported\n"));
     364#endif
    304365
    305366    /* complete the request. */
    306     NTSTATUS    rcNt = pIrp->IoStatus.Status = VBoxSupDrvErr2NtStatus(rc);
    307     pIrp->IoStatus.Information = NT_SUCCESS(rcNt) ? cbOut : rc;
     367    pIrp->IoStatus.Status = rcNt;
     368    pIrp->IoStatus.Information = NT_SUCCESS(rcNt) ? cbOut : rc; /* does this rc passing actually work?!? */
    308369    IoCompleteRequest(pIrp, IO_NO_INCREMENT);
    309 
    310     dprintf2(("VBoxSupDrvDeviceControl: returns %#x cbOut=%d rc=%#x\n", rcNt, cbOut, rc));
    311370    return rcNt;
    312371}
  • trunk/src/VBox/HostDrivers/Support/win32/SUPLib-win32.cpp

    r1890 r2515  
    617617    AssertMsg(g_hDevice != INVALID_HANDLE_VALUE, ("SUPLIB not initiated successfully!\n"));
    618618    /*
    619      * Issue device iocontrol.
     619     * Issue device I/O control.
    620620     */
    621621    DWORD cbReturned = (ULONG)cbOut;
     
    624624    return suplibConvertWin32Err(GetLastError());
    625625}
     626
     627
     628#ifdef VBOX_WITHOUT_IDT_PATCHING
     629int suplibOSIOCtlFast(unsigned uFunction)
     630{
     631    /*
     632     * Issue device I/O control.
     633     */
     634    int rc = VERR_INTERNAL_ERROR;
     635    DWORD cbReturned = (ULONG)sizeof(rc);
     636    if (DeviceIoControl(g_hDevice, uFunction, NULL, 0, &rc, (DWORD)sizeof(rc), &cbReturned, NULL))
     637        return rc;
     638    return suplibConvertWin32Err(GetLastError());
     639}
     640#endif
    626641
    627642
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette