VirtualBox

Ticket #11049: vboxmanage_gpt.patch2

File vboxmanage_gpt.patch2, 11.2 KB (added by Mihai Hanor, 10 years ago)

a small modification to the original patch

Line 
1--- C:/work_x64/VirtualBox-4.3.12/src/VBox/Frontends/VBoxManage/VBoxInternalManage.cpp Fri May 16 15:25:23 2014
2+++ C:/work_x64/vbox/src/VBox/Frontends/VBoxManage/VBoxInternalManage.cpp Sun May 18 19:35:19 2014
3@@ -769,104 +769,120 @@
4 partitioningType = GPT;
5 pPart->uPartitioningType = GPT;//partitioningType;
6
7 if (aBuffer[510] != 0x55 || aBuffer[511] != 0xaa)
8 return VERR_INVALID_PARAMETER;
9
10 rc = RTFileReadAt(File, sector_size, &partitionTableHeader, sector_size, NULL);
11- if (RT_SUCCESS(rc))
12+
13+ if (RT_FAILURE(rc))
14+ return rc;
15+
16+ const char* l_ppth = (char*)partitionTableHeader;
17+ rc = strncmp(l_ppth, "EFI PART", 8);
18+ if (RT_FAILURE(rc))
19+ return VERR_INVALID_PARAMETER;
20+
21+ /** @todo check GPT Version */
22+
23+ uint64_t firstUsableLBA = RT_MAKE_U64_FROM_U8(partitionTableHeader[40],
24+ partitionTableHeader[41],
25+ partitionTableHeader[42],
26+ partitionTableHeader[43],
27+ partitionTableHeader[44],
28+ partitionTableHeader[45],
29+ partitionTableHeader[46],
30+ partitionTableHeader[47]
31+ );
32+ lastUsableLBA = RT_MAKE_U64_FROM_U8( partitionTableHeader[48],
33+ partitionTableHeader[49],
34+ partitionTableHeader[50],
35+ partitionTableHeader[51],
36+ partitionTableHeader[52],
37+ partitionTableHeader[53],
38+ partitionTableHeader[54],
39+ partitionTableHeader[55]
40+ );
41+ uint32_t partitionsNumber = RT_MAKE_U32_FROM_U8( partitionTableHeader[80],
42+ partitionTableHeader[81],
43+ partitionTableHeader[82],
44+ partitionTableHeader[83]
45+ );
46+ uint32_t partitionEntrySize = RT_MAKE_U32_FROM_U8( partitionTableHeader[84],
47+ partitionTableHeader[85],
48+ partitionTableHeader[86],
49+ partitionTableHeader[87]
50+ );
51+
52+ uint32_t currentEntry = 0;
53+ /* we must read multiple of sector size bytes; maybe we should use aBuffer[] */
54+ uint8_t aBuffer2[512];
55+ /* partition entries begin from LBA2 */
56+ uint64_t disk_offset_last = sector_size;
57+ while (currentEntry < partitionsNumber)
58 {
59- const char* l_ppth = (char*)partitionTableHeader;
60- rc = strncmp(l_ppth, "EFI PART", 8);
61- if (RT_FAILURE(rc))
62- return VERR_INVALID_PARAMETER;
63-
64- /** @todo check GPT Version */
65-
66- uint64_t firstUsableLBA = RT_MAKE_U64_FROM_U8(partitionTableHeader[40],
67- partitionTableHeader[41],
68- partitionTableHeader[42],
69- partitionTableHeader[43],
70- partitionTableHeader[44],
71- partitionTableHeader[45],
72- partitionTableHeader[46],
73- partitionTableHeader[47]
74- );
75- lastUsableLBA = RT_MAKE_U64_FROM_U8( partitionTableHeader[48],
76- partitionTableHeader[49],
77- partitionTableHeader[50],
78- partitionTableHeader[51],
79- partitionTableHeader[52],
80- partitionTableHeader[53],
81- partitionTableHeader[54],
82- partitionTableHeader[55]
83- );
84- uint32_t partitionsNumber = RT_MAKE_U32_FROM_U8( partitionTableHeader[80],
85- partitionTableHeader[81],
86- partitionTableHeader[82],
87- partitionTableHeader[83]
88- );
89- uint32_t partitionEntrySize = RT_MAKE_U32_FROM_U8( partitionTableHeader[84],
90- partitionTableHeader[85],
91- partitionTableHeader[86],
92- partitionTableHeader[87]
93- );
94+ uint64_t partitionEntry_offset = 1024 + currentEntry * partitionEntrySize;
95+ uint64_t disk_offset = (partitionEntry_offset / sector_size) * sector_size;
96+ uint64_t buffer_offset = partitionEntry_offset % sector_size;
97
98- uint32_t currentEntry = 0;
99- while(currentEntry<partitionsNumber)
100+ if (disk_offset != disk_offset_last)
101 {
102- uint8_t partitionEntry[128];
103+ rc = RTFileReadAt(File, disk_offset, &aBuffer2, sector_size, NULL);
104
105- /*partition entries begin from LBA2*/
106- rc = RTFileReadAt(File, 1024 + currentEntry*partitionEntrySize, &partitionEntry, partitionEntrySize, NULL);
107+ if (RT_FAILURE(rc))
108+ return rc;
109
110- uint64_t start = RT_MAKE_U64_FROM_U8( partitionEntry[32],
111- partitionEntry[33],
112- partitionEntry[34],
113- partitionEntry[35],
114- partitionEntry[36],
115- partitionEntry[37],
116- partitionEntry[38],
117- partitionEntry[39]
118- );
119- uint64_t end = RT_MAKE_U64_FROM_U8( partitionEntry[40],
120- partitionEntry[41],
121- partitionEntry[42],
122- partitionEntry[43],
123- partitionEntry[44],
124- partitionEntry[45],
125- partitionEntry[46],
126- partitionEntry[47]
127- );
128-
129- PHOSTPARTITION pCP = &pPart->aPartitions[pPart->cPartitions++];
130- pCP->uIndex = currentEntry + 1;
131- pCP->uType = 0;
132- pCP->uStartCylinder = 0;
133- pCP->uStartHead = 0;
134- pCP->uStartSector = 0;
135- pCP->uEndCylinder = 0;
136- pCP->uEndHead = 0;
137- pCP->uEndSector = 0;
138- pCP->uPartDataStart = 0; /* will be filled out later properly. */
139- pCP->cPartDataSectors = 0;
140- if (start==0 || end==0)
141- {
142- pCP->uIndex = 0;
143- --pPart->cPartitions;
144- break;
145- }
146- else
147- {
148- pCP->uStart = start;
149- pCP->uSize = (end +1) - start;/*+1 LBA because the last address is included*/
150- }
151+ disk_offset_last = disk_offset;
152+ }
153+
154+ uint8_t *pBuffer = aBuffer2 + buffer_offset;
155
156- ++currentEntry;
157+ uint64_t start = RT_MAKE_U64_FROM_U8( pBuffer[32],
158+ pBuffer[33],
159+ pBuffer[34],
160+ pBuffer[35],
161+ pBuffer[36],
162+ pBuffer[37],
163+ pBuffer[38],
164+ pBuffer[39]
165+ );
166+ uint64_t end = RT_MAKE_U64_FROM_U8( pBuffer[40],
167+ pBuffer[41],
168+ pBuffer[42],
169+ pBuffer[43],
170+ pBuffer[44],
171+ pBuffer[45],
172+ pBuffer[46],
173+ pBuffer[47]
174+ );
175+
176+ PHOSTPARTITION pCP = &pPart->aPartitions[pPart->cPartitions++];
177+ pCP->uIndex = currentEntry + 1;
178+ pCP->uType = 0;
179+ pCP->uStartCylinder = 0;
180+ pCP->uStartHead = 0;
181+ pCP->uStartSector = 0;
182+ pCP->uEndCylinder = 0;
183+ pCP->uEndHead = 0;
184+ pCP->uEndSector = 0;
185+ pCP->uPartDataStart = 0; /* will be filled out later properly. */
186+ pCP->cPartDataSectors = 0;
187+ if (start==0 || end==0)
188+ {
189+ pCP->uIndex = 0;
190+ --pPart->cPartitions;
191+ break;
192 }
193+ else
194+ {
195+ pCP->uStart = start;
196+ pCP->uSize = (end +1) - start; /* +1 LBA because the last address is included */
197+ }
198+
199+ ++currentEntry;
200 }
201 }
202 else
203 {
204 partitioningType = MBR;
205 pPart->uPartitioningType = MBR;//partitioningType;
206

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