VirtualBox

Changeset 79926 in vbox


Ignore:
Timestamp:
Jul 22, 2019 7:47:29 PM (6 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
132337
Message:

Main/Unattended: Older Windows ISOs (3.1 - W2K3). bugref:9151

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Main/src-server/UnattendedImpl.cpp

    r79920 r79926  
    383383     */
    384384    const char *pszVersion = NULL;
     385    const char *pszProduct = NULL;
    385386    RTVFSFILE hVfsFile;
    386387    int vrc = RTVfsFileOpen(hVfsIso, "sources/idwbinfo.txt", RTFILE_O_READ | RTFILE_O_DENY_NONE | RTFILE_O_OPEN, &hVfsFile);
     
    497498        }
    498499    }
     500    bool fClarifyProd = false;
     501    if (RT_FAILURE(vrc))
     502    {
     503        /*
     504         * Check a INF file with a DriverVer that is updated with each service pack.
     505         *      DriverVer=10/01/2002,5.2.3790.3959
     506         */
     507        vrc = RTVfsFileOpen(hVfsIso, "AMD64/HIVESYS.INF", RTFILE_O_READ | RTFILE_O_DENY_NONE | RTFILE_O_OPEN, &hVfsFile);
     508        if (RT_SUCCESS(vrc))
     509            *penmOsType = VBOXOSTYPE_WinNT_x64;
     510        else
     511        {
     512            vrc = RTVfsFileOpen(hVfsIso, "I386/HIVESYS.INF", RTFILE_O_READ | RTFILE_O_DENY_NONE | RTFILE_O_OPEN, &hVfsFile);
     513            if (RT_SUCCESS(vrc))
     514                *penmOsType = VBOXOSTYPE_WinNT;
     515        }
     516        if (RT_SUCCESS(vrc))
     517        {
     518            RTINIFILE hIniFile;
     519            vrc = RTIniFileCreateFromVfsFile(&hIniFile, hVfsFile, RTINIFILE_F_READONLY);
     520            RTVfsFileRelease(hVfsFile);
     521            if (RT_SUCCESS(vrc))
     522            {
     523                vrc = RTIniFileQueryValue(hIniFile, "Version", "DriverVer", pBuf->sz, sizeof(*pBuf), NULL);
     524                if (RT_SUCCESS(vrc))
     525                {
     526                    LogRelFlow(("Unattended: HIVESYS.INF: DriverVer=%s\n", pBuf->sz));
     527                    const char *psz = strchr(pBuf->sz, ',');
     528                    psz = psz ? psz + 1 : pBuf->sz;
     529                    if (RTStrVersionCompare(psz, "6.0.0") >= 0)
     530                        LogRel(("Unattended: HIVESYS.INF: unknown: DriverVer=%s\n", psz));
     531                    else if (RTStrVersionCompare(psz, "5.2.0") >= 0) /* W2K3, XP64 */
     532                    {
     533                        fClarifyProd = true;
     534                        *penmOsType = (VBOXOSTYPE)((*penmOsType & VBOXOSTYPE_x64) | VBOXOSTYPE_Win2k3);
     535                        if (RTStrVersionCompare(psz, "5.2.3790.3959") >= 0)
     536                            pszVersion = "sp2";
     537                        else if (RTStrVersionCompare(psz, "5.2.3790.1830") >= 0)
     538                            pszVersion = "sp1";
     539                    }
     540                    else if (RTStrVersionCompare(psz, "5.1.0") >= 0) /* XP */
     541                    {
     542                        *penmOsType = (VBOXOSTYPE)((*penmOsType & VBOXOSTYPE_x64) | VBOXOSTYPE_WinXP);
     543                        if (RTStrVersionCompare(psz, "5.1.2600.5512") >= 0)
     544                            pszVersion = "sp3";
     545                        else if (RTStrVersionCompare(psz, "5.1.2600.2180") >= 0)
     546                            pszVersion = "sp2";
     547                        else if (RTStrVersionCompare(psz, "5.1.2600.1105") >= 0)
     548                            pszVersion = "sp1";
     549                    }
     550                    else if (RTStrVersionCompare(psz, "5.0.0") >= 0)
     551                    {
     552                        *penmOsType = (VBOXOSTYPE)((*penmOsType & VBOXOSTYPE_x64) | VBOXOSTYPE_Win2k);
     553                        if (RTStrVersionCompare(psz, "5.0.2195.6717") >= 0)
     554                            pszVersion = "sp4";
     555                        else if (RTStrVersionCompare(psz, "5.0.2195.5438") >= 0)
     556                            pszVersion = "sp3";
     557                        else if (RTStrVersionCompare(psz, "5.0.2195.1620") >= 0)
     558                            pszVersion = "sp1";
     559                    }
     560                    else
     561                        LogRel(("Unattended: HIVESYS.INF: unknown: DriverVer=%s\n", psz));
     562                }
     563                RTIniFileRelease(hIniFile);
     564            }
     565        }
     566    }
     567    if (RT_FAILURE(vrc) || fClarifyProd)
     568    {
     569        /*
     570         * NT 4 and older does not have DriverVer entries, we consult the PRODSPEC.INI, which
     571         * works for NT4 & W2K. It does usually not reflect the service pack.
     572         */
     573        vrc = RTVfsFileOpen(hVfsIso, "AMD64/PRODSPEC.INI", RTFILE_O_READ | RTFILE_O_DENY_NONE | RTFILE_O_OPEN, &hVfsFile);
     574        if (RT_SUCCESS(vrc))
     575            *penmOsType = VBOXOSTYPE_WinNT_x64;
     576        else
     577        {
     578            vrc = RTVfsFileOpen(hVfsIso, "I386/PRODSPEC.INI", RTFILE_O_READ | RTFILE_O_DENY_NONE | RTFILE_O_OPEN, &hVfsFile);
     579            if (RT_SUCCESS(vrc))
     580                *penmOsType = VBOXOSTYPE_WinNT;
     581        }
     582        if (RT_SUCCESS(vrc))
     583        {
     584
     585            RTINIFILE hIniFile;
     586            vrc = RTIniFileCreateFromVfsFile(&hIniFile, hVfsFile, RTINIFILE_F_READONLY);
     587            RTVfsFileRelease(hVfsFile);
     588            if (RT_SUCCESS(vrc))
     589            {
     590                vrc = RTIniFileQueryValue(hIniFile, "Product Specification", "Version", pBuf->sz, sizeof(*pBuf), NULL);
     591                if (RT_SUCCESS(vrc))
     592                {
     593                    LogRelFlow(("Unattended: PRODSPEC.INI: Version=%s\n", pBuf->sz));
     594                    if (RTStrVersionCompare(pBuf->sz, "5.1") >= 0) /* Shipped with XP + W2K3, but version stuck at 5.0. */
     595                        LogRel(("Unattended: PRODSPEC.INI: unknown: DriverVer=%s\n", pBuf->sz));
     596                    else if (RTStrVersionCompare(pBuf->sz, "5.0") >= 0) /* 2000 */
     597                    {
     598                        vrc = RTIniFileQueryValue(hIniFile, "Product Specification", "Product", pBuf->sz, sizeof(*pBuf), NULL);
     599                        if (RT_SUCCESS(vrc) && RTStrNICmp(pBuf->sz, RT_STR_TUPLE("Windows XP")) == 0)
     600                            *penmOsType = (VBOXOSTYPE)((*penmOsType & VBOXOSTYPE_x64) | VBOXOSTYPE_WinXP);
     601                        else if (RT_SUCCESS(vrc) && RTStrNICmp(pBuf->sz, RT_STR_TUPLE("Windows Server 2003")) == 0)
     602                            *penmOsType = (VBOXOSTYPE)((*penmOsType & VBOXOSTYPE_x64) | VBOXOSTYPE_Win2k3);
     603                        else
     604                            *penmOsType = (VBOXOSTYPE)((*penmOsType & VBOXOSTYPE_x64) | VBOXOSTYPE_Win2k);
     605
     606                        if (RT_SUCCESS(vrc) && (strstr(pBuf->sz, "Server") || strstr(pBuf->sz, "server")))
     607                            pszProduct = "Server";
     608                    }
     609                    else if (RTStrVersionCompare(pBuf->sz, "4.0") >= 0) /* NT4 */
     610                        *penmOsType = VBOXOSTYPE_WinNT4;
     611                    else
     612                        LogRel(("Unattended: PRODSPEC.INI: unknown: DriverVer=%s\n", pBuf->sz));
     613
     614                    vrc = RTIniFileQueryValue(hIniFile, "Product Specification", "ProductType", pBuf->sz, sizeof(*pBuf), NULL);
     615                    if (RT_SUCCESS(vrc))
     616                        pszProduct = strcmp(pBuf->sz, "0") == 0 ? "Workstation" : /* simplification: */ "Server";
     617                }
     618                RTIniFileRelease(hIniFile);
     619            }
     620        }
     621        if (fClarifyProd)
     622            vrc = VINF_SUCCESS;
     623    }
     624    if (RT_FAILURE(vrc))
     625    {
     626        /*
     627         * NT 3.x we look at the LoadIdentifier (boot manager) string in TXTSETUP.SIF/TXT.
     628         */
     629        vrc = RTVfsFileOpen(hVfsIso, "I386/TXTSETUP.SIF", RTFILE_O_READ | RTFILE_O_DENY_NONE | RTFILE_O_OPEN, &hVfsFile);
     630        if (RT_FAILURE(vrc))
     631            vrc = RTVfsFileOpen(hVfsIso, "I386/TXTSETUP.INF", RTFILE_O_READ | RTFILE_O_DENY_NONE | RTFILE_O_OPEN, &hVfsFile);
     632        if (RT_SUCCESS(vrc))
     633        {
     634            *penmOsType = VBOXOSTYPE_WinNT;
     635
     636            RTINIFILE hIniFile;
     637            vrc = RTIniFileCreateFromVfsFile(&hIniFile, hVfsFile, RTINIFILE_F_READONLY);
     638            RTVfsFileRelease(hVfsFile);
     639            if (RT_SUCCESS(vrc))
     640            {
     641                vrc = RTIniFileQueryValue(hIniFile, "SetupData", "ProductType", pBuf->sz, sizeof(*pBuf), NULL);
     642                if (RT_SUCCESS(vrc))
     643                    pszProduct = strcmp(pBuf->sz, "0") == 0 ? "Workstation" : /* simplification: */ "Server";
     644
     645                vrc = RTIniFileQueryValue(hIniFile, "SetupData", "LoadIdentifier", pBuf->sz, sizeof(*pBuf), NULL);
     646                if (RT_SUCCESS(vrc))
     647                {
     648                    LogRelFlow(("Unattended: TXTSETUP.SIF: LoadIdentifier=%s\n", pBuf->sz));
     649                    char *psz = pBuf->sz;
     650                    while (!RT_C_IS_DIGIT(*psz) && *psz)
     651                        psz++;
     652                    char *psz2 = psz;
     653                    while (RT_C_IS_DIGIT(*psz2) || *psz2 == '.')
     654                        psz2++;
     655                    *psz2 = '\0';
     656                    if (RTStrVersionCompare(psz, "6.0") >= 0)
     657                        LogRel(("Unattended: TXTSETUP.SIF: unknown: LoadIdentifier=%s\n", pBuf->sz));
     658                    else if (RTStrVersionCompare(psz, "4.0") >= 0)
     659                        *penmOsType = VBOXOSTYPE_WinNT4;
     660                    else if (RTStrVersionCompare(psz, "3.1") >= 0)
     661                    {
     662                        *penmOsType = VBOXOSTYPE_WinNT3x;
     663                        pszVersion = psz;
     664                    }
     665                    else
     666                        LogRel(("Unattended: TXTSETUP.SIF: unknown: LoadIdentifier=%s\n", pBuf->sz));
     667                }
     668                RTIniFileRelease(hIniFile);
     669            }
     670        }
     671    }
     672
    499673    if (pszVersion)
    500674        try { mStrDetectedOSVersion = pszVersion; }
     675        catch (std::bad_alloc &) { return E_OUTOFMEMORY; }
     676    if (pszProduct)
     677        try { mStrDetectedOSFlavor = pszProduct; }
    501678        catch (std::bad_alloc &) { return E_OUTOFMEMORY; }
    502679
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