VirtualBox

Changeset 70146 in vbox for trunk/src/VBox


Ignore:
Timestamp:
Dec 15, 2017 2:06:56 PM (7 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
119706
Message:

VBoxGuest-win.cpp: Less TARGET_NT4 stuff, more version ifs.

Location:
trunk/src/VBox/Additions/common/VBoxGuest
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Additions/common/VBoxGuest/Makefile.kmk

    r70133 r70146  
    255255
    256256ifeq ($(KBUILD_TARGET),win)
    257 #
    258 # VBoxGuestInst - The installer.
    259 #
    260 #PROGRAMS += VBoxGuestInst
    261 VBoxGuestInst_TEMPLATE= VBoxGuestR3Exe
    262 VBoxGuestInst_SOURCES = win/VBoxGuestInst.cpp
     257 #
     258 # VBoxGuestInst - The installer.
     259 #
     260 PROGRAMS.win.x86 += VBoxGuestInstNT
     261 VBoxGuestInstNT_TEMPLATE = VBoxGuestR3Exe
     262 VBoxGuestInstNT_SOURCES = win/VBoxGuestInst.cpp
    263263endif
    264264
  • trunk/src/VBox/Additions/common/VBoxGuest/VBoxGuest-win.cpp

    r70128 r70146  
    3838#include <iprt/asm.h>
    3939#include <iprt/asm-amd64-x86.h>
     40#include <iprt/dbg.h>
    4041#include <iprt/memobj.h>
    4142#include <iprt/spinlock.h>
     
    177178RT_C_DECLS_BEGIN
    178179#ifdef TARGET_NT4
     180static NTSTATUS vgdrvNt4CreateDevice(PDRIVER_OBJECT pDrvObj, PUNICODE_STRING pRegPath);
    179181static NTSTATUS vgdrvNt4FindPciDevice(PULONG puluBusNumber, PPCI_SLOT_NUMBER puSlotNumber);
    180 static NTSTATUS vgdrvNt4CreateDevice(PDRIVER_OBJECT pDrvObj, PUNICODE_STRING pRegPath);
    181 #else
     182#endif
    182183static NTSTATUS vgdrvNtNt5PlusAddDevice(PDRIVER_OBJECT pDrvObj, PDEVICE_OBJECT pDevObj);
    183184static NTSTATUS vgdrvNtNt5PlusPnP(PDEVICE_OBJECT pDevObj, PIRP pIrp);
    184185static NTSTATUS vgdrvNtNt5PlusPower(PDEVICE_OBJECT pDevObj, PIRP pIrp);
    185186static NTSTATUS vgdrvNtNt5PlusSystemControl(PDEVICE_OBJECT pDevObj, PIRP pIrp);
    186 #endif
    187187static void     vgdrvNtUnmapVMMDevMemory(PVBOXGUESTDEVEXTWIN pDevExt);
    188188static NTSTATUS vgdrvNtCleanup(PDEVICE_OBJECT pDevObj);
     
    229229/** The detected NT (windows) version. */
    230230VGDRVNTVER g_enmVGDrvNtVer = VGDRVNTVER_INVALID;
     231/** Pointer to the PoStartNextPowerIrp routine (in the NT kernel).
     232 * Introduced in Windows 2000. */
     233static decltype(PoStartNextPowerIrp) *g_pfnPoStartNextPowerIrp = NULL;
     234/** Pointer to the PoCallDriver routine (in the NT kernel).
     235 * Introduced in Windows 2000. */
     236static decltype(PoCallDriver)        *g_pfnPoCallDriver = NULL;
    231237
    232238
     
    261267    vgdrvNtDoTests();
    262268#endif
    263     NTSTATUS rc = STATUS_SUCCESS;
     269    NTSTATUS rcNt = STATUS_SUCCESS;
    264270    switch (ulMajorVer)
    265271    {
     
    328334                else
    329335                    LogRelFunc(("Unknown version %u.%u!\n", ulMajorVer, ulMinorVer));
    330                 rc = STATUS_DRIVER_UNABLE_TO_LOAD;
     336                rcNt = STATUS_DRIVER_UNABLE_TO_LOAD;
    331337            }
    332338            break;
    333339    }
    334 
    335     if (NT_SUCCESS(rc))
     340    if (NT_SUCCESS(rcNt))
    336341    {
    337342        /*
    338          * Setup the driver entry points in pDrvObj.
     343         * Dynamically resolve symbols not present in NT4.
    339344         */
    340         pDrvObj->DriverUnload                                  = vgdrvNtUnload;
    341         pDrvObj->MajorFunction[IRP_MJ_CREATE]                  = vgdrvNtCreate;
    342         pDrvObj->MajorFunction[IRP_MJ_CLOSE]                   = vgdrvNtClose;
    343         pDrvObj->MajorFunction[IRP_MJ_DEVICE_CONTROL]          = vgdrvNtDeviceControl;
    344         pDrvObj->MajorFunction[IRP_MJ_INTERNAL_DEVICE_CONTROL] = vgdrvNtInternalIOCtl;
    345         pDrvObj->MajorFunction[IRP_MJ_SHUTDOWN]                = vgdrvNtShutdown;
    346         pDrvObj->MajorFunction[IRP_MJ_READ]                    = vgdrvNtNotSupportedStub;
    347         pDrvObj->MajorFunction[IRP_MJ_WRITE]                   = vgdrvNtNotSupportedStub;
     345        int rc;
    348346#ifdef TARGET_NT4
    349         rc = vgdrvNt4CreateDevice(pDrvObj, pRegPath);
    350 #else
    351         pDrvObj->MajorFunction[IRP_MJ_PNP]                     = vgdrvNtNt5PlusPnP;
    352         pDrvObj->MajorFunction[IRP_MJ_POWER]                   = vgdrvNtNt5PlusPower;
    353         pDrvObj->MajorFunction[IRP_MJ_SYSTEM_CONTROL]          = vgdrvNtNt5PlusSystemControl;
    354         pDrvObj->DriverExtension->AddDevice                    = (PDRIVER_ADD_DEVICE)vgdrvNtNt5PlusAddDevice;
     347        if (g_enmVGDrvNtVer <= VGDRVNTVER_WINNT4)
     348            rc = VINF_SUCCESS;
     349        else
    355350#endif
    356     }
    357 
    358     LogFlowFunc(("Returning %#x\n", rc));
    359     return rc;
     351        {
     352            RTDBGKRNLINFO hKrnlInfo;
     353            rc = RTR0DbgKrnlInfoOpen(&hKrnlInfo, 0 /*fFlags*/);
     354            if (RT_SUCCESS(rc))
     355            {
     356                int rc1 = RTR0DbgKrnlInfoQuerySymbol(hKrnlInfo, NULL, "PoCallDriver",        (void **)&g_pfnPoCallDriver);
     357                int rc2 = RTR0DbgKrnlInfoQuerySymbol(hKrnlInfo, NULL, "PoStartNextPowerIrp", (void **)&g_pfnPoStartNextPowerIrp);
     358                if (g_enmVGDrvNtVer > VGDRVNTVER_WINNT4 && RT_FAILURE(rc1))
     359                    rc = rc1;
     360                if (g_enmVGDrvNtVer > VGDRVNTVER_WINNT4 && RT_FAILURE(rc2))
     361                    rc = rc2;
     362                RTR0DbgKrnlInfoRelease(hKrnlInfo);
     363            }
     364        }
     365        if (RT_SUCCESS(rc))
     366        {
     367            /*
     368             * Setup the driver entry points in pDrvObj.
     369             */
     370            pDrvObj->DriverUnload                                  = vgdrvNtUnload;
     371            pDrvObj->MajorFunction[IRP_MJ_CREATE]                  = vgdrvNtCreate;
     372            pDrvObj->MajorFunction[IRP_MJ_CLOSE]                   = vgdrvNtClose;
     373            pDrvObj->MajorFunction[IRP_MJ_DEVICE_CONTROL]          = vgdrvNtDeviceControl;
     374            pDrvObj->MajorFunction[IRP_MJ_INTERNAL_DEVICE_CONTROL] = vgdrvNtInternalIOCtl;
     375            pDrvObj->MajorFunction[IRP_MJ_SHUTDOWN]                = vgdrvNtShutdown;
     376            pDrvObj->MajorFunction[IRP_MJ_READ]                    = vgdrvNtNotSupportedStub;
     377            pDrvObj->MajorFunction[IRP_MJ_WRITE]                   = vgdrvNtNotSupportedStub;
     378#ifdef TARGET_NT4
     379            if (g_enmVGDrvNtVer <= VGDRVNTVER_WINNT4)
     380                rcNt = vgdrvNt4CreateDevice(pDrvObj, pRegPath);
     381            else
     382#endif
     383            {
     384                pDrvObj->MajorFunction[IRP_MJ_PNP]                     = vgdrvNtNt5PlusPnP;
     385                pDrvObj->MajorFunction[IRP_MJ_POWER]                   = vgdrvNtNt5PlusPower;
     386                pDrvObj->MajorFunction[IRP_MJ_SYSTEM_CONTROL]          = vgdrvNtNt5PlusSystemControl;
     387                pDrvObj->DriverExtension->AddDevice                    = (PDRIVER_ADD_DEVICE)vgdrvNtNt5PlusAddDevice;
     388            }
     389        }
     390    }
     391
     392    LogFlowFunc(("Returning %#x\n", rcNt));
     393    return rcNt;
    360394}
    361395
     
    518552    if (!pIrp)
    519553    {
    520 #if ARCH_BITS == 32
     554#ifdef TARGET_NT4
    521555        /*
    522556         * NT4: Let's have a look at what our PCI adapter offers.
     
    536570        if (NT_SUCCESS(rcNt))
    537571            rcNt = vgdrvNtScanPCIResourceList(pResourceList, pDevExt);
    538 # else  /* ARCH_BITS != 32 */
     572# else  /* !TARGET_NT4 */
     573        AssertFailed();
    539574        RT_NOREF(pDevObj, pDrvObj, pRegPath);
    540575        rcNt = STATUS_INTERNAL_ERROR;
    541 # endif /* ARCH_BITS != 32 */
     576# endif /* !TARGET_NT4 */
    542577    }
    543578    else
     
    609644        ULONG uInterruptVector = pDevExt->uInterruptVector;
    610645        KIRQL uHandlerIrql     = (KIRQL)pDevExt->uInterruptLevel;
     646#ifdef TARGET_NT4
    611647        if (!pIrp)
    612648        {
    613 #if ARCH_BITS == 32
    614649            /* NT4: Get an interrupt vector.  Only proceed if the device provides an interrupt. */
    615650            if (   uInterruptVector
     
    628663            else
    629664                LogFunc(("Device does not provide an interrupt!\n"));
     665        }
    630666#endif
    631         }
    632667        if (uInterruptVector)
    633668        {
     
    825860}
    826861
    827 #else /* !TARGET_NT4 */
     862#endif /* TARGET_NT4 */
    828863
    829864/**
     
    877912                 * so continue to init our own things.
    878913                 */
    879 # ifdef VBOX_WITH_GUEST_BUGCHECK_DETECTION
     914#ifdef VBOX_WITH_GUEST_BUGCHECK_DETECTION
    880915                vgdrvNtBugCheckCallback(pDevExt); /* Ignore failure! */
    881 # endif
     916#endif
    882917                if (NT_SUCCESS(rc))
    883918                {
     
    9761011    PIO_STACK_LOCATION  pStack  = IoGetCurrentIrpStackLocation(pIrp);
    9771012
    978 # ifdef LOG_ENABLED
     1013#ifdef LOG_ENABLED
    9791014    static char const * const s_apszFnctName[] =
    9801015    {
     
    10061041    Log(("vgdrvNtNt5PlusPnP: MinorFunction: %s\n",
    10071042         pStack->MinorFunction < RT_ELEMENTS(s_apszFnctName) ? s_apszFnctName[pStack->MinorFunction] : "Unknown"));
    1008 # endif
     1043#endif
    10091044
    10101045    NTSTATUS rc = STATUS_SUCCESS;
     
    10881123            Log(("vgdrvNtNt5PlusPnP: QUERY_REMOVE_DEVICE\n"));
    10891124
    1090 # ifdef VBOX_REBOOT_ON_UNINSTALL
     1125#ifdef VBOX_REBOOT_ON_UNINSTALL
    10911126            Log(("vgdrvNtNt5PlusPnP: QUERY_REMOVE_DEVICE: Device cannot be removed without a reboot.\n"));
    10921127            rc = STATUS_UNSUCCESSFUL;
    1093 # endif
     1128#endif
    10941129
    10951130            if (NT_SUCCESS(rc))
     
    11841219            Log(("vgdrvNtNt5PlusPnP: QUERY_STOP_DEVICE\n"));
    11851220
    1186 # ifdef VBOX_REBOOT_ON_UNINSTALL /** @todo  r=bird: this code and log msg is pointless as rc = success and status will be overwritten below. */
     1221#ifdef VBOX_REBOOT_ON_UNINSTALL /** @todo  r=bird: this code and log msg is pointless as rc = success and status will be overwritten below. */
    11871222            Log(("vgdrvNtNt5PlusPnP: QUERY_STOP_DEVICE: Device cannot be stopped without a reboot!\n"));
    11881223            pIrp->IoStatus.Status = STATUS_UNSUCCESSFUL;
    1189 # endif
     1224#endif
    11901225
    11911226            if (NT_SUCCESS(rc))
     
    12601295static NTSTATUS vgdrvNtNt5PlusPowerComplete(IN PDEVICE_OBJECT pDevObj, IN PIRP pIrp, IN PVOID pContext)
    12611296{
    1262 # ifdef VBOX_STRICT
     1297#ifdef VBOX_STRICT
    12631298    RT_NOREF1(pDevObj);
    12641299    PVBOXGUESTDEVEXTWIN pDevExt = (PVBOXGUESTDEVEXTWIN)pContext;
     
    12931328        }
    12941329    }
    1295 # else
     1330#else
    12961331    RT_NOREF3(pDevObj, pIrp, pContext);
    1297 # endif
     1332#endif
    12981333
    12991334    return STATUS_SUCCESS;
     
    13561391                            VMMDevReqMouseStatus *pReq = NULL;
    13571392                            int vrc = VbglR0GRAlloc((VMMDevRequestHeader **)&pReq, sizeof (VMMDevReqMouseStatus),
    1358                                                   VMMDevReq_SetMouseStatus);
     1393                                                    VMMDevReq_SetMouseStatus);
    13591394                            if (RT_SUCCESS(vrc))
    13601395                            {
     
    14041439
    14051440                        case PowerActionHibernate:
    1406 
    14071441                            Log(("vgdrvNtNt5PlusPower: Power action hibernate!\n"));
    14081442                            break;
     
    14391473     * we must call PoStartNextPowerIrp.
    14401474     */
    1441     PoStartNextPowerIrp(pIrp);
     1475    g_pfnPoStartNextPowerIrp(pIrp);
    14421476
    14431477    /*
     
    14521486                           TRUE,
    14531487                           TRUE);
    1454     return PoCallDriver(pDevExt->pNextLowerDriver, pIrp);
     1488    return g_pfnPoCallDriver(pDevExt->pNextLowerDriver, pIrp);
    14551489}
    14561490
     
    14751509}
    14761510
    1477 #endif /* !TARGET_NT4 */
    14781511
    14791512
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