OpenCore  1.0.4
OpenCore Bootloader
Loading...
Searching...
No Matches
Gpt.c
Go to the documentation of this file.
1
22#include "Partition.h"
23
40BOOLEAN
42 IN EFI_BLOCK_IO_PROTOCOL *BlockIo,
43 IN EFI_DISK_IO_PROTOCOL *DiskIo,
44 IN EFI_LBA Lba,
45 OUT EFI_PARTITION_TABLE_HEADER *PartHeader
46 );
47
60BOOLEAN
62 IN EFI_BLOCK_IO_PROTOCOL *BlockIo,
63 IN EFI_DISK_IO_PROTOCOL *DiskIo,
64 IN EFI_PARTITION_TABLE_HEADER *PartHeader
65 );
66
79BOOLEAN
81 IN EFI_BLOCK_IO_PROTOCOL *BlockIo,
82 IN EFI_DISK_IO_PROTOCOL *DiskIo,
83 IN EFI_PARTITION_TABLE_HEADER *PartHeader
84 );
85
99VOID
101 IN EFI_PARTITION_TABLE_HEADER *PartHeader,
102 IN EFI_PARTITION_ENTRY *PartEntry,
103 OUT EFI_PARTITION_ENTRY_STATUS *PEntryStatus
104 );
105
117BOOLEAN
119 IN UINTN MaxSize,
120 IN UINTN Size,
121 IN OUT EFI_TABLE_HEADER *Hdr
122 );
123
134BOOLEAN
136 IN UINTN MaxSize,
137 IN OUT EFI_TABLE_HEADER *Hdr
138 );
139
147VOID
149 IN UINTN Size,
150 IN OUT EFI_TABLE_HEADER *Hdr
151 );
152
159VOID
161 IN OUT EFI_TABLE_HEADER *Hdr
162 );
163
185EFI_STATUS
187 IN EFI_DRIVER_BINDING_PROTOCOL *This,
188 IN EFI_HANDLE Handle,
189 IN EFI_DISK_IO_PROTOCOL *DiskIo,
190 IN EFI_DISK_IO2_PROTOCOL *DiskIo2,
191 IN EFI_BLOCK_IO_PROTOCOL *BlockIo,
192 IN EFI_BLOCK_IO2_PROTOCOL *BlockIo2,
193 IN EFI_DEVICE_PATH_PROTOCOL *DevicePath
194 )
195{
196 EFI_STATUS Status;
197 UINT32 BlockSize;
198 EFI_LBA LastBlock;
199 MASTER_BOOT_RECORD *ProtectiveMbr;
200 EFI_PARTITION_TABLE_HEADER *PrimaryHeader;
201 EFI_PARTITION_TABLE_HEADER *BackupHeader;
202 EFI_PARTITION_ENTRY *PartEntry;
203 EFI_PARTITION_ENTRY *Entry;
204 EFI_PARTITION_ENTRY_STATUS *PEntryStatus;
205 UINTN Index;
206 EFI_STATUS GptValidStatus;
207 HARDDRIVE_DEVICE_PATH HdDev;
208 UINT32 MediaId;
209 EFI_PARTITION_INFO_PROTOCOL PartitionInfo;
210 APPLE_PARTITION_INFO_PROTOCOL ApplePartitionInfo;
211
212 ProtectiveMbr = NULL;
213 PrimaryHeader = NULL;
214 BackupHeader = NULL;
215 PartEntry = NULL;
216 PEntryStatus = NULL;
217
218 BlockSize = BlockIo->Media->BlockSize;
219 LastBlock = BlockIo->Media->LastBlock;
220 MediaId = BlockIo->Media->MediaId;
221
222 DEBUG ((EFI_D_INFO, " BlockSize : %d \n", BlockSize));
223 DEBUG ((EFI_D_INFO, " LastBlock : %lx \n", LastBlock));
224
225 GptValidStatus = EFI_NOT_FOUND;
226
227 //
228 // Ensure the block size can hold the MBR
229 //
230 if (BlockSize < sizeof (MASTER_BOOT_RECORD)) {
231 return EFI_NOT_FOUND;
232 }
233
234 //
235 // Allocate a buffer for the Protective MBR
236 //
237 ProtectiveMbr = AllocatePool (BlockSize);
238 if (ProtectiveMbr == NULL) {
239 return EFI_NOT_FOUND;
240 }
241
242 //
243 // Read the Protective MBR from LBA #0
244 //
245 Status = DiskIo->ReadDisk (
246 DiskIo,
247 MediaId,
248 0,
249 BlockSize,
250 ProtectiveMbr
251 );
252 if (EFI_ERROR (Status)) {
253 GptValidStatus = Status;
254 goto Done;
255 }
256
257 //
258 // Verify that the Protective MBR is valid
259 //
260 for (Index = 0; Index < MAX_MBR_PARTITIONS; Index++) {
261 if ((ProtectiveMbr->Partition[Index].BootIndicator == 0x00) &&
262 (ProtectiveMbr->Partition[Index].OSIndicator == PMBR_GPT_PARTITION) &&
263 (UNPACK_UINT32 (ProtectiveMbr->Partition[Index].StartingLBA) == 1)
264 )
265 {
266 break;
267 }
268 }
269
270 if (Index == MAX_MBR_PARTITIONS) {
271 goto Done;
272 }
273
274 //
275 // Allocate the GPT structures
276 //
277 PrimaryHeader = AllocateZeroPool (sizeof (EFI_PARTITION_TABLE_HEADER));
278 if (PrimaryHeader == NULL) {
279 goto Done;
280 }
281
282 BackupHeader = AllocateZeroPool (sizeof (EFI_PARTITION_TABLE_HEADER));
283 if (BackupHeader == NULL) {
284 goto Done;
285 }
286
287 //
288 // Check primary and backup partition tables
289 //
290 if (!PartitionValidGptTable (BlockIo, DiskIo, PRIMARY_PART_HEADER_LBA, PrimaryHeader)) {
291 DEBUG ((EFI_D_INFO, " Not Valid primary partition table\n"));
292
293 if (!PartitionValidGptTable (BlockIo, DiskIo, LastBlock, BackupHeader)) {
294 DEBUG ((EFI_D_INFO, " Not Valid backup partition table\n"));
295 goto Done;
296 } else {
297 DEBUG ((EFI_D_INFO, " Valid backup partition table\n"));
298 DEBUG ((EFI_D_INFO, " Restore primary partition table by the backup\n"));
299 if (!PartitionRestoreGptTable (BlockIo, DiskIo, BackupHeader)) {
300 DEBUG ((EFI_D_INFO, " Restore primary partition table error\n"));
301 }
302
303 if (PartitionValidGptTable (BlockIo, DiskIo, BackupHeader->AlternateLBA, PrimaryHeader)) {
304 DEBUG ((EFI_D_INFO, " Restore backup partition table success\n"));
305 }
306 }
307 } else if (!PartitionValidGptTable (BlockIo, DiskIo, PrimaryHeader->AlternateLBA, BackupHeader)) {
308 DEBUG ((EFI_D_INFO, " Valid primary and !Valid backup partition table\n"));
309 DEBUG ((EFI_D_INFO, " Restore backup partition table by the primary\n"));
310 if (!PartitionRestoreGptTable (BlockIo, DiskIo, PrimaryHeader)) {
311 DEBUG ((EFI_D_INFO, " Restore backup partition table error\n"));
312 }
313
314 if (PartitionValidGptTable (BlockIo, DiskIo, PrimaryHeader->AlternateLBA, BackupHeader)) {
315 DEBUG ((EFI_D_INFO, " Restore backup partition table success\n"));
316 }
317 }
318
319 DEBUG ((EFI_D_INFO, " Valid primary and Valid backup partition table\n"));
320
321 //
322 // Read the EFI Partition Entries
323 //
324 PartEntry = AllocatePool (PrimaryHeader->NumberOfPartitionEntries * PrimaryHeader->SizeOfPartitionEntry);
325 if (PartEntry == NULL) {
326 DEBUG ((EFI_D_ERROR, "Allocate pool error\n"));
327 goto Done;
328 }
329
330 Status = DiskIo->ReadDisk (
331 DiskIo,
332 MediaId,
333 MultU64x32 (PrimaryHeader->PartitionEntryLBA, BlockSize),
334 PrimaryHeader->NumberOfPartitionEntries * (PrimaryHeader->SizeOfPartitionEntry),
335 PartEntry
336 );
337 if (EFI_ERROR (Status)) {
338 GptValidStatus = Status;
339 DEBUG ((EFI_D_ERROR, " Partition Entry ReadDisk error\n"));
340 goto Done;
341 }
342
343 DEBUG ((EFI_D_INFO, " Partition entries read block success\n"));
344
345 DEBUG ((EFI_D_INFO, " Number of partition entries: %d\n", PrimaryHeader->NumberOfPartitionEntries));
346
347 PEntryStatus = AllocateZeroPool (PrimaryHeader->NumberOfPartitionEntries * sizeof (EFI_PARTITION_ENTRY_STATUS));
348 if (PEntryStatus == NULL) {
349 DEBUG ((EFI_D_ERROR, "Allocate pool error\n"));
350 goto Done;
351 }
352
353 //
354 // Check the integrity of partition entries
355 //
356 PartitionCheckGptEntry (PrimaryHeader, PartEntry, PEntryStatus);
357
358 //
359 // If we got this far the GPT layout of the disk is valid and we should return true
360 //
361 GptValidStatus = EFI_SUCCESS;
362
363 //
364 // Create child device handles
365 //
366 for (Index = 0; Index < PrimaryHeader->NumberOfPartitionEntries; Index++) {
367 Entry = (EFI_PARTITION_ENTRY *)((UINT8 *)PartEntry + Index * PrimaryHeader->SizeOfPartitionEntry);
368 if (CompareGuid (&Entry->PartitionTypeGUID, &gEfiPartTypeUnusedGuid) ||
369 PEntryStatus[Index].OutOfRange ||
370 PEntryStatus[Index].Overlap ||
371 PEntryStatus[Index].OsSpecific
372 )
373 {
374 //
375 // Don't use null EFI Partition Entries, Invalid Partition Entries or OS specific
376 // partition Entries
377 //
378 continue;
379 }
380
381 ZeroMem (&HdDev, sizeof (HdDev));
382 HdDev.Header.Type = MEDIA_DEVICE_PATH;
383 HdDev.Header.SubType = MEDIA_HARDDRIVE_DP;
384 SetDevicePathNodeLength (&HdDev.Header, sizeof (HdDev));
385
386 HdDev.PartitionNumber = (UINT32)Index + 1;
387 HdDev.MBRType = MBR_TYPE_EFI_PARTITION_TABLE_HEADER;
388 HdDev.SignatureType = SIGNATURE_TYPE_GUID;
389 HdDev.PartitionStart = Entry->StartingLBA;
390 HdDev.PartitionSize = Entry->EndingLBA - Entry->StartingLBA + 1;
391 CopyMem (HdDev.Signature, &Entry->UniquePartitionGUID, sizeof (EFI_GUID));
392
393 ZeroMem (&PartitionInfo, sizeof (EFI_PARTITION_INFO_PROTOCOL));
394 PartitionInfo.Revision = EFI_PARTITION_INFO_PROTOCOL_REVISION;
395 PartitionInfo.Type = PARTITION_TYPE_GPT;
396 if (CompareGuid (&Entry->PartitionTypeGUID, &gEfiPartTypeSystemPartGuid)) {
397 PartitionInfo.System = 1;
398 }
399
400 CopyMem (&PartitionInfo.Info.Gpt, Entry, sizeof (EFI_PARTITION_ENTRY));
401
402 ZeroMem (&ApplePartitionInfo, sizeof (APPLE_PARTITION_INFO_PROTOCOL));
403 ApplePartitionInfo.Revision = APPLE_PARTITION_INFO_REVISION;
404 ApplePartitionInfo.PartitionNumber = HdDev.PartitionNumber;
405 ApplePartitionInfo.MBRType = HdDev.MBRType;
406 ApplePartitionInfo.SignatureType = HdDev.SignatureType;
407 ApplePartitionInfo.PartitionStart = HdDev.PartitionStart;
408 ApplePartitionInfo.PartitionSize = HdDev.PartitionSize;
409 ApplePartitionInfo.Attributes = PartEntry[Index].Attributes;
410 CopyMem (&ApplePartitionInfo.Signature, HdDev.Signature, sizeof (EFI_GUID));
411 CopyMem (ApplePartitionInfo.PartitionName, PartEntry[Index].PartitionName, 36 * sizeof (UINT16));
412 CopyMem (&ApplePartitionInfo.PartitionType, &PartEntry[Index].PartitionTypeGUID, sizeof (EFI_GUID));
413
414 DEBUG ((EFI_D_INFO, " Index : %d\n", (UINT32)Index));
415 DEBUG ((EFI_D_INFO, " Start LBA : %lx\n", (UINT64)HdDev.PartitionStart));
416 DEBUG ((EFI_D_INFO, " End LBA : %lx\n", (UINT64)Entry->EndingLBA));
417 DEBUG ((EFI_D_INFO, " Partition size: %lx\n", (UINT64)HdDev.PartitionSize));
418 DEBUG ((EFI_D_INFO, " Start : %lx", MultU64x32 (Entry->StartingLBA, BlockSize)));
419 DEBUG ((EFI_D_INFO, " End : %lx\n", MultU64x32 (Entry->EndingLBA, BlockSize)));
420
422 This,
423 Handle,
424 DiskIo,
425 DiskIo2,
426 BlockIo,
427 BlockIo2,
428 DevicePath,
429 (EFI_DEVICE_PATH_PROTOCOL *)&HdDev,
430 &PartitionInfo,
431 &ApplePartitionInfo,
432 Entry->StartingLBA,
433 Entry->EndingLBA,
434 BlockSize,
435 &Entry->PartitionTypeGUID
436 );
437 }
438
439 DEBUG ((EFI_D_INFO, "Prepare to Free Pool\n"));
440
441Done:
442 if (ProtectiveMbr != NULL) {
443 FreePool (ProtectiveMbr);
444 }
445
446 if (PrimaryHeader != NULL) {
447 FreePool (PrimaryHeader);
448 }
449
450 if (BackupHeader != NULL) {
451 FreePool (BackupHeader);
452 }
453
454 if (PartEntry != NULL) {
455 FreePool (PartEntry);
456 }
457
458 if (PEntryStatus != NULL) {
459 FreePool (PEntryStatus);
460 }
461
462 return GptValidStatus;
463}
464
481BOOLEAN
483 IN EFI_BLOCK_IO_PROTOCOL *BlockIo,
484 IN EFI_DISK_IO_PROTOCOL *DiskIo,
485 IN EFI_LBA Lba,
486 OUT EFI_PARTITION_TABLE_HEADER *PartHeader
487 )
488{
489 EFI_STATUS Status;
490 UINT32 BlockSize;
491 EFI_PARTITION_TABLE_HEADER *PartHdr;
492 UINT32 MediaId;
493
494 BlockSize = BlockIo->Media->BlockSize;
495 MediaId = BlockIo->Media->MediaId;
496 PartHdr = AllocateZeroPool (BlockSize);
497
498 if (PartHdr == NULL) {
499 DEBUG ((EFI_D_ERROR, "Allocate pool error\n"));
500 return FALSE;
501 }
502
503 //
504 // Read the EFI Partition Table Header
505 //
506 Status = DiskIo->ReadDisk (
507 DiskIo,
508 MediaId,
509 MultU64x32 (Lba, BlockSize),
510 BlockSize,
511 PartHdr
512 );
513 if (EFI_ERROR (Status)) {
514 FreePool (PartHdr);
515 return FALSE;
516 }
517
518 if ((PartHdr->Header.Signature != EFI_PTAB_HEADER_ID) ||
519 !PartitionCheckCrc (BlockSize, &PartHdr->Header) ||
520 (PartHdr->MyLBA != Lba) ||
521 (PartHdr->SizeOfPartitionEntry < sizeof (EFI_PARTITION_ENTRY))
522 )
523 {
524 DEBUG ((EFI_D_INFO, "Invalid efi partition table header\n"));
525 FreePool (PartHdr);
526 return FALSE;
527 }
528
529 //
530 // Ensure the NumberOfPartitionEntries * SizeOfPartitionEntry doesn't overflow.
531 //
532 if (PartHdr->NumberOfPartitionEntries > DivU64x32 (MAX_UINTN, PartHdr->SizeOfPartitionEntry)) {
533 FreePool (PartHdr);
534 return FALSE;
535 }
536
537 CopyMem (PartHeader, PartHdr, sizeof (EFI_PARTITION_TABLE_HEADER));
538 if (!PartitionCheckGptEntryArrayCRC (BlockIo, DiskIo, PartHeader)) {
539 FreePool (PartHdr);
540 return FALSE;
541 }
542
543 DEBUG ((EFI_D_INFO, " Valid efi partition table header\n"));
544 FreePool (PartHdr);
545 return TRUE;
546}
547
560BOOLEAN
562 IN EFI_BLOCK_IO_PROTOCOL *BlockIo,
563 IN EFI_DISK_IO_PROTOCOL *DiskIo,
564 IN EFI_PARTITION_TABLE_HEADER *PartHeader
565 )
566{
567 EFI_STATUS Status;
568 UINT8 *Ptr;
569 UINT32 Crc;
570 UINTN Size;
571
572 //
573 // Read the EFI Partition Entries
574 //
575 Ptr = AllocatePool (PartHeader->NumberOfPartitionEntries * PartHeader->SizeOfPartitionEntry);
576 if (Ptr == NULL) {
577 DEBUG ((EFI_D_ERROR, " Allocate pool error\n"));
578 return FALSE;
579 }
580
581 Status = DiskIo->ReadDisk (
582 DiskIo,
583 BlockIo->Media->MediaId,
584 MultU64x32 (PartHeader->PartitionEntryLBA, BlockIo->Media->BlockSize),
585 PartHeader->NumberOfPartitionEntries * PartHeader->SizeOfPartitionEntry,
586 Ptr
587 );
588 if (EFI_ERROR (Status)) {
589 FreePool (Ptr);
590 return FALSE;
591 }
592
593 Size = ((UINTN)PartHeader->NumberOfPartitionEntries) * PartHeader->SizeOfPartitionEntry;
594
595 Status = gBS->CalculateCrc32 (Ptr, Size, &Crc);
596 if (EFI_ERROR (Status)) {
597 DEBUG ((EFI_D_ERROR, "CheckPEntryArrayCRC: Crc calculation failed\n"));
598 FreePool (Ptr);
599 return FALSE;
600 }
601
602 FreePool (Ptr);
603
604 return (BOOLEAN)(PartHeader->PartitionEntryArrayCRC32 == Crc);
605}
606
619BOOLEAN
621 IN EFI_BLOCK_IO_PROTOCOL *BlockIo,
622 IN EFI_DISK_IO_PROTOCOL *DiskIo,
623 IN EFI_PARTITION_TABLE_HEADER *PartHeader
624 )
625{
626 EFI_STATUS Status;
627 UINTN BlockSize;
628 EFI_PARTITION_TABLE_HEADER *PartHdr;
629 EFI_LBA PEntryLBA;
630 UINT8 *Ptr;
631 UINT32 MediaId;
632
633 PartHdr = NULL;
634 Ptr = NULL;
635
636 BlockSize = BlockIo->Media->BlockSize;
637 MediaId = BlockIo->Media->MediaId;
638
639 PartHdr = AllocateZeroPool (BlockSize);
640
641 if (PartHdr == NULL) {
642 DEBUG ((EFI_D_ERROR, "Allocate pool error\n"));
643 return FALSE;
644 }
645
646 PEntryLBA = (PartHeader->MyLBA == PRIMARY_PART_HEADER_LBA) ? \
647 (PartHeader->LastUsableLBA + 1) : \
648 (PRIMARY_PART_HEADER_LBA + 1);
649
650 CopyMem (PartHdr, PartHeader, sizeof (EFI_PARTITION_TABLE_HEADER));
651
652 PartHdr->MyLBA = PartHeader->AlternateLBA;
653 PartHdr->AlternateLBA = PartHeader->MyLBA;
654 PartHdr->PartitionEntryLBA = PEntryLBA;
655 PartitionSetCrc ((EFI_TABLE_HEADER *)PartHdr);
656
657 Status = DiskIo->WriteDisk (
658 DiskIo,
659 MediaId,
660 MultU64x32 (PartHdr->MyLBA, (UINT32)BlockSize),
661 BlockSize,
662 PartHdr
663 );
664 if (EFI_ERROR (Status)) {
665 goto Done;
666 }
667
668 Ptr = AllocatePool (PartHeader->NumberOfPartitionEntries * PartHeader->SizeOfPartitionEntry);
669 if (Ptr == NULL) {
670 DEBUG ((EFI_D_ERROR, " Allocate pool error\n"));
671 Status = EFI_OUT_OF_RESOURCES;
672 goto Done;
673 }
674
675 Status = DiskIo->ReadDisk (
676 DiskIo,
677 MediaId,
678 MultU64x32 (PartHeader->PartitionEntryLBA, (UINT32)BlockSize),
679 PartHeader->NumberOfPartitionEntries * PartHeader->SizeOfPartitionEntry,
680 Ptr
681 );
682 if (EFI_ERROR (Status)) {
683 goto Done;
684 }
685
686 Status = DiskIo->WriteDisk (
687 DiskIo,
688 MediaId,
689 MultU64x32 (PEntryLBA, (UINT32)BlockSize),
690 PartHeader->NumberOfPartitionEntries * PartHeader->SizeOfPartitionEntry,
691 Ptr
692 );
693
694Done:
695 FreePool (PartHdr);
696
697 if (Ptr != NULL) {
698 FreePool (Ptr);
699 }
700
701 if (EFI_ERROR (Status)) {
702 return FALSE;
703 }
704
705 return TRUE;
706}
707
721VOID
723 IN EFI_PARTITION_TABLE_HEADER *PartHeader,
724 IN EFI_PARTITION_ENTRY *PartEntry,
725 OUT EFI_PARTITION_ENTRY_STATUS *PEntryStatus
726 )
727{
728 EFI_LBA StartingLBA;
729 EFI_LBA EndingLBA;
730 EFI_PARTITION_ENTRY *Entry;
731 UINTN Index1;
732 UINTN Index2;
733
734 DEBUG ((EFI_D_INFO, " start check partition entries\n"));
735 for (Index1 = 0; Index1 < PartHeader->NumberOfPartitionEntries; Index1++) {
736 Entry = (EFI_PARTITION_ENTRY *)((UINT8 *)PartEntry + Index1 * PartHeader->SizeOfPartitionEntry);
737 if (CompareGuid (&Entry->PartitionTypeGUID, &gEfiPartTypeUnusedGuid)) {
738 continue;
739 }
740
741 StartingLBA = Entry->StartingLBA;
742 EndingLBA = Entry->EndingLBA;
743 if ((StartingLBA > EndingLBA) ||
744 (StartingLBA < PartHeader->FirstUsableLBA) ||
745 (StartingLBA > PartHeader->LastUsableLBA) ||
746 (EndingLBA < PartHeader->FirstUsableLBA) ||
747 (EndingLBA > PartHeader->LastUsableLBA)
748 )
749 {
750 PEntryStatus[Index1].OutOfRange = TRUE;
751 continue;
752 }
753
754 if ((Entry->Attributes & BIT1) != 0) {
755 //
756 // If Bit 1 is set, this indicate that this is an OS specific GUID partition.
757 //
758 PEntryStatus[Index1].OsSpecific = TRUE;
759 }
760
761 for (Index2 = Index1 + 1; Index2 < PartHeader->NumberOfPartitionEntries; Index2++) {
762 Entry = (EFI_PARTITION_ENTRY *)((UINT8 *)PartEntry + Index2 * PartHeader->SizeOfPartitionEntry);
763 if (CompareGuid (&Entry->PartitionTypeGUID, &gEfiPartTypeUnusedGuid)) {
764 continue;
765 }
766
767 if ((Entry->EndingLBA >= StartingLBA) && (Entry->StartingLBA <= EndingLBA)) {
768 //
769 // This region overlaps with the Index1'th region
770 //
771 PEntryStatus[Index1].Overlap = TRUE;
772 PEntryStatus[Index2].Overlap = TRUE;
773 continue;
774 }
775 }
776 }
777
778 DEBUG ((EFI_D_INFO, " End check partition entries\n"));
779}
780
787VOID
789 IN OUT EFI_TABLE_HEADER *Hdr
790 )
791{
792 PartitionSetCrcAltSize (Hdr->HeaderSize, Hdr);
793}
794
802VOID
804 IN UINTN Size,
805 IN OUT EFI_TABLE_HEADER *Hdr
806 )
807{
808 UINT32 Crc;
809
810 Hdr->CRC32 = 0;
811 gBS->CalculateCrc32 ((UINT8 *)Hdr, Size, &Crc);
812 Hdr->CRC32 = Crc;
813}
814
825BOOLEAN
827 IN UINTN MaxSize,
828 IN OUT EFI_TABLE_HEADER *Hdr
829 )
830{
831 return PartitionCheckCrcAltSize (MaxSize, Hdr->HeaderSize, Hdr);
832}
833
845BOOLEAN
847 IN UINTN MaxSize,
848 IN UINTN Size,
849 IN OUT EFI_TABLE_HEADER *Hdr
850 )
851{
852 UINT32 Crc;
853 UINT32 OrgCrc;
854 EFI_STATUS Status;
855
856 Crc = 0;
857
858 if (Size == 0) {
859 //
860 // If header size is 0 CRC will pass so return FALSE here
861 //
862 return FALSE;
863 }
864
865 if ((MaxSize != 0) && (Size > MaxSize)) {
866 DEBUG ((EFI_D_ERROR, "CheckCrc32: Size > MaxSize\n"));
867 return FALSE;
868 }
869
870 //
871 // clear old crc from header
872 //
873 OrgCrc = Hdr->CRC32;
874 Hdr->CRC32 = 0;
875
876 Status = gBS->CalculateCrc32 ((UINT8 *)Hdr, Size, &Crc);
877 if (EFI_ERROR (Status)) {
878 DEBUG ((EFI_D_ERROR, "CheckCrc32: Crc calculation failed\n"));
879 return FALSE;
880 }
881
882 //
883 // set results
884 //
885 Hdr->CRC32 = Crc;
886
887 //
888 // return status
889 //
890 DEBUG_CODE_BEGIN ();
891 if (OrgCrc != Crc) {
892 DEBUG ((EFI_D_ERROR, "CheckCrc32: Crc check failed\n"));
893 }
894
895 DEBUG_CODE_END ();
896
897 return (BOOLEAN)(OrgCrc == Crc);
898}
UINT16 BlockSize
Definition Apm.h:32
#define APPLE_PARTITION_INFO_REVISION
SMBIOS_STRUCTURE Hdr
Definition AppleSmBios.h:51
VOID PartitionSetCrcAltSize(IN UINTN Size, IN OUT EFI_TABLE_HEADER *Hdr)
Definition Gpt.c:803
VOID PartitionCheckGptEntry(IN EFI_PARTITION_TABLE_HEADER *PartHeader, IN EFI_PARTITION_ENTRY *PartEntry, OUT EFI_PARTITION_ENTRY_STATUS *PEntryStatus)
Definition Gpt.c:722
BOOLEAN PartitionRestoreGptTable(IN EFI_BLOCK_IO_PROTOCOL *BlockIo, IN EFI_DISK_IO_PROTOCOL *DiskIo, IN EFI_PARTITION_TABLE_HEADER *PartHeader)
Definition Gpt.c:620
BOOLEAN PartitionCheckCrc(IN UINTN MaxSize, IN OUT EFI_TABLE_HEADER *Hdr)
Definition Gpt.c:826
BOOLEAN PartitionCheckGptEntryArrayCRC(IN EFI_BLOCK_IO_PROTOCOL *BlockIo, IN EFI_DISK_IO_PROTOCOL *DiskIo, IN EFI_PARTITION_TABLE_HEADER *PartHeader)
Definition Gpt.c:561
VOID PartitionSetCrc(IN OUT EFI_TABLE_HEADER *Hdr)
Definition Gpt.c:788
EFI_STATUS PartitionInstallGptChildHandles(IN EFI_DRIVER_BINDING_PROTOCOL *This, IN EFI_HANDLE Handle, IN EFI_DISK_IO_PROTOCOL *DiskIo, IN EFI_DISK_IO2_PROTOCOL *DiskIo2, IN EFI_BLOCK_IO_PROTOCOL *BlockIo, IN EFI_BLOCK_IO2_PROTOCOL *BlockIo2, IN EFI_DEVICE_PATH_PROTOCOL *DevicePath)
Definition Gpt.c:186
BOOLEAN PartitionValidGptTable(IN EFI_BLOCK_IO_PROTOCOL *BlockIo, IN EFI_DISK_IO_PROTOCOL *DiskIo, IN EFI_LBA Lba, OUT EFI_PARTITION_TABLE_HEADER *PartHeader)
Definition Gpt.c:482
BOOLEAN PartitionCheckCrcAltSize(IN UINTN MaxSize, IN UINTN Size, IN OUT EFI_TABLE_HEADER *Hdr)
Definition Gpt.c:846
DMG_SIZE_DEVICE_PATH Size
EFI_BOOT_SERVICES * gBS
APPLE_EVENT_HANDLE Handle
Definition OcTypingLib.h:45
EFI_STATUS PartitionInstallChildHandle(IN EFI_DRIVER_BINDING_PROTOCOL *This, IN EFI_HANDLE ParentHandle, IN EFI_DISK_IO_PROTOCOL *ParentDiskIo, IN EFI_DISK_IO2_PROTOCOL *ParentDiskIo2, IN EFI_BLOCK_IO_PROTOCOL *ParentBlockIo, IN EFI_BLOCK_IO2_PROTOCOL *ParentBlockIo2, IN EFI_DEVICE_PATH_PROTOCOL *ParentDevicePath, IN EFI_DEVICE_PATH_PROTOCOL *DevicePathNode, IN EFI_PARTITION_INFO_PROTOCOL *PartitionInfo, IN APPLE_PARTITION_INFO_PROTOCOL *ApplePartitionInfo, IN EFI_LBA Start, IN EFI_LBA End, IN UINT32 BlockSize, IN EFI_GUID *TypeGuid)
Definition Partition.c:1140
#define UNPACK_UINT32(a)
Definition Partition.h:96
VOID *EFIAPI CopyMem(OUT VOID *DestinationBuffer, IN CONST VOID *SourceBuffer, IN UINTN Length)
BOOLEAN EFIAPI CompareGuid(IN CONST GUID *Guid1, IN CONST GUID *Guid2)
VOID *EFIAPI ZeroMem(OUT VOID *Buffer, IN UINTN Length)
UINT64 EFIAPI MultU64x32(IN UINT64 Multiplicand, IN UINT32 Multiplier)
Definition UserMath.c:96
#define DivU64x32(x, y, z)