PartitionValidGptTable(), PartitionCheckGptEntry() routine will accept disk\r
partition content and validate the GPT table and GPT entry.\r
\r
-Copyright (c) 2006 - 2013, Intel Corporation. All rights reserved.<BR>\r
-This program and the accompanying materials\r
-are licensed and made available under the terms and conditions of the BSD License\r
-which accompanies this distribution. The full text of the license may be found at\r
-http://opensource.org/licenses/bsd-license.php\r
-\r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+Copyright (c) 2018 Qualcomm Datacenter Technologies, Inc.\r
+Copyright (c) 2006 - 2019, Intel Corporation. All rights reserved.<BR>\r
+SPDX-License-Identifier: BSD-2-Clause-Patent\r
\r
**/\r
\r
\r
@param[in] PartHeader Partition table header structure\r
@param[in] PartEntry The partition entry array\r
- @param[out] PEntryStatus the partition entry status array \r
+ @param[out] PEntryStatus the partition entry status array\r
recording the status of each partition\r
\r
**/\r
IN EFI_DEVICE_PATH_PROTOCOL *DevicePath\r
)\r
{\r
- EFI_STATUS Status;\r
- UINT32 BlockSize;\r
- EFI_LBA LastBlock;\r
- MASTER_BOOT_RECORD *ProtectiveMbr;\r
- 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
- HARDDRIVE_DEVICE_PATH HdDev;\r
- UINT32 MediaId;\r
+ EFI_STATUS Status;\r
+ UINT32 BlockSize;\r
+ EFI_LBA LastBlock;\r
+ MASTER_BOOT_RECORD *ProtectiveMbr;\r
+ 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
+ HARDDRIVE_DEVICE_PATH HdDev;\r
+ UINT32 MediaId;\r
+ EFI_PARTITION_INFO_PROTOCOL PartitionInfo;\r
\r
ProtectiveMbr = NULL;\r
PrimaryHeader = NULL;\r
\r
GptValidStatus = EFI_NOT_FOUND;\r
\r
+ //\r
+ // Ensure the block size can hold the MBR\r
+ //\r
+ if (BlockSize < sizeof (MASTER_BOOT_RECORD)) {\r
+ return EFI_NOT_FOUND;\r
+ }\r
+\r
//\r
// Allocate a buffer for the Protective MBR\r
//\r
}\r
\r
ZeroMem (&HdDev, sizeof (HdDev));\r
- HdDev.Header.Type = MEDIA_DEVICE_PATH;\r
- HdDev.Header.SubType = MEDIA_HARDDRIVE_DP;\r
+ HdDev.Header.Type = MEDIA_DEVICE_PATH;\r
+ HdDev.Header.SubType = MEDIA_HARDDRIVE_DP;\r
SetDevicePathNodeLength (&HdDev.Header, sizeof (HdDev));\r
\r
- HdDev.PartitionNumber = (UINT32) Index + 1;\r
- HdDev.MBRType = MBR_TYPE_EFI_PARTITION_TABLE_HEADER;\r
- HdDev.SignatureType = SIGNATURE_TYPE_GUID;\r
- HdDev.PartitionStart = Entry->StartingLBA;\r
- HdDev.PartitionSize = Entry->EndingLBA - Entry->StartingLBA + 1;\r
+ HdDev.PartitionNumber = (UINT32) Index + 1;\r
+ HdDev.MBRType = MBR_TYPE_EFI_PARTITION_TABLE_HEADER;\r
+ HdDev.SignatureType = SIGNATURE_TYPE_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
+ ZeroMem (&PartitionInfo, sizeof (EFI_PARTITION_INFO_PROTOCOL));\r
+ PartitionInfo.Revision = EFI_PARTITION_INFO_PROTOCOL_REVISION;\r
+ PartitionInfo.Type = PARTITION_TYPE_GPT;\r
+ if (CompareGuid (&Entry->PartitionTypeGUID, &gEfiPartTypeSystemPartGuid)) {\r
+ PartitionInfo.System = 1;\r
+ }\r
+ CopyMem (&PartitionInfo.Info.Gpt, Entry, sizeof (EFI_PARTITION_ENTRY));\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) Entry->EndingLBA));\r
BlockIo2,\r
DevicePath,\r
(EFI_DEVICE_PATH_PROTOCOL *) &HdDev,\r
+ &PartitionInfo,\r
Entry->StartingLBA,\r
Entry->EndingLBA,\r
BlockSize,\r
- CompareGuid(&Entry->PartitionTypeGUID, &gEfiPartTypeSystemPartGuid)\r
+ &Entry->PartitionTypeGUID\r
);\r
}\r
\r
\r
@param[in] PartHeader Partition table header structure\r
@param[in] PartEntry The partition entry array\r
- @param[out] PEntryStatus the partition entry status array \r
+ @param[out] PEntryStatus the partition entry status array\r
recording the status of each partition\r
\r
**/\r
\r
if ((Entry->Attributes & BIT1) != 0) {\r
//\r
- // If Bit 1 is set, this indicate that this is an OS specific GUID partition. \r
+ // If Bit 1 is set, this indicate that this is an OS specific GUID partition.\r
//\r
PEntryStatus[Index1].OsSpecific = TRUE;\r
}\r