MCPcopy Create free account
hub / github.com/cgsecurity/testdisk / write_part_gpt

Function write_part_gpt

src/partgptw.c:218–312  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

216}
217
218int write_part_gpt(disk_t *disk_car, const list_part_t *list_part, const int ro, const int verbose)
219{
220 struct gpt_hdr *gpt;
221 struct gpt_ent* gpt_entries;
222 struct gpt_hdr *gpt_org;
223 struct gpt_ent* gpt_entries_org;
224 const list_part_t *element;
225 const unsigned int hdr_entries=128;
226 const unsigned int gpt_entries_size=hdr_entries*sizeof(struct gpt_ent);
227 if(ro>0)
228 return 0;
229 gpt_entries_org=(struct gpt_ent*)MALLOC(gpt_entries_size);
230 disk_car->pread(disk_car, gpt_entries_org, gpt_entries_size, 2 * disk_car->sector_size);
231
232 gpt_entries=(struct gpt_ent*)MALLOC(gpt_entries_size);
233 for(element=list_part;element!=NULL;element=element->next)
234 {
235 if(element->part->order > 0 && element->part->order <= hdr_entries)
236 {
237 partition_generate_gpt_entry(&gpt_entries[element->part->order-1],
238 element->part, disk_car, gpt_entries_org);
239 }
240 }
241 gpt=(struct gpt_hdr*)MALLOC(disk_car->sector_size);
242 gpt_org=(struct gpt_hdr*)MALLOC(disk_car->sector_size);
243 if(disk_car->pread(disk_car, gpt_org, disk_car->sector_size, disk_car->sector_size) == disk_car->sector_size)
244 guid_cpy(&gpt->hdr_guid, &gpt_org->hdr_guid);
245 else
246 efi_generate_uuid(&gpt->hdr_guid);
247
248 memcpy(gpt->hdr_sig, GPT_HDR_SIG, 8);
249 gpt->hdr_revision=le32(GPT_HDR_REVISION);
250 gpt->hdr_size=le32(92);
251 gpt->hdr_entries=le32(hdr_entries);
252 gpt->hdr_entsz=le32(sizeof(struct gpt_ent));
253 gpt->__reserved=le32(0);
254 gpt->hdr_lba_start=le64(1 + gpt_entries_size/disk_car->sector_size + 1);
255 gpt->hdr_lba_end=le64((disk_car->disk_size-1 - gpt_entries_size)/disk_car->sector_size - 1);
256 gpt->hdr_crc_table=le32(get_crc32(gpt_entries, gpt_entries_size, 0xFFFFFFFF)^0xFFFFFFFF);
257 gpt->hdr_lba_self=le64(1);
258 gpt->hdr_lba_alt=le64((disk_car->disk_size-1)/disk_car->sector_size);
259 gpt->hdr_lba_table=le64(1+1);
260 gpt->hdr_crc_self=le32(0);
261 gpt->hdr_crc_self=le32(get_crc32(gpt, le32(gpt->hdr_size), 0xFFFFFFFF)^0xFFFFFFFF);
262
263#ifdef DEBUG_GPT
264 dump2_log(gpt_entries, gpt_entries_org, gpt_entries_size);
265 dump2_log(gpt, gpt_org, disk_car->sector_size);
266#endif
267
268 if((unsigned)disk_car->pwrite(disk_car, gpt_entries, gpt_entries_size, le64(gpt->hdr_lba_table) * disk_car->sector_size) != gpt_entries_size)
269 {
270 free(gpt_org);
271 free(gpt_entries_org);
272 free(gpt);
273 free(gpt_entries);
274 return 1;
275 }

Callers

nothing calls this directly

Calls 7

MALLOCFunction · 0.85
guid_cpyFunction · 0.85
efi_generate_uuidFunction · 0.85
get_crc32Function · 0.85
dump2_logFunction · 0.85
write_part_gpt_i386Function · 0.85

Tested by

no test coverage detected