VirtualBox

Changeset 55906 in vbox


Ignore:
Timestamp:
May 18, 2015 12:23:31 PM (9 years ago)
Author:
vboxsync
Message:

FE/VBoxManage: Fix reading the partition table on Windows, ReadFile expects sector aligned reads for physical drives

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Frontends/VBoxManage/VBoxInternalManage.cpp

    r55020 r55906  
    761761
    762762    rc = RTFileReadAt(File, 0, &aBuffer, sizeof(aBuffer), NULL);
    763 
    764763    if (RT_FAILURE(rc))
    765764        return rc;
     
    777776        {
    778777            const char* l_ppth = (char*)partitionTableHeader;
    779             rc = strncmp(l_ppth, "EFI PART", 8);
    780             if (RT_FAILURE(rc))
     778            if (strncmp(l_ppth, "EFI PART", 8))
    781779                return VERR_INVALID_PARAMETER;
    782780
     
    813811
    814812            uint32_t currentEntry = 0;
    815             while(currentEntry<partitionsNumber)
    816             {
    817                 uint8_t partitionEntry[128];
    818 
    819                 /*partition entries begin from LBA2*/
    820                 rc = RTFileReadAt(File, 1024 + currentEntry*partitionEntrySize, &partitionEntry, partitionEntrySize, NULL);
    821 
    822                 uint64_t start = RT_MAKE_U64_FROM_U8( partitionEntry[32],
    823                                                           partitionEntry[33],
    824                                                           partitionEntry[34],
    825                                                           partitionEntry[35],
    826                                                           partitionEntry[36],
    827                                                           partitionEntry[37],
    828                                                           partitionEntry[38],
    829                                                           partitionEntry[39]
    830                                                           );
    831                 uint64_t end = RT_MAKE_U64_FROM_U8( partitionEntry[40],
    832                                                           partitionEntry[41],
    833                                                           partitionEntry[42],
    834                                                           partitionEntry[43],
    835                                                           partitionEntry[44],
    836                                                           partitionEntry[45],
    837                                                           partitionEntry[46],
    838                                                           partitionEntry[47]
    839                                                           );
     813
     814            if (partitionEntrySize * partitionsNumber > 4 * _1M)
     815            {
     816                RTMsgError("The GPT header seems corrupt because it contains too many entries");
     817                return VERR_INVALID_PARAMETER;
     818            }
     819
     820            uint8_t *pbPartTable = (uint8_t *)RTMemAllocZ(RT_ALIGN_Z(partitionEntrySize * partitionsNumber, 512));
     821            if (!pbPartTable)
     822            {
     823                RTMsgError("Allocating memory for the GPT partitions entries failed");
     824                return VERR_NO_MEMORY;
     825            }
     826
     827            /* partition entries begin from LBA2 */
     828            /** @todo r=aeichner: Reading from LBA 2 is not always correct, the header will contain the starting LBA. */
     829            rc = RTFileReadAt(File, 1024, pbPartTable, RT_ALIGN_Z(partitionEntrySize * partitionsNumber, 512), NULL);
     830            if (RT_FAILURE(rc))
     831            {
     832                RTMsgError("Reading the partition table failed");
     833                RTMemFree(pbPartTable);
     834                return rc;
     835            }
     836
     837            while (currentEntry < partitionsNumber)
     838            {
     839                uint8_t *partitionEntry = pbPartTable + currentEntry * partitionEntrySize;
     840
     841                uint64_t start = RT_MAKE_U64_FROM_U8(partitionEntry[32], partitionEntry[33], partitionEntry[34], partitionEntry[35],
     842                                                     partitionEntry[36], partitionEntry[37], partitionEntry[38], partitionEntry[39]);
     843                uint64_t end = RT_MAKE_U64_FROM_U8(partitionEntry[40], partitionEntry[41], partitionEntry[42], partitionEntry[43],
     844                                                   partitionEntry[44], partitionEntry[45], partitionEntry[46], partitionEntry[47]);
    840845
    841846                PHOSTPARTITION pCP = &pPart->aPartitions[pPart->cPartitions++];
     
    864869                ++currentEntry;
    865870            }
     871
     872            RTMemFree(pbPartTable);
    866873        }
    867874    }
Note: See TracChangeset for help on using the changeset viewer.

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