EFI_PARTITION_TABLE_HEADER *PrimaryHeader;\r
EFI_PARTITION_TABLE_HEADER *BackupHeader;\r
EFI_PARTITION_ENTRY *PartEntry;\r
+ EFI_PARTITION_ENTRY *Entry;\r
EFI_PARTITION_ENTRY_STATUS *PEntryStatus;\r
UINTN Index;\r
EFI_STATUS GptValidStatus;\r
//\r
// Read the EFI Partition Entries\r
//\r
- PartEntry = AllocatePool (PrimaryHeader->NumberOfPartitionEntries * sizeof (EFI_PARTITION_ENTRY));\r
+ PartEntry = AllocatePool (PrimaryHeader->NumberOfPartitionEntries * PrimaryHeader->SizeOfPartitionEntry);\r
if (PartEntry == NULL) {\r
DEBUG ((EFI_D_ERROR, "Allocate pool error\n"));\r
goto Done;\r
// Create child device handles\r
//\r
for (Index = 0; Index < PrimaryHeader->NumberOfPartitionEntries; Index++) {\r
- if (CompareGuid (&PartEntry[Index].PartitionTypeGUID, &gEfiPartTypeUnusedGuid) ||\r
+ Entry = (EFI_PARTITION_ENTRY *) ((UINT8 *) PartEntry + Index * PrimaryHeader->SizeOfPartitionEntry);\r
+ if (CompareGuid (&Entry->PartitionTypeGUID, &gEfiPartTypeUnusedGuid) ||\r
PEntryStatus[Index].OutOfRange ||\r
PEntryStatus[Index].Overlap ||\r
PEntryStatus[Index].OsSpecific\r
HdDev.PartitionNumber = (UINT32) Index + 1;\r
HdDev.MBRType = MBR_TYPE_EFI_PARTITION_TABLE_HEADER;\r
HdDev.SignatureType = SIGNATURE_TYPE_GUID;\r
- HdDev.PartitionStart = PartEntry[Index].StartingLBA;\r
- HdDev.PartitionSize = PartEntry[Index].EndingLBA - PartEntry[Index].StartingLBA + 1;\r
- CopyMem (HdDev.Signature, &PartEntry[Index].UniquePartitionGUID, sizeof (EFI_GUID));\r
+ HdDev.PartitionStart = Entry->StartingLBA;\r
+ HdDev.PartitionSize = Entry->EndingLBA - Entry->StartingLBA + 1;\r
+ CopyMem (HdDev.Signature, &Entry->UniquePartitionGUID, sizeof (EFI_GUID));\r
\r
DEBUG ((EFI_D_INFO, " Index : %d\n", (UINT32) Index));\r
DEBUG ((EFI_D_INFO, " Start LBA : %lx\n", (UINT64) HdDev.PartitionStart));\r
- DEBUG ((EFI_D_INFO, " End LBA : %lx\n", (UINT64) PartEntry[Index].EndingLBA));\r
+ DEBUG ((EFI_D_INFO, " End LBA : %lx\n", (UINT64) Entry->EndingLBA));\r
DEBUG ((EFI_D_INFO, " Partition size: %lx\n", (UINT64) HdDev.PartitionSize));\r
- DEBUG ((EFI_D_INFO, " Start : %lx", MultU64x32 (PartEntry[Index].StartingLBA, BlockSize)));\r
- DEBUG ((EFI_D_INFO, " End : %lx\n", MultU64x32 (PartEntry[Index].EndingLBA, BlockSize)));\r
+ DEBUG ((EFI_D_INFO, " Start : %lx", MultU64x32 (Entry->StartingLBA, BlockSize)));\r
+ DEBUG ((EFI_D_INFO, " End : %lx\n", MultU64x32 (Entry->EndingLBA, BlockSize)));\r
\r
Status = PartitionInstallChildHandle (\r
This,\r
BlockIo2,\r
DevicePath,\r
(EFI_DEVICE_PATH_PROTOCOL *) &HdDev,\r
- PartEntry[Index].StartingLBA,\r
- PartEntry[Index].EndingLBA,\r
+ Entry->StartingLBA,\r
+ Entry->EndingLBA,\r
BlockSize,\r
- CompareGuid(&PartEntry[Index].PartitionTypeGUID, &gEfiPartTypeSystemPartGuid)\r
+ CompareGuid(&Entry->PartitionTypeGUID, &gEfiPartTypeSystemPartGuid)\r
);\r
}\r
\r
return TRUE;\r
}\r
\r
-\r
/**\r
Restore Partition Table to its alternate place.\r
(Primary -> Backup or Backup -> Primary)\r
OUT EFI_PARTITION_ENTRY_STATUS *PEntryStatus\r
)\r
{\r
- EFI_LBA StartingLBA;\r
- EFI_LBA EndingLBA;\r
- UINTN Index1;\r
- UINTN Index2;\r
- UINT64 Attributes;\r
+ EFI_LBA StartingLBA;\r
+ EFI_LBA EndingLBA;\r
+ EFI_PARTITION_ENTRY *Entry;\r
+ UINTN Index1;\r
+ UINTN Index2;\r
\r
DEBUG ((EFI_D_INFO, " start check partition entries\n"));\r
for (Index1 = 0; Index1 < PartHeader->NumberOfPartitionEntries; Index1++) {\r
- if (CompareGuid (&PartEntry[Index1].PartitionTypeGUID, &gEfiPartTypeUnusedGuid)) {\r
+ Entry = (EFI_PARTITION_ENTRY *) ((UINT8 *) PartEntry + Index1 * PartHeader->SizeOfPartitionEntry);\r
+ if (CompareGuid (&Entry->PartitionTypeGUID, &gEfiPartTypeUnusedGuid)) {\r
continue;\r
}\r
\r
- StartingLBA = PartEntry[Index1].StartingLBA;\r
- EndingLBA = PartEntry[Index1].EndingLBA;\r
+ StartingLBA = Entry->StartingLBA;\r
+ EndingLBA = Entry->EndingLBA;\r
if (StartingLBA > EndingLBA ||\r
StartingLBA < PartHeader->FirstUsableLBA ||\r
StartingLBA > PartHeader->LastUsableLBA ||\r
continue;\r
}\r
\r
- for (Index2 = Index1 + 1; Index2 < PartHeader->NumberOfPartitionEntries; Index2++) {\r
+ if ((Entry->Attributes & BIT1) != 0) {\r
+ //\r
+ // If Bit 1 is set, this indicate that this is an OS specific GUID partition. \r
+ //\r
+ PEntryStatus[Index1].OsSpecific = TRUE;\r
+ }\r
\r
- if (CompareGuid (&PartEntry[Index2].PartitionTypeGUID, &gEfiPartTypeUnusedGuid)) {\r
+ for (Index2 = Index1 + 1; Index2 < PartHeader->NumberOfPartitionEntries; Index2++) {\r
+ Entry = (EFI_PARTITION_ENTRY *) ((UINT8 *) PartEntry + Index2 * PartHeader->SizeOfPartitionEntry);\r
+ if (CompareGuid (&Entry->PartitionTypeGUID, &gEfiPartTypeUnusedGuid)) {\r
continue;\r
}\r
\r
- if (PartEntry[Index2].EndingLBA >= StartingLBA && PartEntry[Index2].StartingLBA <= EndingLBA) {\r
+ if (Entry->EndingLBA >= StartingLBA && Entry->StartingLBA <= EndingLBA) {\r
//\r
// This region overlaps with the Index1'th region\r
//\r
PEntryStatus[Index1].Overlap = TRUE;\r
PEntryStatus[Index2].Overlap = TRUE;\r
continue;\r
-\r
}\r
}\r
-\r
- Attributes = PartEntry[Index1].Attributes;\r
- if ((Attributes & BIT1) != 0) {\r
- //\r
- // If Bit 1 is set, this indicate that this is an OS specific GUID partition. \r
- //\r
- PEntryStatus[Index1].OsSpecific = TRUE;\r
- }\r
}\r
\r
DEBUG ((EFI_D_INFO, " End check partition entries\n"));\r