VirtualBox

Ignore:
Timestamp:
Sep 14, 2007 2:59:15 PM (18 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
24502
Message:

Redid the supdrv interface. works on windows and linux while the other OSes still needs some adjusting/testing. internal networking is temporarily broken as the SUPCallVMMR0Ex interface is being reworked (this is what all this is really about).

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

Legend:

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

    r4755 r4800  
    5858*   Internal Functions                                                         *
    5959*******************************************************************************/
    60 static void     _stdcall   VBoxSupDrvUnload(PDRIVER_OBJECT pDrvObj);
    61 static NTSTATUS _stdcall   VBoxSupDrvCreate(PDEVICE_OBJECT pDevObj, PIRP pIrp);
    62 static NTSTATUS _stdcall   VBoxSupDrvClose(PDEVICE_OBJECT pDevObj, PIRP pIrp);
    63 static NTSTATUS _stdcall   VBoxSupDrvDeviceControl(PDEVICE_OBJECT pDevObj, PIRP pIrp);
    64 static int                 VBoxSupDrvDeviceControlSlow(PSUPDRVDEVEXT pDevExt, PSUPDRVSESSION pSession, PIRP pIrp, PIO_STACK_LOCATION pStack);
    65 static NTSTATUS _stdcall   VBoxSupDrvNotSupportedStub(PDEVICE_OBJECT pDevObj, PIRP pIrp);
    66 static NTSTATUS            VBoxSupDrvErr2NtStatus(int rc);
    67 static NTSTATUS            VBoxSupDrvGipInit(PSUPDRVDEVEXT pDevExt);
    68 static void                VBoxSupDrvGipTerm(PSUPDRVDEVEXT pDevExt);
    69 static void     _stdcall   VBoxSupDrvGipTimer(IN PKDPC pDpc, IN PVOID pvUser, IN PVOID SystemArgument1, IN PVOID SystemArgument2);
    70 static void     _stdcall   VBoxSupDrvGipPerCpuDpc(IN PKDPC pDpc, IN PVOID pvUser, IN PVOID SystemArgument1, IN PVOID SystemArgument2);
     60static void     _stdcall   VBoxDrvNtUnload(PDRIVER_OBJECT pDrvObj);
     61static NTSTATUS _stdcall   VBoxDrvNtCreate(PDEVICE_OBJECT pDevObj, PIRP pIrp);
     62static NTSTATUS _stdcall   VBoxDrvNtClose(PDEVICE_OBJECT pDevObj, PIRP pIrp);
     63static NTSTATUS _stdcall   VBoxDrvNtDeviceControl(PDEVICE_OBJECT pDevObj, PIRP pIrp);
     64static int                 VBoxDrvNtDeviceControlSlow(PSUPDRVDEVEXT pDevExt, PSUPDRVSESSION pSession, PIRP pIrp, PIO_STACK_LOCATION pStack);
     65static NTSTATUS _stdcall   VBoxDrvNtNotSupportedStub(PDEVICE_OBJECT pDevObj, PIRP pIrp);
     66static NTSTATUS            VBoxDrvNtErr2NtStatus(int rc);
     67static NTSTATUS            VBoxDrvNtGipInit(PSUPDRVDEVEXT pDevExt);
     68static void                VBoxDrvNtGipTerm(PSUPDRVDEVEXT pDevExt);
     69static void     _stdcall   VBoxDrvNtGipTimer(IN PKDPC pDpc, IN PVOID pvUser, IN PVOID SystemArgument1, IN PVOID SystemArgument2);
     70static void     _stdcall   VBoxDrvNtGipPerCpuDpc(IN PKDPC pDpc, IN PVOID pvUser, IN PVOID SystemArgument1, IN PVOID SystemArgument2);
    7171
    7272
     
    118118                 * Inititalize the GIP.
    119119                 */
    120                 rc = VBoxSupDrvGipInit(pDevExt);
     120                rc = VBoxDrvNtGipInit(pDevExt);
    121121                if (NT_SUCCESS(rc))
    122122                {
     
    124124                     * Setup the driver entry points in pDrvObj.
    125125                     */
    126                     pDrvObj->DriverUnload                           = VBoxSupDrvUnload;
    127                     pDrvObj->MajorFunction[IRP_MJ_CREATE]           = VBoxSupDrvCreate;
    128                     pDrvObj->MajorFunction[IRP_MJ_CLOSE]            = VBoxSupDrvClose;
    129                     pDrvObj->MajorFunction[IRP_MJ_DEVICE_CONTROL]   = VBoxSupDrvDeviceControl;
    130                     pDrvObj->MajorFunction[IRP_MJ_READ]             = VBoxSupDrvNotSupportedStub;
    131                     pDrvObj->MajorFunction[IRP_MJ_WRITE]            = VBoxSupDrvNotSupportedStub;
     126                    pDrvObj->DriverUnload                           = VBoxDrvNtUnload;
     127                    pDrvObj->MajorFunction[IRP_MJ_CREATE]           = VBoxDrvNtCreate;
     128                    pDrvObj->MajorFunction[IRP_MJ_CLOSE]            = VBoxDrvNtClose;
     129                    pDrvObj->MajorFunction[IRP_MJ_DEVICE_CONTROL]   = VBoxDrvNtDeviceControl;
     130                    pDrvObj->MajorFunction[IRP_MJ_READ]             = VBoxDrvNtNotSupportedStub;
     131                    pDrvObj->MajorFunction[IRP_MJ_WRITE]            = VBoxDrvNtNotSupportedStub;
    132132                    /* more? */
    133133                    dprintf(("VBoxDrv::DriverEntry   returning STATUS_SUCCESS\n"));
    134134                    return STATUS_SUCCESS;
    135135                }
    136                 dprintf(("VBoxSupDrvGipInit failed with rc=%#x!\n", rc));
     136                dprintf(("VBoxDrvNtGipInit failed with rc=%#x!\n", rc));
    137137
    138138                supdrvDeleteDevExt(pDevExt);
     
    141141            {
    142142                dprintf(("supdrvInitDevExit failed with vrc=%d!\n", vrc));
    143                 rc = VBoxSupDrvErr2NtStatus(vrc);
     143                rc = VBoxDrvNtErr2NtStatus(vrc);
    144144            }
    145145
     
    166166 * @param   pDrvObj     Driver object.
    167167 */
    168 void _stdcall VBoxSupDrvUnload(PDRIVER_OBJECT pDrvObj)
    169 {
    170     dprintf(("VBoxSupDrvUnload\n"));
     168void _stdcall VBoxDrvNtUnload(PDRIVER_OBJECT pDrvObj)
     169{
     170    dprintf(("VBoxDrvNtUnload\n"));
    171171    PSUPDRVDEVEXT       pDevExt = (PSUPDRVDEVEXT)pDrvObj->DeviceObject->DeviceExtension;
    172172
     
    182182     * Terminate the GIP page and delete the device extension.
    183183     */
    184     VBoxSupDrvGipTerm(pDevExt);
     184    VBoxDrvNtGipTerm(pDevExt);
    185185    supdrvDeleteDevExt(pDevExt);
    186186    IoDeleteDevice(pDrvObj->DeviceObject);
     
    194194 * @param   pIrp        Request packet.
    195195 */
    196 NTSTATUS _stdcall VBoxSupDrvCreate(PDEVICE_OBJECT pDevObj, PIRP pIrp)
    197 {
    198     dprintf(("VBoxSupDrvCreate\n"));
     196NTSTATUS _stdcall VBoxDrvNtCreate(PDEVICE_OBJECT pDevObj, PIRP pIrp)
     197{
     198    dprintf(("VBoxDrvNtCreate\n"));
    199199    PIO_STACK_LOCATION  pStack = IoGetCurrentIrpStackLocation(pIrp);
    200200    PFILE_OBJECT        pFileObj = pStack->FileObject;
     
    228228    }
    229229
    230     NTSTATUS    rcNt = pIrp->IoStatus.Status = VBoxSupDrvErr2NtStatus(rc);
     230    NTSTATUS    rcNt = pIrp->IoStatus.Status = VBoxDrvNtErr2NtStatus(rc);
    231231    pIrp->IoStatus.Information  = 0;
    232232    IoCompleteRequest(pIrp, IO_NO_INCREMENT);
     
    242242 * @param   pIrp        Request packet.
    243243 */
    244 NTSTATUS _stdcall VBoxSupDrvClose(PDEVICE_OBJECT pDevObj, PIRP pIrp)
     244NTSTATUS _stdcall VBoxDrvNtClose(PDEVICE_OBJECT pDevObj, PIRP pIrp)
    245245{
    246246    PSUPDRVDEVEXT       pDevExt = (PSUPDRVDEVEXT)pDevObj->DeviceExtension;
    247247    PIO_STACK_LOCATION  pStack = IoGetCurrentIrpStackLocation(pIrp);
    248248    PFILE_OBJECT        pFileObj = pStack->FileObject;
    249     dprintf(("VBoxSupDrvClose: pDevExt=%p pFileObj=%p pSession=%p\n",
     249    dprintf(("VBoxDrvNtClose: pDevExt=%p pFileObj=%p pSession=%p\n",
    250250             pDevExt, pFileObj, pFileObj->FsContext));
    251251    supdrvCloseSession(pDevExt, (PSUPDRVSESSION)pFileObj->FsContext);
     
    265265 * @param   pIrp        Request packet.
    266266 */
    267 NTSTATUS _stdcall VBoxSupDrvDeviceControl(PDEVICE_OBJECT pDevObj, PIRP pIrp)
     267NTSTATUS _stdcall VBoxDrvNtDeviceControl(PDEVICE_OBJECT pDevObj, PIRP pIrp)
    268268{
    269269    PSUPDRVDEVEXT       pDevExt = (PSUPDRVDEVEXT)pDevObj->DeviceExtension;
     
    300300#endif /* VBOX_WITHOUT_IDT_PATCHING */
    301301
    302     return VBoxSupDrvDeviceControlSlow(pDevExt, pSession, pIrp, pStack);
    303 }
    304 
    305 
    306 /**
    307  * Worker for VBoxSupDrvDeviceControl that takes the slow IOCtl functions.
     302    return VBoxDrvNtDeviceControlSlow(pDevExt, pSession, pIrp, pStack);
     303}
     304
     305
     306/**
     307 * Worker for VBoxDrvNtDeviceControl that takes the slow IOCtl functions.
    308308 *
    309309 * @returns NT status code.
     
    314314 * @param   pStack      The stack location containing the DeviceControl parameters.
    315315 */
    316 static int VBoxSupDrvDeviceControlSlow(PSUPDRVDEVEXT pDevExt, PSUPDRVSESSION pSession, PIRP pIrp, PIO_STACK_LOCATION pStack)
    317 {
    318     NTSTATUS    rcNt = STATUS_NOT_SUPPORTED;
     316static int VBoxDrvNtDeviceControlSlow(PSUPDRVDEVEXT pDevExt, PSUPDRVSESSION pSession, PIRP pIrp, PIO_STACK_LOCATION pStack)
     317{
     318    NTSTATUS    rcNt;
    319319    unsigned    cbOut = 0;
    320320    int         rc = 0;
    321     dprintf2(("VBoxSupDrvDeviceControlSlow(%p,%p): ioctl=%#x pBuf=%p cbIn=%#x cbOut=%#x pSession=%p\n",
     321    dprintf2(("VBoxDrvNtDeviceControlSlow(%p,%p): ioctl=%#x pBuf=%p cbIn=%#x cbOut=%#x pSession=%p\n",
    322322             pDevExt, pIrp, pStack->Parameters.DeviceIoControl.IoControlCode,
    323323             pIrp->AssociatedIrp.SystemBuffer, pStack->Parameters.DeviceIoControl.InputBufferLength,
     
    332332        if ((pStack->Parameters.DeviceIoControl.IoControlCode & 0x3) == METHOD_BUFFERED)
    333333        {
    334             char *pBuf = (char *)pIrp->AssociatedIrp.SystemBuffer;
    335 
    336             /*
    337              * Do the job.
    338              */
    339             rc = supdrvIOCtl(pStack->Parameters.DeviceIoControl.IoControlCode, pDevExt, pSession,
    340                              pBuf, pStack->Parameters.DeviceIoControl.InputBufferLength,
    341                              pBuf, pStack->Parameters.DeviceIoControl.OutputBufferLength,
    342                              &cbOut);
    343             rcNt = VBoxSupDrvErr2NtStatus(rc);
    344 
    345             /* sanity check. */
    346             AssertMsg(cbOut <= pStack->Parameters.DeviceIoControl.OutputBufferLength,
    347                       ("cbOut is too large! cbOut=%d max=%d! ioctl=%#x\n",
    348                        cbOut, pStack->Parameters.DeviceIoControl.OutputBufferLength,
    349                        pStack->Parameters.DeviceIoControl.IoControlCode));
    350             if (cbOut > pStack->Parameters.DeviceIoControl.OutputBufferLength)
    351                 cbOut = pStack->Parameters.DeviceIoControl.OutputBufferLength;
    352             dprintf2(("VBoxSupDrvDeviceControlSlow: returns %#x cbOut=%d rc=%#x\n", rcNt, cbOut, rc));
     334            /* Verify that the sizes in the request header are correct. */
     335            PSUPREQHDR pHdr = (PSUPREQHDR)pIrp->AssociatedIrp.SystemBuffer;
     336            if (    pStack->Parameters.DeviceIoControl.InputBufferLength >= sizeof(*pHdr)
     337                &&  pStack->Parameters.DeviceIoControl.InputBufferLength ==  pHdr->cbIn
     338                &&  pStack->Parameters.DeviceIoControl.OutputBufferLength ==  pHdr->cbOut)
     339            {
     340                /*
     341                 * Do the job.
     342                 */
     343                rc = supdrvIOCtl(pStack->Parameters.DeviceIoControl.IoControlCode, pDevExt, pSession, pHdr);
     344                if (!rc)
     345                {
     346                    rcNt = STATUS_SUCCESS;
     347                    cbOut = pHdr->cbOut;
     348                    if (cbOut > pStack->Parameters.DeviceIoControl.OutputBufferLength)
     349                    {
     350                        cbOut = pStack->Parameters.DeviceIoControl.OutputBufferLength;
     351                        OSDBGPRINT(("VBoxDrvLinuxIOCtl: too much output! %#x > %#x; uCmd=%#x!\n",
     352                                    pHdr->cbOut, cbOut, pStack->Parameters.DeviceIoControl.IoControlCode));
     353                    }
     354                }
     355                else
     356                    rcNt = STATUS_INVALID_PARAMETER;
     357                dprintf2(("VBoxDrvNtDeviceControlSlow: returns %#x cbOut=%d rc=%#x\n", rcNt, cbOut, rc));
     358            }
     359            else
     360            {
     361                dprintf(("VBoxDrvNtDeviceControlSlow: Mismatching sizes (%#x) - Hdr=%#lx/%#lx Irp=%#lx/%#lx!\n",
     362                         pStack->Parameters.DeviceIoControl.IoControlCode,
     363                         pStack->Parameters.DeviceIoControl.InputBufferLength >= sizeof(*pHdr) ? pHdr->cbIn : 0,
     364                         pStack->Parameters.DeviceIoControl.InputBufferLength >= sizeof(*pHdr) ? pHdr->cbOut : 0,
     365                         pStack->Parameters.DeviceIoControl.InputBufferLength,
     366                         pStack->Parameters.DeviceIoControl.OutputBufferLength));
     367                rcNt = STATUS_INVALID_PARAMETER;
     368            }
    353369        }
    354370        else
    355             dprintf(("VBoxSupDrvDeviceControlSlow: not buffered request (%#x) - not supported\n",
     371        {
     372            dprintf(("VBoxDrvNtDeviceControlSlow: not buffered request (%#x) - not supported\n",
    356373                     pStack->Parameters.DeviceIoControl.IoControlCode));
     374            rcNt = STATUS_NOT_SUPPORTED;
     375        }
    357376    }
    358377#ifdef RT_ARCH_AMD64
    359378    else
    360         dprintf(("VBoxSupDrvDeviceControlSlow: WOW64 req - not supported\n"));
     379    {
     380        dprintf(("VBoxDrvNtDeviceControlSlow: WOW64 req - not supported\n"));
     381        rcNt = STATUS_NOT_SUPPORTED;
     382    }
    361383#endif
    362384
    363385    /* complete the request. */
    364386    pIrp->IoStatus.Status = rcNt;
    365     pIrp->IoStatus.Information = NT_SUCCESS(rcNt) ? cbOut : rc; /* does this rc passing actually work?!? */
     387    pIrp->IoStatus.Information = cbOut;
    366388    IoCompleteRequest(pIrp, IO_NO_INCREMENT);
    367389    return rcNt;
     
    376398 * @param   pIrp        IRP.
    377399 */
    378 NTSTATUS _stdcall VBoxSupDrvNotSupportedStub(PDEVICE_OBJECT pDevObj, PIRP pIrp)
    379 {
    380     dprintf(("VBoxSupDrvNotSupportedStub\n"));
     400NTSTATUS _stdcall VBoxDrvNtNotSupportedStub(PDEVICE_OBJECT pDevObj, PIRP pIrp)
     401{
     402    dprintf(("VBoxDrvNtNotSupportedStub\n"));
    381403    pDevObj = pDevObj;
    382404
     
    808830 * @param   pDevExt     Instance data. GIP stuff may be updated.
    809831 */
    810 static NTSTATUS VBoxSupDrvGipInit(PSUPDRVDEVEXT pDevExt)
     832static NTSTATUS VBoxDrvNtGipInit(PSUPDRVDEVEXT pDevExt)
    811833{
    812834    dprintf2(("VBoxSupDrvTermGip:\n"));
     
    850872                 */
    851873                KeInitializeTimerEx(&pDevExt->GipTimer, SynchronizationTimer);
    852                 KeInitializeDpc(&pDevExt->GipDpc, VBoxSupDrvGipTimer, pDevExt);
     874                KeInitializeDpc(&pDevExt->GipDpc, VBoxDrvNtGipTimer, pDevExt);
    853875
    854876                /*
     
    862884                for (unsigned i = 0; i < RT_ELEMENTS(pDevExt->aGipCpuDpcs); i++)
    863885                {
    864                     KeInitializeDpc(&pDevExt->aGipCpuDpcs[i], VBoxSupDrvGipPerCpuDpc, pGip);
     886                    KeInitializeDpc(&pDevExt->aGipCpuDpcs[i], VBoxDrvNtGipPerCpuDpc, pGip);
    865887                    KeSetImportanceDpc(&pDevExt->aGipCpuDpcs[i], HighImportance);
    866888                    if (pfnKeSetTargetProcessorDpc)
     
    868890                }
    869891
    870                 dprintf(("VBoxSupDrvGipInit: ulClockFreq=%ld ulClockInterval=%ld ulClockIntervalActual=%ld Phys=%x%08x\n",
     892                dprintf(("VBoxDrvNtGipInit: ulClockFreq=%ld ulClockInterval=%ld ulClockIntervalActual=%ld Phys=%x%08x\n",
    871893                         ulClockFreq, ulClockInterval, ulClockIntervalActual, Phys.HighPart, Phys.LowPart));
    872894                return STATUS_SUCCESS;
     
    898920 * @param   pDevExt     Instance data. GIP stuff may be updated.
    899921 */
    900 static void VBoxSupDrvGipTerm(PSUPDRVDEVEXT pDevExt)
     922static void VBoxDrvNtGipTerm(PSUPDRVDEVEXT pDevExt)
    901923{
    902924    dprintf(("VBoxSupDrvTermGip:\n"));
     
    941963 * The pvUser parameter is the pDevExt pointer.
    942964 */
    943 static void _stdcall VBoxSupDrvGipTimer(IN PKDPC pDpc, IN PVOID pvUser, IN PVOID SystemArgument1, IN PVOID SystemArgument2)
     965static void _stdcall VBoxDrvNtGipTimer(IN PKDPC pDpc, IN PVOID pvUser, IN PVOID SystemArgument1, IN PVOID SystemArgument2)
    944966{
    945967    PSUPDRVDEVEXT pDevExt = (PSUPDRVDEVEXT)pvUser;
     
    9821004 * The pvUser parameter is the pGip pointer.
    9831005 */
    984 static void _stdcall VBoxSupDrvGipPerCpuDpc(IN PKDPC pDpc, IN PVOID pvUser, IN PVOID SystemArgument1, IN PVOID SystemArgument2)
     1006static void _stdcall VBoxDrvNtGipPerCpuDpc(IN PKDPC pDpc, IN PVOID pvUser, IN PVOID SystemArgument1, IN PVOID SystemArgument2)
    9851007{
    9861008    PSUPGLOBALINFOPAGE pGip = (PSUPGLOBALINFOPAGE)pvUser;
     
    11731195 * @param   rc  supdrv error code (SUPDRV_ERR_* defines).
    11741196 */
    1175 static NTSTATUS     VBoxSupDrvErr2NtStatus(int rc)
     1197static NTSTATUS     VBoxDrvNtErr2NtStatus(int rc)
    11761198{
    11771199    switch (rc)
  • trunk/src/VBox/HostDrivers/Support/win/SUPLib-win.cpp

    r4071 r4800  
    2121*******************************************************************************/
    2222#define LOG_GROUP LOG_GROUP_SUP
    23 #include <windows.h>
     23#include <Windows.h>
    2424
    2525#include <VBox/sup.h>
     
    3232#include <iprt/string.h>
    3333#include "SUPLibInternal.h"
     34#include "SUPDRVIOC.h"
    3435
    3536
     
    603604 * @returns VBOX error code on failure.
    604605 * @param   uFunction   IO Control function.
    605  * @param   pvIn        Input data buffer.
    606  * @param   cbIn        Size of input data.
    607  * @param   pvOut       Output data buffer.
    608  * @param   cbOut       Size of output data.
    609  */
    610 int     suplibOsIOCtl(unsigned uFunction, void *pvIn, size_t cbIn, void *pvOut, size_t cbOut)
     606 * @param   pvIn        The request buffer.
     607 * @param   cbReq       The size of the request buffer.
     608 */
     609int suplibOsIOCtl(uintptr_t uFunction, void *pvReq, size_t cbReq)
    611610{
    612611    AssertMsg(g_hDevice != INVALID_HANDLE_VALUE, ("SUPLIB not initiated successfully!\n"));
    613     /*
    614      * Issue device I/O control.
    615      */
    616     DWORD cbReturned = (ULONG)cbOut;
    617     if (DeviceIoControl(g_hDevice, uFunction, pvIn, (ULONG)cbIn, pvOut, (ULONG)cbOut, &cbReturned, NULL))
     612
     613    /*
     614     * Issue the device I/O control.
     615     */
     616    PSUPREQHDR pHdr = (PSUPREQHDR)pvReq;
     617    Assert(cbReq == RT_MAX(pHdr->cbIn, pHdr->cbOut));
     618    DWORD cbReturned = (ULONG)pHdr->cbOut;
     619    if (DeviceIoControl(g_hDevice, uFunction, pvReq, pHdr->cbIn, pvReq, cbReturned, &cbReturned, NULL))
    618620        return 0;
     621
    619622    return suplibConvertWin32Err(GetLastError());
    620623}
Note: See TracChangeset for help on using the changeset viewer.

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