VirtualBox

Changeset 70194 in vbox for trunk/src/VBox


Ignore:
Timestamp:
Dec 18, 2017 1:39:39 PM (7 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
119768
Message:

VBoxGuest-win.cpp: Experimental NT 3.51 support.

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

Legend:

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

    r70180 r70194  
    157157 VBoxGuest.cpp_DEFS     = VBOX_SVN_REV=$(VBOX_SVN_REV)
    158158
    159  ifeq ($(KBUILD_TARGET),win)
    160   ##
    161   ## Windows NT4 driver.
    162   ##
    163   #SYSMODS.x86 += VBoxGuestNT
    164   #VBoxGuestNT_EXTENDS = VBoxGuest
    165   #VBoxGuestNT_INSTTYPE.win = both
    166   #VBoxGuestNT_SDKS    = ReorderCompilerIncs $(VBOX_WINDDK_GST_NT4)
    167   #VBoxGuestNT_DEFS    = $(VBoxGuest_DEFS) TARGET_NT4
    168   #VBoxGuestNT_SOURCES = \
    169   #     VBoxGuest.cpp \
    170   #     VBoxGuest-$(KBUILD_TARGET).cpp \
    171   #     win/VBoxGuest.rc
    172   #VBoxGuestNT_LIBS    = \
    173   #     $(PATH_SDK_$(VBOX_WINDDK_GST_NT4)_LIB)/exsup.lib \
    174   #     $(PATH_SDK_$(VBOX_WINDDK_GST_NT4)_LIB)/ntoskrnl.lib \
    175   #     $(PATH_SDK_$(VBOX_WINDDK_GST_NT4)_LIB)/hal.lib \
    176   #     $(VBOX_LIB_VBGL_R0BASE) \
    177   #     $(VBOX_LIB_IPRT_GUEST_R0_NT4)
     159 if "$(KBUILD_TARGET)" == "win" && 1
     160  #
     161  # Windows NT 3.x driver.
     162  #
     163  SYSMODS.x86 += VBoxGuestNT3
     164  VBoxGuestNT3_EXTENDS = VBoxGuest
     165  VBoxGuestNT3_INSTTYPE.win = both
     166  VBoxGuestNT3_SDKS    = ReorderCompilerIncs $(VBOX_WINDDK_GST_NT4)
     167  VBoxGuestNT3_DEFS    = $(VBoxGuest_DEFS) TARGET_NT4 TARGET_NT3 RT_WITHOUT_NOCRT_WRAPPERS
     168  VBoxGuestNT3_SOURCES = \
     169        VBoxGuest.cpp \
     170        VBoxGuest-$(KBUILD_TARGET).cpp \
     171       ../../../Runtime/common/string/strcmp.asm \
     172       ../../../Runtime/common/string/strchr.asm \
     173       ../../../Runtime/r0drv/nt/nt3fakes-r0drv-nt.cpp \
     174       ../../../Runtime/r0drv/nt/nt3fakesA-r0drv-nt.asm \
     175        win/VBoxGuest.rc
     176  VBoxGuestNT3_LIBS    = \
     177        $(VBOX_LIB_IPRT_GUEST_R0_NT4) \
     178        $(PATH_SDK_$(VBOX_WINDDK_GST_NT4)_LIB)/exsup.lib \
     179        $(PATH_SDK_$(VBOX_WINDDK_GST_NT4)_LIB)/int64.lib \
     180        $(PATH_SDK_$(VBOX_WINDDK_GST_NT4)_LIB)/ntoskrnl.lib \
     181        $(PATH_SDK_$(VBOX_WINDDK_GST_NT4)_LIB)/hal.lib \
     182        $(VBOX_LIB_VBGL_R0BASE)
    178183 endif # win
    179184endif # enabled
  • trunk/src/VBox/Additions/common/VBoxGuest/VBoxGuest-win.cpp

    r70158 r70194  
    4949*   Defined Constants And Macros                                                                                                 *
    5050*********************************************************************************************************************************/
     51#undef ExFreePool
     52
    5153#ifndef PCI_MAX_BUSES
    5254# define PCI_MAX_BUSES 256
     
    161163{
    162164    VGDRVNTVER_INVALID = 0,
     165    VGDRVNTVER_WINNT31,
     166    VGDRVNTVER_WINNT350,
     167    VGDRVNTVER_WINNT351,
    163168    VGDRVNTVER_WINNT4,
    164169    VGDRVNTVER_WIN2K,
     
    332337            g_enmVGDrvNtVer = VGDRVNTVER_WINNT4;
    333338            break;
     339        case 3:
     340            if (ulMinorVer > 50)
     341                g_enmVGDrvNtVer = VGDRVNTVER_WINNT351;
     342            else if (ulMinorVer >= 50)
     343                g_enmVGDrvNtVer = VGDRVNTVER_WINNT350;
     344            else
     345                g_enmVGDrvNtVer = VGDRVNTVER_WINNT31;
     346            break;
    334347        default:
    335348            if (ulMajorVer > 6)
     
    426439    switch (enmNtVer)
    427440    {
     441        case VGDRVNTVER_WINNT31:
     442        case VGDRVNTVER_WINNT350:
     443        case VGDRVNTVER_WINNT351:
    428444        case VGDRVNTVER_WINNT4:
    429445            enmOsType = VBOXOSTYPE_WinNT4;
     
    505521 * @param pResourceList  list of device resources.
    506522 */
    507 static void vgdrvNtShowDeviceResources(PCM_PARTIAL_RESOURCE_LIST pResourceList)
    508 {
    509     PCM_PARTIAL_RESOURCE_DESCRIPTOR pResource = pResourceList->PartialDescriptors;
    510     ULONG cResources = pResourceList->Count;
    511 
    512     for (ULONG i = 0; i < cResources; ++i, ++pResource)
    513     {
    514         ULONG uType = pResource->Type;
    515         static char const * const s_apszName[] =
    516         {
    517             "CmResourceTypeNull",
    518             "CmResourceTypePort",
    519             "CmResourceTypeInterrupt",
    520             "CmResourceTypeMemory",
    521             "CmResourceTypeDma",
    522             "CmResourceTypeDeviceSpecific",
    523             "CmResourceTypeuBusNumber",
    524             "CmResourceTypeDevicePrivate",
    525             "CmResourceTypeAssignedResource",
    526             "CmResourceTypeSubAllocateFrom",
    527         };
    528 
    529         LogFunc(("Type=%s", uType < RT_ELEMENTS(s_apszName) ? s_apszName[uType] : "Unknown"));
    530 
    531         switch (uType)
    532         {
    533             case CmResourceTypePort:
    534             case CmResourceTypeMemory:
    535                 LogFunc(("Start %8X%8.8lX, length=%X\n",
    536                          pResource->u.Port.Start.HighPart, pResource->u.Port.Start.LowPart, pResource->u.Port.Length));
    537                 break;
    538 
    539             case CmResourceTypeInterrupt:
    540                 LogFunc(("Level=%X, vector=%X, affinity=%X\n",
    541                          pResource->u.Interrupt.Level, pResource->u.Interrupt.Vector, pResource->u.Interrupt.Affinity));
    542                 break;
    543 
    544             case CmResourceTypeDma:
    545                 LogFunc(("Channel %d, Port %X\n", pResource->u.Dma.Channel, pResource->u.Dma.Port));
    546                 break;
    547 
    548             default:
    549                 LogFunc(("\n"));
    550                 break;
     523static void vgdrvNtShowDeviceResources(PCM_RESOURCE_LIST pRsrcList)
     524{
     525    for (uint32_t iList = 0; iList < pRsrcList->Count; iList++)
     526    {
     527        PCM_FULL_RESOURCE_DESCRIPTOR pList = &pRsrcList->List[iList];
     528        LogFunc(("List #%u: InterfaceType=%#x BusNumber=%#x ListCount=%u ListRev=%#x ListVer=%#x\n",
     529                 iList, pList->InterfaceType, pList->BusNumber, pList->PartialResourceList.Count,
     530                 pList->PartialResourceList.Revision, pList->PartialResourceList.Version ));
     531
     532        PCM_PARTIAL_RESOURCE_DESCRIPTOR pResource = pList->PartialResourceList.PartialDescriptors;
     533        for (ULONG i = 0; i < pList->PartialResourceList.Count; ++i, ++pResource)
     534        {
     535            ULONG uType = pResource->Type;
     536            static char const * const s_apszName[] =
     537            {
     538                "CmResourceTypeNull",
     539                "CmResourceTypePort",
     540                "CmResourceTypeInterrupt",
     541                "CmResourceTypeMemory",
     542                "CmResourceTypeDma",
     543                "CmResourceTypeDeviceSpecific",
     544                "CmResourceTypeuBusNumber",
     545                "CmResourceTypeDevicePrivate",
     546                "CmResourceTypeAssignedResource",
     547                "CmResourceTypeSubAllocateFrom",
     548            };
     549
     550            if (uType < RT_ELEMENTS(s_apszName))
     551                LogFunc(("  %.30s Flags=%#x Share=%#x", s_apszName[uType], pResource->Flags, pResource->ShareDisposition));
     552            else
     553                LogFunc(("  Type=%#x Flags=%#x Share=%#x", uType, pResource->Flags, pResource->ShareDisposition));
     554            switch (uType)
     555            {
     556                case CmResourceTypePort:
     557                case CmResourceTypeMemory:
     558                    Log(("  Start %#RX64, length=%#x\n", pResource->u.Port.Start.QuadPart, pResource->u.Port.Length));
     559                    break;
     560
     561                case CmResourceTypeInterrupt:
     562                    Log(("  Level=%X, vector=%#x, affinity=%#x\n",
     563                             pResource->u.Interrupt.Level, pResource->u.Interrupt.Vector, pResource->u.Interrupt.Affinity));
     564                    break;
     565
     566                case CmResourceTypeDma:
     567                    Log(("  Channel %d, Port %#x\n", pResource->u.Dma.Channel, pResource->u.Dma.Port));
     568                    break;
     569
     570                default:
     571                    Log(("\n"));
     572                    break;
     573            }
    551574        }
    552575    }
     
    582605        RtlInitUnicodeString(&ClassName, L"VBoxGuestAdapter");
    583606        PCM_RESOURCE_LIST   pResourceList = NULL;
    584         rcNt = HalAssignSlotResources(pRegPath, &ClassName, pDrvObj, pDevObj,
    585                                       PCIBus, pDevExt->uBus, pDevExt->uSlot, &pResourceList);
     607        rcNt = HalAssignSlotResources(pRegPath, &ClassName, pDrvObj, pDevObj, PCIBus, pDevExt->uBus, pDevExt->uSlot,
     608                                      &pResourceList);
    586609# ifdef LOG_ENABLED
    587         if (pResourceList && pResourceList->Count > 0)
    588             vgdrvNtShowDeviceResources(&pResourceList->List[0].PartialResourceList);
     610        if (pResourceList)
     611            vgdrvNtShowDeviceResources(pResourceList);
    589612# endif
    590613        if (NT_SUCCESS(rcNt))
     614        {
    591615            rcNt = vgdrvNtScanPCIResourceList(pResourceList, pDevExt);
     616            ExFreePool(pResourceList);
     617        }
     618
    592619# else  /* !TARGET_NT4 */
    593620        AssertFailed();
     
    603630        PIO_STACK_LOCATION pStack = IoGetCurrentIrpStackLocation(pIrp);
    604631# ifdef LOG_ENABLED
    605         if (pStack->Parameters.StartDevice.AllocatedResources->Count > 0)
    606             vgdrvNtShowDeviceResources(&pStack->Parameters.StartDevice.AllocatedResources->List[0].PartialResourceList);
     632        vgdrvNtShowDeviceResources(pStack->Parameters.StartDevice.AllocatedResources);
    607633# endif
    608634        rcNt = vgdrvNtScanPCIResourceList(pStack->Parameters.StartDevice.AllocatedResourcesTranslated, pDevExt);
     
    826852 * @returns NT status code.
    827853 *
    828  * @param   puluBusNumber    Where to return the bus number on success.
    829  * @param   puSlotNumber     Where to return the slot number on success.
    830  */
    831 static NTSTATUS vgdrvNt4FindPciDevice(PULONG puluBusNumber, PPCI_SLOT_NUMBER puSlotNumber)
     854 * @param   puBus           Where to return the bus number on success.
     855 * @param   pSlot           Where to return the slot number on success.
     856 */
     857static NTSTATUS vgdrvNt4FindPciDevice(PULONG puBus, PPCI_SLOT_NUMBER pSlot)
    832858{
    833859    Log(("vgdrvNt4FindPciDevice\n"));
    834860
    835     PCI_SLOT_NUMBER uSlot;
    836     uSlot.u.AsULONG = 0;
     861    PCI_SLOT_NUMBER Slot;
     862    Slot.u.AsULONG = 0;
    837863
    838864    /* Scan each bus. */
    839     for (ULONG uluBusNumber = 0; uluBusNumber < PCI_MAX_BUSES; uluBusNumber++)
     865    for (ULONG uBus = 0; uBus < PCI_MAX_BUSES; uBus++)
    840866    {
    841867        /* Scan each device. */
    842868        for (ULONG deviceNumber = 0; deviceNumber < PCI_MAX_DEVICES; deviceNumber++)
    843869        {
    844             uSlot.u.bits.DeviceNumber = deviceNumber;
     870            Slot.u.bits.DeviceNumber = deviceNumber;
    845871
    846872            /* Scan each function (not really required...). */
    847873            for (ULONG functionNumber = 0; functionNumber < PCI_MAX_FUNCTION; functionNumber++)
    848874            {
    849                 uSlot.u.bits.FunctionNumber = functionNumber;
     875                Slot.u.bits.FunctionNumber = functionNumber;
    850876
    851877                /* Have a look at what's in this slot. */
    852878                PCI_COMMON_CONFIG PciData;
    853                 if (!HalGetBusData(PCIConfiguration, uluBusNumber, uSlot.u.AsULONG, &PciData, sizeof(ULONG)))
     879                if (!HalGetBusData(PCIConfiguration, uBus, Slot.u.AsULONG, &PciData, sizeof(ULONG)))
    854880                {
    855881                    /* No such bus, we're done with it. */
     
    868894
    869895                /* Hooray, we've found it! */
    870                 Log(("vgdrvNt4FindPciDevice: Device found!\n"));
    871 
    872                 *puluBusNumber = uluBusNumber;
    873                 *puSlotNumber  = uSlot;
     896                Log(("vgdrvNt4FindPciDevice: Device found! Bus=%#x Slot=%#u (dev %#x, fun %#x, rvd %#x)\n",
     897                     uBus, Slot.u.AsULONG, Slot.u.bits.DeviceNumber, Slot.u.bits.FunctionNumber, Slot.u.bits.Reserved));
     898
     899                *puBus  = uBus;
     900                *pSlot  = Slot;
    874901                return STATUS_SUCCESS;
    875902            }
     
    23402367                        pDevExt->cbVmmDevMemory = (ULONG)pPartialData->u.Memory.Length;
    23412368
     2369                        /* Technically we need to make the HAL translate the address.  since we
     2370                           didn't used to do this and it probably just returns the input address,
     2371                           we allow ourselves to ignore failures. */
     2372                        ULONG               uAddressSpace = 0;
     2373                        PHYSICAL_ADDRESS    PhysAddr = pPartialData->u.Memory.Start;
     2374                        if (HalTranslateBusAddress(pResList->List->InterfaceType, pResList->List->BusNumber, PhysAddr,
     2375                                                   &uAddressSpace, &PhysAddr))
     2376                        {
     2377                            Log(("HalTranslateBusAddress(%#RX64) -> %RX64, type %#x\n",
     2378                                 pPartialData->u.Memory.Start.QuadPart, PhysAddr.QuadPart, uAddressSpace));
     2379                            if (pPartialData->u.Memory.Start.QuadPart != PhysAddr.QuadPart)
     2380                                pDevExt->uVmmDevMemoryPhysAddr = PhysAddr;
     2381                        }
     2382                        else
     2383                            Log(("HalTranslateBusAddress(%#RX64) -> failed!\n", pPartialData->u.Memory.Start.QuadPart));
     2384
    23422385                        /* Save resource information. */
    23432386                        pBaseAddress->RangeStart     = pPartialData->u.Memory.Start;
  • trunk/src/VBox/Additions/common/VBoxGuest/win/VBoxGuestInst.cpp

    r70164 r70194  
    4242
    4343
    44 static int installDriver(void)
     44static int installDriver(bool fStartIt)
    4545{
    4646    /*
     
    5454    }
    5555
    56     char szDriver[MAX_PATH];
    57     GetSystemDirectory(szDriver, sizeof(szDriver));
    58     strcat(szDriver, "\\drivers\\VBoxGuest.sys");
     56    const char * const pszSlashName = (GetVersion() & 0xff) < 4 ? "\\VBoxGuestNT3.sys" : "\\VBoxGuestNT.sys";
     57    char szDriver[MAX_PATH * 2];
     58    GetCurrentDirectory(MAX_PATH, szDriver);
     59    strcat(szDriver, pszSlashName);
     60    if (GetFileAttributesA(szDriver) == INVALID_FILE_ATTRIBUTES)
     61    {
     62        GetSystemDirectory(szDriver, sizeof(szDriver));
     63        strcat(strcat(szDriver, "\\drivers"), pszSlashName);
     64    }
    5965
    6066    SC_HANDLE hService = CreateService(hSMgrCreate,
    6167                                       VBOXGUEST_SERVICE_NAME,
    6268                                       "VBoxGuest Support Driver",
    63                                        SERVICE_QUERY_STATUS,
     69                                       SERVICE_QUERY_STATUS | (fStartIt ? SERVICE_START : 0),
    6470                                       SERVICE_KERNEL_DRIVER,
    6571                                       SERVICE_BOOT_START,
     
    6874                                       "System",
    6975                                       NULL, NULL, NULL, NULL);
    70     if (!hService)
    71         printf("CreateService failed! lasterr=%d\n", GetLastError());
    72     else
     76    if (hService)
     77    {
     78        printf("Successfully created service '%s' for driver '%s'.\n", VBOXGUEST_SERVICE_NAME, szDriver);
     79        if (fStartIt)
     80        {
     81            if (StartService(hService, 0, NULL))
     82                printf("successfully started driver '%s'\n", szDriver);
     83            else
     84                printf("StartService failed: %d\n", GetLastError(), szDriver);
     85        }
    7386        CloseServiceHandle(hService);
     87    }
     88    else
     89        printf("CreateService failed! lasterr=%d (szDriver=%s)\n", GetLastError(), szDriver);
    7490    CloseServiceHandle(hSMgrCreate);
    7591    return hService ? 0 : -1;
     
    182198#endif
    183199    if (installMode)
    184         rc = installDriver();
     200        rc = installDriver(true);
    185201    else
    186202        rc = uninstallDriver();
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