Changeset 79926 in vbox
- Timestamp:
- Jul 22, 2019 7:47:29 PM (6 years ago)
- svn:sync-xref-src-repo-rev:
- 132337
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Main/src-server/UnattendedImpl.cpp
r79920 r79926 383 383 */ 384 384 const char *pszVersion = NULL; 385 const char *pszProduct = NULL; 385 386 RTVFSFILE hVfsFile; 386 387 int vrc = RTVfsFileOpen(hVfsIso, "sources/idwbinfo.txt", RTFILE_O_READ | RTFILE_O_DENY_NONE | RTFILE_O_OPEN, &hVfsFile); … … 497 498 } 498 499 } 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 499 673 if (pszVersion) 500 674 try { mStrDetectedOSVersion = pszVersion; } 675 catch (std::bad_alloc &) { return E_OUTOFMEMORY; } 676 if (pszProduct) 677 try { mStrDetectedOSFlavor = pszProduct; } 501 678 catch (std::bad_alloc &) { return E_OUTOFMEMORY; } 502 679
Note:
See TracChangeset
for help on using the changeset viewer.